OpenGL ES shader 编译错误打印方法

音视频开发中,经常用OpenGL最为显示模块,OpenGL shader的编译错误有时需要打印辅助分析。下面记录一下调试打印OpenGL 或者 OpenGL ES shader 编译错误信息的方法。

直接上代码:

    glCompileShader(shader); 
    // Check compilation result
    GLint compiled = 0;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    if (compiled == GL_FALSE) {
        char szLog[1024] = { 0 }; //设置buf大小存储信息长度
         GLsizei logLen = 0;//返回的实际错误信息长度
         glGetShaderInfoLog(shader, 1024, &logLen, szLog);
         qDebug("Compile shader fail error log is :[ %s ]\n", szLog);
    }

错误提示如下:

Compile shader fail error log is :[ Vertex shader failed to compile with the following errors:
ERROR: 0:1: error(#263) "Precision qualifier" is not supported prior to GLSL version 1.30
ERROR: 0:2: error(#263) "Precision qualifier" is not supported prior to GLSL version 1.30
ERROR: error(#273) 2 compilation errors.  No code generated

 ]

参考资料:

GLuint CompileShader(GLenum shaderType, const char *shaderCode) {
    GLuint shader = glCreateShader(shaderType);
    //传入shader种类创建shader 对象 
    glShaderSource(shader, 1, &shaderCode, nullptr);
    //编译shader
    glCompileShader(shader);
    GLint compileResult = GL_TRUE;
    //查看shader状态
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
    /*
    函数原型:
        void glGetShaderiv(int shader, int pname, int[] params, int offset)
        参数含义:
        shader是一个shader的id;
        pname使用GL_COMPILE_STATUS;
        params是返回值,如果一切正常返回GL_TRUE代,否则返回GL_FALSE。
    */
    //错误日志
    if (compileResult == GL_FALSE) {
        char szLog[1024] = { 0 };
        GLsizei logLen = 0;//实际错误日志长度
        glGetShaderInfoLog(shader, 1024, &logLen, szLog);
        /*
        编译阶段使用glGetShaderInfoLog获取编译错误
        函数原型:
        String glGetShaderInfoLog (int shader)
        参数含义:
        shader是一个顶点shader或者片元shader的id。
        */
        printf("Compile shader fail error log is : %s \n shader code :\n %s \n ", szLog, shaderCode);
        glDeleteShader(shader);
        shader = 0;
    }
    return shader;
}

GLuint CreateProgram(GLuint vsShader, GLuint fsShader) {
    GLuint program = glCreateProgram();
    //将vs,fs绑定到程序上                
    glAttachShader(program, vsShader);    
    glAttachShader(program, fsShader);    
    //Link
    glLinkProgram(program); 
    GLint nResult;
    glGetProgramiv(program, GL_LINK_STATUS, &nResult);
    if (nResult == GL_FALSE) {
        char log[1024] = { 0 };
        GLsizei writed = 0;
        glGetProgramInfoLog(program, 1024, &writed, log);
        printf("Create CPU program fail error %s\n", log);
        glDeleteProgram(program);
        program = 0;}
    return program;
}

参考资料:
https://blog.csdn.net/qq_33951440/article/details/78611307


文章作者: YUV420.COM
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YUV420.COM !
评论
 上一篇
QT5.13.1 中设置 OpenGL shader GLSL版本问题 QT5.13.1 中设置 OpenGL shader GLSL版本问题
背景Opengl ES code 移植到QT平台, QT 版本是5.13.1, GLSL代码直接移植,但是必须说明版本,否则编译shader不过。 shader中添加GLSL版本信息: const char *sVertexShader =
2020-01-08
下一篇 
QT开发相关问题之打开文件对话框 QT开发相关问题之打开文件对话框
前言本页汇总了QT开发中遇到的相关问题,记录方便后期查阅。 Qt5 教程一个非常不错的QT教程https://www.bogotobogo.com/Qt/Qt5_TutorialHelloWorld.php 问题汇总打开文件获取路径获取文件
2020-01-07
  目录