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

Opengl 片段着色器输入干扰纹理访问,opengl,glsl,jogl,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);

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

顶点着色器:

#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
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
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();
}
这将成功渲染带有阴影的场景。我的场景中的立方体在我期望的地方被照亮并处于阴影中。当我尝试从几何体着色器传入两种颜色中的一种时,就会出现问题。当我这样做时,我的条件语句的计算结果总是false

几何体着色器:

#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上都会发生


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

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

out vec4 gShadowCoord; // Added
但您的片段着色器期望:

in vec4 shadowCoord;
你应该得到一个链接器错误