0

我很难理解不同着色器阶段之间的数学。

在从灯光的角度来看的片段着色器中,我基本上将 fragDepth 写成 rgb 颜色

#version 330

out vec4 shader_fragmentColor;

void main()
{
    shader_fragmentColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1);
    //shader_fragmentColor = vec4(1, 0.5, 0.5, 1);
}

使用上述着色器渲染场景时,它会以全白色显示场景。我想那是因为 gl_FragCoord.z 大于 1。希望它不会在 1 时达到最大值。但我们现在可以不理会这个问题。

在从相机角度看的几何着色器中,我基本上将所有点变成四边形并写出可能“不正确”的纹理位置以在 lightTexture 中查找。这里的数学就是问题。我也有点不确定插值在下一个着色器阶段是否正确。

#version 330
#extension GL_EXT_geometry_shader4 : enable

uniform mat4 p1_modelM;
uniform mat4 p1_cameraPV;
uniform mat4 p1_lightPV;

out vec4 shader_lightTexturePosition;

void main()
{
    float s = 10.00;

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0);
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * llWorldPosition;
    shader_lightTexturePosition = p1_lightPV * llWorldPosition;
    EmitVertex();

    vec4 rlCorner = vec4(+s, -s, 0.0, 0.0);
    vec4 rlWorldPosition = ((p1_modelM * rlCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * rlWorldPosition;
    shader_lightTexturePosition = p1_lightPV * rlWorldPosition;
    EmitVertex();

    vec4 luCorner = vec4(-s, +s, 0.0, 0.0);
    vec4 luWorldPosition = ((p1_modelM * luCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * luWorldPosition;
    shader_lightTexturePosition = p1_lightPV * luWorldPosition;
    EmitVertex();

    vec4 ruCorner = vec4(+s, +s, 0.0, 0.0);
    vec4 ruWorldPosition = ((p1_modelM * ruCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * ruWorldPosition;
    shader_lightTexturePosition = p1_lightPV * ruWorldPosition;
    EmitVertex();

    EndPrimitive();
}

在从相机角度来看的片段着色器中,我基本上在 lightTexture 中查找从灯光角度显示的颜色并写出相同的颜色。

#version 330

uniform sampler2D p1_lightTexture;

in vec4 shader_lightTexturePosition;

out vec4 shader_fragmentColor;

void main()
{
    vec4 lightTexel = texture2D(p1_lightTexture, shader_lightTexturePosition.xy);
    shader_fragmentColor = lightTexel;
    /*
    if(lightTexel.x < shader_lightTexturePosition.z)
        shader_fragmentColor = vec4(1, 0, 0, 1);
    else
        shader_fragmentColor = vec4(0, 1, 0, 1);
    */
    //shader_fragmentColor = vec4(1, 1, 1, 1);
}

当从相机的角度进行渲染时,我看到场景是按原样绘制的,但在它们上应用了不正确的纹理坐标并重复出现。重复纹理可能是由纹理坐标超出 0 到 1 的范围引起的。

我已经尝试了几件事,但仍然无法理解数学应该是什么。一些注释掉的代码和一个我不确定的例子是:

shader_lightTexturePosition = normalize(p1_lightPV * llWorldPosition) / 2 + vec4(0.5, 0.5, 0.5, 0.5);

为左下角。其他角落的类似代码

从解决方案中,我希望从摄像机的角度渲染场景,其颜色与从灯光的角度完全相同。可能有一些精度误差。

4

1 回答 1

0

我自己弄清楚了纹理映射位。深度值位还是有点奇怪。将 screenProjectedCoords 转换为 normalizedDeviceCoords 然后加 1 除以 2。

vec4 textureNormalizedCoords(vec4 screenProjected)
{
    vec3 normalizedDeviceCoords = (screenProjected.xyz / screenProjected.w);
    return vec4( (normalizedDeviceCoords.xy + 1.0) / 2.0, screenProjected.z * 0.005, 1/screenProjected.w);
}

void main()
{
    float s = 10.00;

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0);
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * llWorldPosition;
    shader_lightTextureCoords = textureNormalizedCoords(p1_lightPV * llWorldPosition);
    EmitVertex();a
于 2013-01-06T03:05:49.463 回答