超过一个字符指针时的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);
...
编辑:由于我无法回答自己的问题,因此找到了解决方案
很奇怪的问题,正好是字符串加载器的问题。不使用 ifstream 和 std::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)的主要内容,如果未能解决你的问题,请参考以下文章