片段着色器输入干扰纹理访问

时间:2013-04-07 21:00:15

标签: opengl glsl jogl

我使用顶点,几何和片段着色器渲染带阴影的场景:

顶点着色器:

#version 400
layout(location=0) in vec3 position;
out vec4 vShadowCoord;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 shadowMatrix;
void main(void)
{
    vShadowCoord = shadowMatrix * vec4(position, 1.0);
    gl_Position = modelViewProjectionMatrix * vec4(position, 1.0);
}

几何着色器:

#version 400
layout(triangles_adjacency) in;
layout(triangle_strip, max_vertices = 3) out;
in vec4 vShadowCoord[];
out vec4 gShadowCoord;
uniform vec3 lightPosition;

void main()
{
    gShadowCoord = vShadowCoord[0];
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    gShadowCoord = vShadowCoord[2];
    gl_Position = gl_in[2].gl_Position;
    EmitVertex();

    gShadowCoord = vShadowCoord[4];
    gl_Position = gl_in[4].gl_Position;
    EmitVertex();

    EndPrimitive();
}

片段着色器:

#version 400
in vec4 shadowCoord;
out vec4 fColor;
uniform sampler2DShadow shadowMap;

void main(void)
{
    float shadow = textureProj(shadowMap, shadowCoord);
    fColor = (shadow > 0.0) ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.1, 0.1, 0.1, 1.0);
}

这成功渲染了我的场景阴影。我的场景中的立方体被照亮,并且在我预期的阴影中。当我尝试从几何着色器中传递两种颜色中的一种时,会出现问题。当我这样做时,我的条件语句总是评估为假。

几何着色器:

#version 400
layout(triangles_adjacency) in;
layout(triangle_strip, max_vertices = 3) out;
in vec4 vShadowCoord[];
out vec4 gShadowCoord; // Added
out vec4 gColorLit;    // Added
uniform vec3 lightPosition;

void main()
{
    gShadowCoord = vShadowCoord[0];
    gColorLit = vec4(1.0, 1.0, 1.0, 1.0); // Added
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    gShadowCoord = vShadowCoord[2];
    gColorLit = vec4(1.0, 1.0, 1.0, 1.0); // Added
    gl_Position = gl_in[2].gl_Position;
    EmitVertex();

    gShadowCoord = vShadowCoord[4];
    gColorLit = vec4(1.0, 1.0, 1.0, 1.0); // Added
    gl_Position = gl_in[4].gl_Position;
    EmitVertex();

    EndPrimitive();
}

Fragment Shader:

#version 400
in vec4 shadowCoord;
in vec4 gColorLit; // Added
out vec4 fColor;
uniform sampler2DShadow shadowMap;

void main(void)
{
    float shadow = textureProj(shadowMap, shadowCoord);
    // Changed
    fColor = (shadow > 0.0) ? gColorLit : vec4(0.1, 0.1, 0.1, 1.0);
}

可能导致这种情况发生的原因是什么?

这在Ubuntu 12.04和Windows 7上都会发生

我的着色器中的一些代码可能看起来没必要,但这是因为我在故障排除时尽可能地剥离了。

1 个答案:

答案 0 :(得分:1)

您的第二个着色器没有理由成功链接。几何着色器表明它正在编写:

out vec4 gShadowCoord; // Added

但是你的片段着色器期待:

in vec4 shadowCoord;

您应该收到链接器错误。