我的理解是,如果您具有视图投影矩阵的反转,屏幕宽度和屏幕高度,则可以将gl_FragCoord转换为片段着色器中世界坐标中的点。首先,通过分别除以宽度和高度,将gl_FragCoord.x
和gl_FragCoord.y
从屏幕空间转换为规范化设备坐标,然后缩放并将它们偏移到范围[-1,1]中。接下来,您通过逆视图投影矩阵进行变换,以获得仅在除以w分量时才能使用的世界空间点。
下面是我所拥有的片段着色器代码,它不起作用。注意inverse_proj
实际上设置为逆视图投影矩阵:
#version 450
uniform mat4 inverse_proj;
uniform float screen_width;
uniform float screen_height;
out vec4 fragment;
void main()
{
// Convert screen coordinates to normalized device coordinates (NDC)
vec4 ndc = vec4(
(gl_FragCoord.x / screen_width - 0.5) * 2,
(gl_FragCoord.y / screen_height - 0.5) * 2,
0,
1);
// Convert NDC throuch inverse clip coordinates to view coordinates
vec4 clip = inverse_proj * ndc;
vec3 view = (1 / ndc.w * clip).xyz;
// ...
}