2012-09-05 76 views
3

我正在尝试构建一个简单的由单个片段着色器组成的OpenGL 3.2程序,但我似乎无法真正编译着色器。我相当肯定我的着色语法是正确的,但即使不是这样,我也无法使用glGetShaderInfoLog来检索错误消息。无法从glGetShaderInfoLog检索错误消息

我开发了一个小程序,显示这个动作:

GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); 

const char *shaderData = 
      "#version 120\n" 
      "void main()\n" 
      "{\n" 
      " gl_FragColor = gl_Color;\n" 
      "}\n"; 
glShaderSource(shader, 1, &shaderData, NULL); 

GLint status; 
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 

if (status == GL_FALSE) 
{ 
    GLint infoLogLength; 
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); 

    GLchar* strInfoLog = new GLchar[infoLogLength + 1]; 
    glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog); 

    fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog); 
    delete[] strInfoLog; 
} 

这产生了消息:

编译错误着色器片段着色器:

这个问题似乎因为getShaderiv检索GL_INFO_LOG_LENGTH值的调用每次都返回0,所以我分配一个空的条带G。我试图将此值硬编码为100,但我仍然从getShaderInfoLog收到任何内容。

我在这里关心的不是修复着色器(如果它错了,我可以自己做),而是获取调试信息。我知道这可以完成,因为我已经使用Shader Maker来简单地开发着色器,并且能够获得非常详细的调试消息。例如:

ERROR: 0:11: 'undefined_variable' : syntax error syntax error

除非着色标记都有自己的验证工具在内部,我敢肯定,它必须使用我试图用同样的方法。我在互联网上看到了几个例子,其中人们以相同的方式检索着色器的错误消息,所以我确信我正确地做到了。

现在,我得到一个编译时警告,这可能解释了这个问题:

#warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality.

做全文搜索后,我找不到任何地方,我打电话#include <OpenGL/gl.h>,所以我猜测这个头文件正在被NSOpenGL*类中的一个包含。我相当确定我在这个短程序中没有使用任何删除的功能,而且这个问题在Google上只有5次点击,不过我认为我最好还是提一提。

+4

我在代码中看不到'glCompileShader'。 – JWWalker

+0

天啊!我不敢相信我错过了!我现在正在按照预期收到我的错误消息。我建议你把这个问题写成这个问题的答案,这样我可以将其标记为已解决。这是当你编码到凌晨时发生的情况。 –

回答

7

正如先前的评论中指出的,glCompileShader呼叫缺失。

相关问题