无法从 glGetShaderInfoLog 检索错误消息

Posted

技术标签:

【中文标题】无法从 glGetShaderInfoLog 检索错误消息【英文标题】:Unable to retrieve an error message from glGetShaderInfoLog 【发布时间】:2012-09-05 23:58:04 【问题描述】:

我正在尝试构建一个包含单个片段着色器的简单 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 次点击,但我想我还是提一下吧。

【问题讨论】:

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

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

【讨论】:

以上是关于无法从 glGetShaderInfoLog 检索错误消息的主要内容,如果未能解决你的问题,请参考以下文章

无法从 IP 服务器检索 JSONArray 但我可以从普通服务器检索?

无法从 OdooRPc 检索数据

无法从 Firebase 缩短的动态链接网址检索动态链接

无法从类中检索值

无法从嵌套集合中检索数据

无法从短动态链接中检索数据 - Firebase