我用glsl设置了一个phong着色器,效果很好。
当我在没有“此行”的情况下渲染我的对象时,它可以正常工作。但是,当我取消注释“this line”时,世界仍然构建,但是对象不再呈现,尽管glsl代码中的任何地方都没有使用“LVN2”。着色器执行时不会抛出错误。我认为我的问题是一个相当普遍的glsl问题,因为着色器如何正常工作。
主要代码是用java编写的。
Vertex着色器片段:
// Light Vector 1
vec3 lightCamSpace = vec4(viewMatrix * modelMatrix * lightPosition).xyz;
out_LightVec = vec3(lightCamSpace - vertexCamSpace).xyz;
// Light Vector 2
vec3 lightCamSpace2 = vec4(viewMatrix * modelMatrix * lightPosition2).xyz;
out_LightVec2 = vec3(lightCamSpace2 - vertexCamSpace).xyz;
Fragment shader snippet:
vec3 LVN = normalize(out_LightVec);
//vec3 LVN2 = normalize(out_LightVec2); // <---- this line
编辑1:
GL_MAX_VERTEX_ATTRIBS
为29,glGetError
已经实施,但没有丢失任何错误。
如果我改变
vec3 LVN2 = normalize(out_LightVec2);
到
vec3 LVN2 = normalize(out_LightVec);
它实际上再次呈现对象。所以看起来似乎有些东西被最大化了。 (LVN2仍未在着色器中的任何位置使用)
答案 0 :(得分:1)
我实际上发现了我绝对愚蠢的错误。在主程序中,我给着色器提供错误的viewMatrix位置......但我不确定为什么它有时会起作用。
答案 1 :(得分:0)
我无法在着色器中发现错误。有一件事可能是你通过使用第五个四分量GL_MAX_VERTEX_ATTRIBS
插槽超过out
。 (虽然4的限制很奇怪,根据this answer,最小支持量应该是16,在这种情况下它甚至不应该链接。然后你再次使用GLSL 1.50,这意味着OpenGL 3.2,这是非常古老的。我无法找到规定属性计数最低要求的规范。)
使用未注释的行的原因可能是着色器编译器能够优化未使用的输入/输出参数,当它在片段着色器体中被引用时无法这样做。
您可以通过查询限制来测试我的猜测:
int limit;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &limit);
除此之外,我建议您在抽奖之前和之后插入glGetError查询,看看是否还有其他问题。