2

我正在使用顶点、几何和片段着色器来渲染带有阴影的场景:

顶点着色器:

#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();
}

片段着色器:

#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 上

我的着色器中的一些代码可能看起来没有必要,但那是因为我在排除故障时已经尽可能多地删除了。

4

1 回答 1

1

There's no reason for your second shaders to successfully link. Your geometry shader states that it's writing:

out vec4 gShadowCoord; // Added

But your fragment shader is expecting:

in vec4 shadowCoord;

You should have gotten a linker error.

于 2013-04-08T01:57:12.007 回答