为什么glGetProgramInfoLog返回一个空字符串?

问题描述:

我正在编写一个我知道编译正确的代码库。目前,我在着色器中引入了有目的的拼写错误来模拟错误。此时,代码拒绝编译。然后我可以叫为什么glGetProgramInfoLog返回一个空字符串?

glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 

发现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, &params); 
    if (GL_TRUE != params) { 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 
     glGetProgramInfoLog(shader, 512, &size, ErrorLog); 
     fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, ErrorLog); 
     exit(1); 
    } 
    return true; 
} 
+1

确实[这个例程]获得完整的着色器程序对象的链接日志(https://pastebin.com/ux8ppxQX)你的系统上运行? – genpfault

+1

是的,现在我感到很傻。我一直在学习OpenGL的源代码在'glGetShaderInfoLog'和'glGetProgramInfoLog'之间没有很大的区别,所以我认为后者可以在任何情况下工作。在看到您的错误检查功能并更改为前者时,代码正常工作。谢谢你的帮助。如果你想把这个问题转换成答案,我会接受 – irishMTS

+0

Doh!不要觉得太糟糕,我应该从阅读你的代码中看到这一点:) – genpfault

glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 
glGetProgramInfoLog(shader, 512, &size, ErrorLog); 
    ^^^^^^^ should be Shader 

你正在编译&检查着色器,所以你应该使用glGetShaderInfoLog()

glGetProgramInfoLog()是抓住你glCreateProgram()