C++ 无法从glGetShaderInfoLog检索错误消息

C++ 无法从glGetShaderInfoLog检索错误消息,c++,macos,opengl,shader,nsopenglview,C++,Macos,Opengl,Shader,Nsopenglview,我试图构建一个简单的OpenGL 3.2程序,它由一个片段着色器组成,但我似乎无法实际编译着色器。我相当确定我的着色器语法是正确的,但即使不是,我也无法使用glGetShaderInfoLog检索错误消息 我制定了一个简短的计划,在行动中展示了这一点: GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); const char *shaderData = "#version 120\n" "voi

我试图构建一个简单的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\u INFO\u LOG\u LENGTH
值每次都返回0,因此我分配了一个空字符串。我已尝试将此值编码为100,但仍然没有从
getShaderInfoLog
收到任何消息

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

错误:0:11:“未定义的_变量”:语法错误语法错误

除非着色器标记在内部有自己的验证工具,否则我确信它必须使用与我尝试使用的方法相同的方法。我在互联网上看到过几个例子,其中人们以相同的方式检索着色器的错误消息,因此我相当确信我做得正确

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

#警告gl.h和gl3.h都包括在内。如果使用已删除的OpenGL功能,编译器将不会调用错误。


在进行全文搜索之后,我找不到我调用
#include
的任何地方,因此我猜测此标题被一个
NSOpenGL*
类包含。我很确定我没有在这个简短的程序中使用任何删除的功能,而且这个问题在Google上只有大约5次点击,但我想我还是提一下这一点。

如前一条评论中所述,
glCompileShader
调用丢失。

我在你的代码中没有看到
glCompileShader
。天哪!真不敢相信我错过了!我现在收到了预期的错误消息。我建议你把它写下来作为这个问题的答案,这样我就可以把它标记为已解决。这就是当你编写代码到凌晨的时候会发生的事情。我可以看到我自己在写这个问题,以及几乎6年后与OP完全相同的后续评论。这是一个非常好的工具。