当包含未使用的参数时,glsl Shader不会绘制obj

时间:2015-07-06 12:02:04

标签: opengl glsl fragment-shader

我用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仍未在着色器中的任何位置使用)

2 个答案:

答案 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查询,看看是否还有其他问题。