美文网首页
OpenGL ES 3.0 Hello_Triangle

OpenGL ES 3.0 Hello_Triangle

作者: 103style | 来源:发表于2019-04-02 22:21 被阅读0次

    转载请以链接形式标明出处:
    本文出自:103style的博客

    OpenGL ES 3.0学习汇总


    Hello_Triangle

    官方源代码原始链接

    #include "esUtil.h"
    typedef struct {
        GLuint programObject;
    }TestUserData;
    
    int TestloadShader(GLenum type, const char *shaderSrc) {
        GLuint shader;
        GLuint complied;
        //创建着色器对象
        shader = glCreateShader(type);
        if (shader == 0) {
            return 0;
        }
        //加载着色器源程序
        glShaderSource(shader, 1, &shaderSrc, NULL);
        //编译着色器源程序
        glCompileShader(shader);
    
        //检查编译的状态
        glGetShaderiv(shader, GL_COMPILE_STATUS, &complied);
    
        if (!complied) {
            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 TestInit(ESContext *esContext) {
        TestUserData *userData = esContext->userData;
        char vShaderStr[] = "#version 300 es \n"
            "layout (location = 0) in vec4 vPosition; \n"
            "void main() { \n"
            "glPosition = vPosition; \n"
            "}";
        char fShaderStr[] = "#version 300 es \n"
            "precision mediump float; \n"
            "out vec4 fragColor; \n"
            "void main() { \n"
            "fragColor = vec4(1.0, 0.0, 0.0, 1.0)"
            "} ";
        GLuint vertexShader;
        GLuint fragmentShader;
        GLuint programObject;
        GLuint linked;
    
        //加载 顶点 和 片段  着色器
        vertexShader = TestloadShader(GL_VERTEX_SHADER, vShaderStr);
        fragmentShader = TestloadShader(GL_FRAGMENT_SHADER, fShaderStr);
    
        //创建程序
        programObject = glCreateProgram();
    
        if (programObject == 0) {
            return 0;
        }
    
    
        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("Eroor linking program:\n%s\n", infoLog);
    
                free(infoLog);
            }
            glDeleteProgram(programObject);
            return FALSE;
        }
    
        userData->programObject = programObject;
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        return TRUE;
    }
    
    void TestDraw(ESContext *esContext) {
        TestUserData *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);
    
        //清空颜色缓冲区
        glClear(GL_COLOR_BUFFER_BIT);
    
        //设置为活动程序
        glUseProgram(userData->programObject);
    
        //加载顶点坐标数据
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
        glEnableVertexAttribArray(0);
    
        glDrawArrays(GL_TRIANGLES, 0, 3);
    
    }
    
    void TestShutdown(ESContext *esContext) {
        TestUserData *userData = esContext->userData;
        glDeleteProgram(userData->programObject);
    }
    
    int TestesMain(ESContext *esContext) {
        esContext->userData = malloc(sizeof(TestUserData));
    
        esCreateWindow(esContext, "Hello Triangel", 800, 800, ES_WINDOW_RGB);
    
        if (!TestInit(esContext)) {
            return GL_FALSE;
        }
    
        esRegisterShutdownFunc(esContext, TestShutdown);
        esRegisterDrawFunc(esContext, TestDraw);
    
        return GL_TRUE;
    }
    

    相关文章

      网友评论

          本文标题:OpenGL ES 3.0 Hello_Triangle

          本文链接:https://www.haomeiwen.com/subject/udxobqtx.html