opengles 3.0 hello

来源:互联网 发布:简历生活照怎么照之乎 编辑:程序博客网 时间:2024/05/22 08:19

《opengles 3.0编程指南》

#include "esUtil.h"

typedef struct
{
    GLuint programObject;
} UserData;
//创建着色器,并编译,返回着色器变量
GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
    GLuint shader;
    GLint compiled;
    //创建着色器对象
    shader = glCreateShader ( type );
    if ( shader == 0 )
    {
        return 0;
    }
    //加载
    glShaderSource ( shader, 1, &shaderSrc, NULL );
    //编译
    glCompileShader ( shader );
    //检查错误
    glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );
    if ( !compiled )
    {
        GLint infoLen = 0;
        glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
        if ( infoLen > 1 )
        {
            char *infoLog = malloc ( sizeof ( char ) * infoLen );
            glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
            esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
            free ( infoLog );
        }
        glDeleteShader ( shader );
        return 0;
    }
    return shader;
}
int Init ( ESContext *esContext )
{
    UserData *userData = esContext->userData;
    char vShaderStr[] =
            "#version 300 es                          \n"
            "layout(location = 0) in vec4 vPosition;  \n"
            "void main()                              \n"
            "{                                        \n"
            "   gl_Position = vPosition;              \n"
            "}                                        \n";
    char fShaderStr[] =
            "#version 300 es                              \n"
            "precision mediump float;                     \n"
            "out vec4 fragColor;                          \n"
            "void main()                                  \n"
            "{                                            \n"
            "   fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );  \n"
            "}                                            \n";
    GLuint vertexShader;
    GLuint fragmentShader;
    GLuint programObject;
    GLint linked;
    // 加载着色器
    vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr );
    fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr );
    // 创建着色器对象
    programObject = glCreateProgram ( );
    if ( programObject == 0 )
    {
        return 0;
    }
    // 将顶点着色器和片段着色器连接到programObject上
    glAttachShader ( programObject, vertexShader );
    glAttachShader ( programObject, fragmentShader );
    // 链接
    glLinkProgram ( programObject );
    // 检查错误
    glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
    if ( !linked )
    {
        GLint infoLen = 0;
        glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
        if ( infoLen > 1 )
        {
            char *infoLog = malloc ( sizeof ( char ) * infoLen );
            glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
            esLogMessage ( "Error linking program:\n%s\n", infoLog );
            free ( infoLog );
        }
        glDeleteProgram ( programObject );
        return FALSE;
    }
    // Store the program object
    userData->programObject = programObject;
    //将颜色缓冲区赋为白色
    glClearColor ( 1.0f, 1.0f, 1.0f, 0.0f );
    return TRUE;
}
void Draw ( ESContext *esContext )
{
    UserData *userData = esContext->userData;
    //设置顶点
    GLfloat vVertices[] = {  0.0f,  0.5f, 0.0f,
                             -0.5f, -0.5f, 0.0f,
                             0.5f, -0.5f, 0.0f
                          };
    // 设置视口
    glViewport ( 0, 0, esContext->width, esContext->height );
    // Clear the color buffer
    glClear ( GL_COLOR_BUFFER_BIT );
    // 将programObject与程序绑定
    glUseProgram ( userData->programObject );
    // 加载顶点数据
    glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
    glEnableVertexAttribArray ( 0 );
    //绘制
    glDrawArrays ( GL_TRIANGLES, 0, 3 );
}
void Shutdown ( ESContext *esContext )
{
    UserData *userData = esContext->userData;
    glDeleteProgram ( userData->programObject );
}
//入口函数 负责分配userDara,创建窗口,初始化回调     //ESContext有一个userData 将所有数据保存在这里面
int esMain ( ESContext *esContext )
{
    esContext->userData = malloc ( sizeof ( UserData ) );
    esCreateWindow ( esContext, "Hello Triangle", 320, 240, ES_WINDOW_RGB );
    if ( !Init ( esContext ) )
    {
        return GL_FALSE;
    }
    esRegisterShutdownFunc ( esContext, Shutdown );
    esRegisterDrawFunc ( esContext, Draw );
    return GL_TRUE;
}
                                             
0 0