平常在写shader的时候,因为shader都是由显卡来跑的,因此需要特殊的方法来排除shader内容的错误,比如大小写或者逻辑错误
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;
}
这样在CompileShader的时候添加打印日志就好了,注意要添加控制台窗口,才能看到显示输出的错误日志