【发布时间】:2016-08-14 01:50:56
【问题描述】:
我的理解是,如果您有视图投影矩阵、屏幕宽度和屏幕高度的倒数,您可以将 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;
// ...
}
【问题讨论】:
-
通过顶点着色器的变化传递世界位置会更容易(也更有效)。