我很难理解不同着色器阶段之间的数学。
在从灯光的角度来看的片段着色器中,我基本上将 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);
为左下角。其他角落的类似代码
从解决方案中,我希望从摄像机的角度渲染场景,其颜色与从灯光的角度完全相同。可能有一些精度误差。