音视频开发中,经常用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