GLSL将gl_FragCoord.z转换为eye-space z

时间:2011-02-07 06:24:22

标签: glsl

这是一个简单的问题,我厌倦了在网上搜索正确的方程式。

主要问题是每个人都建议做这样的事情VS:

varying float depth;

depth = ( gl_ModelViewMatrix * gl_Vertex );

但我不能,因为深度存储在纹理中。

所以无论如何,我现在使用深度值,以及用于从眼睛空间坐标创建它的投影矩阵。

如果您不太明白,请告诉我,我会尝试更好地说出来。

提前致谢。 :)

1 个答案:

答案 0 :(得分:3)

如果从纹理中提取深度值 - 它在[0,1]范围内。首先,您需要将其缩放到[-1,1]范围,然后应用逆投影来获得模型视图深度:

vec2 xy = vec2(x_coord,y_coord); //in [0,1] range
vec4 v_screen = vec4(xy, texture(samplerDepth,xy), 1.0 );
vec4 v_view = inverse(gl_ProjectionMatrix) * (2.0*(read_depth-vec3(0.5)));
float view_depth = v_view.z / v_view.w; //transfer from homogeneous coordinates