对应代码如下
//深度纹理采样,本质是返回纹理采样结果的r通道
float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth);
//获取投影空间下的坐标(数值范围在-1~1)
float4 H = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, d * 2 - 1, 1);
// 通过视角*投影矩阵的逆矩阵,得到视角空间下的坐标
float4 D = mul(_CurrentViewProjectionInverseMatrix, H);
// 除以w分量,将其转为世界坐标
float4 worldPos = D / D.w;
令世界坐标系中有一点P,齐次坐标记为
其中,
P点的深度纹理采样结果为
透视除法的过程是裁剪空间坐标的4个分量分别除以w分量,即
由公式(2)和公式(3)得
在公式(5)中,_CurrentViewProjectionInverseMatrix
提供,
由公式(5)可得
将公式(7)带入公式(5),则有
且由公式(3),则可知上文H为