为什么glGetProgramInfoLog返回一个空字符串?
问题描述:
我正在编写一个我知道编译正确的代码库。目前,我在着色器中引入了有目的的拼写错误来模拟错误。此时,代码拒绝编译。然后我可以叫为什么glGetProgramInfoLog返回一个空字符串?
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, ¶ms);
发现params
现在是108其中以前0,所以我知道有这个着色器(我曾尝试编译)相关的日志。然而,当我打电话
glGetProgramInfoLog(shader, 512, &size, ErrorLog);
size
返回0,和ErrorLog
仍然是空的。
下面是在这种情况下,重要的代码:
void Shader::AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)
{
GLuint ShaderObj = glCreateShader(ShaderType);
if (ShaderObj == 0) {
fprintf(stderr, "Error creating shader type %d\n", ShaderType);
exit(1);
}
const char* pShaderSource = readShaderSource(pShaderText);
glShaderSource(ShaderObj, 1, (const GLchar**)&pShaderSource, NULL);
glCompileShader(ShaderObj);
checkCompileError(ShaderObj, ShaderType);
glAttachShader(ShaderProgram, ShaderObj);
}
bool Shader::checkCompileError(GLuint shader, GLenum ShaderType)
{
GLint params = -1;
GLchar ErrorLog[512] = { 0 };
GLint size = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, ¶ms);
if (GL_TRUE != params) {
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, ¶ms);
glGetProgramInfoLog(shader, 512, &size, ErrorLog);
fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, ErrorLog);
exit(1);
}
return true;
}
答
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, ¶ms);
glGetProgramInfoLog(shader, 512, &size, ErrorLog);
^^^^^^^ should be Shader
你正在编译&检查着色器,所以你应该使用glGetShaderInfoLog()
。
glGetProgramInfoLog()
是抓住你glCreateProgram()
确实[这个例程]获得完整的着色器程序对象的链接日志(https://pastebin.com/ux8ppxQX)你的系统上运行? – genpfault
是的,现在我感到很傻。我一直在学习OpenGL的源代码在'glGetShaderInfoLog'和'glGetProgramInfoLog'之间没有很大的区别,所以我认为后者可以在任何情况下工作。在看到您的错误检查功能并更改为前者时,代码正常工作。谢谢你的帮助。如果你想把这个问题转换成答案,我会接受 – irishMTS
Doh!不要觉得太糟糕,我应该从阅读你的代码中看到这一点:) – genpfault