【问题标题】:Fragment shader input interfering with texture access片段着色器输入干扰纹理访问
【发布时间】:2023-03-27 16:19:02
【问题描述】:

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

顶点着色器:

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

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

【问题讨论】:

    标签: opengl glsl jogl


    【解决方案1】:

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

    out vec4 gShadowCoord; // Added
    

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

    in vec4 shadowCoord;
    

    你应该得到一个链接器错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多