无法从glGetShaderInfoLog检索错误消息

时间:2012-09-05 23:58:05

标签: c++ macos opengl shader nsopenglview

我正在尝试构建一个简单的OpenGL 3.2程序,该程序由单个片段着色器组成,但我似乎无法实际编译着色器。我很确定我的着色器语法是正确的,但即使不是,我也无法使用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,因此我分配一个空字符串。我已经尝试将此值硬编码为100,但我仍然从getShaderInfoLog收到任何内容。

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

  

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

除非Shader Marker内部有自己的验证工具,否则我确定它必须使用我尝试使用的相同方法。我在互联网上看到过几个例子,人们以同样的方式检索着色器的错误信息,所以我很确定我做得正确。

现在,我收到编译时警告,可以解释这个问题:

  

#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次点击,但我认为无论如何我最好提一下。

1 个答案:

答案 0 :(得分:9)

如前一条评论所述,glCompileShader来电失踪。