首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从glGetShaderInfoLog检索错误消息

无法从glGetShaderInfoLog检索错误消息
EN

Stack Overflow用户
提问于 2012-09-05 23:58:04
回答 1查看 7.5K关注 0票数 4

我试图构建一个简单的OpenGL 3.2程序,其中包含一个片段着色器,但我似乎无法实际编译着色器。我确信我的着色器语法是正确的,但即使不是,我也无法使用glGetShaderInfoLog检索错误消息。

我开发了一个简短的程序,显示了这一点的行动:

代码语言:javascript
复制
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那里得到任何东西。

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

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

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

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

#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次点击量,但我想我还是提一提吧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-06 00:30:18

正如在之前的评论中指出的,glCompileShader调用丢失了。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12291314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档