OpenGL - 统一存在导致着色器被绕过

时间:2016-04-05 20:56:25

标签: opengl glsl shader

更新:事实证明这是由于C方面的一个错误,导致一些矩阵变得格格不入。着色器都很好。因此,如果添加制服会导致奇怪的事情发生,我的建议是使用调试器来检查所有制服的值,并确保它们都被正确设置。

所以我试图将深度渲染到立方体贴图以用作阴影贴图,但是当我在片段着色器中添加并使用制服时,一切都变为白色,就像没有使用着色器一样。编译/链接着色器时不会生成警告或错误。

我用来渲染深度图的着色器程序(将深度​​简单地设置为片段z位置作为测试)如下:

//vertex shader
#version 430

in layout(location=0) vec4 vertexPositionModel;

uniform mat4 modelToWorldMatrix;

void main() {
    gl_Position = modelToWorldMatrix * vertexPositionModel;
}

//geometry shader
#version 430

layout (triangles) in;
layout (triangle_strip, max_vertices=18) out;

out vec4 fragPositionWorld;

uniform mat4 projectionMatrices[6];

void main() {
    for (int face = 0; face < 6; face++) {
        gl_Layer = face;
        for (int i = 0; i < 3; i++) {
            fragPositionWorld = gl_in[i].gl_Position;
            gl_Position = projectionMatrices[face] * fragPositionWorld;
            EmitVertex();
        }
        EndPrimitive();
    }
}

//Fragment shader
#version 430

in vec4 fragPositionWorld;

void main() {
    gl_FragDepth = abs(fragPositionWorld.z);
}

主要着色器从立方体贴图中采样,只需将深度渲染为灰度颜色:

vec3 lightDirection = fragPositionWorld - pointLight.position;
float closestDepth = texture(shadowMap, lightDirection).r;
finalColour = vec4(vec3(closestDepth), 1.0);

场景是一个较大的立方体房间中的一个小立方体,按预期渲染,在z = 0附近变暗,立方体投射到墙上(深度图从房间中心渲染):

好:

[enter image description here 2

我可以移动小立方体,投影正确投影到立方体贴图的所有边上。到目前为止一切都很好。

问题是当我向片段着色器添加制服时,即:

#version 430

in vec4 fragPositionWorld;

uniform vec3 lightPos;

void main() {
    gl_FragDepth = min(lightPos.y, 0.5);
}

所有内容都呈现为白色,就像渲染无法编译一样:

为:

enter image description here

gDEBugger报告正确设置了均匀(0,4,0),但无论lightPos是什么,gl_FragDepth应该设置为小于0.5的值并且显示为灰色阴影(如果我设置了会发生这种情况) gl_FragDepth = 0.5直接),所以我只能断定片段着色器由于某种原因没有被使用,而是使用默认的着色器。不幸的是我不明白为什么。

0 个答案:

没有答案