我的理解是,如果您拥有视图投影矩阵的逆矩阵、屏幕宽度和屏幕高度,则可以在片段着色器中将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;
// ...
}