超过一个字符指针时的GLSL编译错误(glShaderSource)

Posted

技术标签:

【中文标题】超过一个字符指针时的GLSL编译错误(glShaderSource)【英文标题】:GLSL Compiling error when more than one char pointer (glShaderSource) 【发布时间】:2011-12-09 00:41:26 【问题描述】:

3.30 OpenGL 和 GLSL 版本的这段代码有什么问题?

    const char *vertSrcs[2] =  "#define A_MACRO\n", vShaderSrc ;
    const char *fragSrcs[2] =  "#define A_MACRO\n", fShaderSrc ;
    glShaderSource(vId, 2, vertSrcs, NULL);
    glShaderSource(fId, 2, fragSrcs, NULL);

我在编译后使用 GL_COMPILE_STATUS 收集着色器状态,得到这个错误:

    Vertex shader failed to compile with the following errors:

这个宏的目的是改变我从顶点传递到片段的颜色的类型限定符,也许还有另一种使用统一和布局的方法来做到这一点,但问题是为什么着色器会失败?我想知道是否还有另一个必须指定 2 个字符指针的 OpenGL 命令。 顺便说一句,这是可行的:

 ...
 glShaderSource(vId, 1, &vertSrcs[1], NULL);
 ...

编辑:由于我无法回答自己的问题,因此找到了解决方案

很奇怪的问题,正好是字符串加载器的问题。不使用 ifstreamstd::ios::in | std::ios::binary 标志,即使以 null 终止,字符串也加载了一些垃圾信息,因此连接字符串会产生错误。 出于某种原因,除了调用

之外,gl 编译器之前没有抱怨单字符串版本
inStream.flags(std::ios::in | std::ios::binary)

不够用,打开时需要指定,没找到相关文档。

【问题讨论】:

那么...以下错误是什么? 不幸的是 glGetShaderInfoLog(...); 没有记录更多内容,如果我找到原因,我会告诉你,至少使用 gDEBugger 运行不显示任何相关的错误并且运行良好... 您可以自己回答并接受。并且为了避免像你遇到的问题,因为这是 glShaderSource 的最后一个参数,告诉 OpenGL 每个源字符串的长度,从而防止它读入垃圾。 【参考方案1】:

GLSL 着色器的第一个非空行必须是#version 预处理器语句。任何其他的都是错误。

【讨论】:

谢谢,我也试过了,从我的着色器中删除第一行 #version 330 然后在此处添加:const char *vertSrcs[2] = "#version 330\n#define A_MACRO\n", vShaderSrc ;... 也不起作用。

以上是关于超过一个字符指针时的GLSL编译错误(glShaderSource)的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 着色器未编译,没有错误消息

通过函数指针使用内部函数时的链接器错误

GLSL 330 矩阵计算错误无编译错误

如何获取GLSL编译器错误的行号

错误 GLSL 版本不正确 450

GLSL 错误:无法预处理源。我该如何解决这个问题?