如何将gl_FragCoord转换为片段着色器中的世界空间点?

时间:2016-08-14 01:50:56

标签: opengl glsl

我的理解是,如果您具有视图投影矩阵的反转,屏幕宽度和屏幕高度,则可以将gl_FragCoord转换为片段着色器中世界坐标中的点。首先,通过分别除以宽度和高度,将gl_FragCoord.xgl_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;

    // ...
}

0 个答案:

没有答案