假设您有深度纹理uniform sampler2D u_depthmap
,并且深度纹理的内部格式是浮点格式。
要从当前片段所在的纹理中读取纹素,您必须知道视口的大小 ( uniform vec2 u_vieport_size
)。gl_FragCoord
包含片段的窗口相对坐标(x, y, z, 1/w)
值。因此深度图的纹理坐标由下式计算:
vec2 map_uv = gl_FragCoord.xy / u_vieport_size;
u_depthmap
由于内部浮点格式,深度纹理的深度在 [0.0, 1.0] 范围内给出。片段的深度也包含在gl_FragCoord.z
[0.0, 1.0] 范围内。
这意味着地图的深度和片段的深度可以计算如下:
uniform sampler2D u_depthmap;
uniform vec2 u_vieport_size;
void mian()
{
vec2 map_uv = gl_FragCoord.xy / u_vieport_size;
float map_depth = texture(u_depthmap, map_uv).x;
float frag_depth = gl_FragCoord.z;
.....
}
注意map_depth
和frag_depth
都在 [0.0, 1.0] 范围内。如果它们是使用相同的投影(尤其是相同的近平面和远平面)生成的,那么它们是可比较的。这意味着您必须确保着色器为世界上的同一点生成与深度图中的深度值相同的深度值。如果不是这种情况,那么您必须线性化深度值并且您必须计算视图空间 Z 坐标。