深度图重建世界空间是从深度信息计算出对应像素的世界位置坐标,对于实现如阴影映射、环境遮挡和后处理效果(例如景深和运动模糊)等高级图形效果至关重要。
注意
Unreal Engine不需要进行深度图重建世界空间,它提供的深度值本身就是世界空间下的
VP矩阵变换法
在该方法中,需要先构建出NDC坐标,再通过VP矩阵(视图矩阵和透视矩阵)将NDC坐标变换到世界空间。

- 首先将屏幕UV转到NDC空间(映射到[-1, 1]),该值也正是目标点在NDC空间下的X、Y坐标:$$ \text{NDC}_{XY} = 2 \text{UV} - 1 $$
- 构建NDC空间下的Z值,并补全NDC的W分量:$$ \begin{align*} \text{NDC}_{Z} &= \begin{cases} \text{Depth}, & \text{DirectX} \\ 2 \cdot \text{Depth} + 1, & \text{OpenGL} \end{cases} \\ \text{NDC}_{W} &= 1.0 \end{align*} $$
- NDC空间转世界空间(视图矩阵 & 透视矩阵 & 齐次除法):$$ \text{Position}_{XYZ} = \frac{(M_{\text{View}}^{-1}\cdot M_{\text{Project}}^{-1}\cdot\text{NDC})_{XYZ}}{(M_{\text{View}}^{-1}\cdot M_{\text{Project}}^{-1}\cdot\text{NDC})_{W}} $$ Unity示例如下:
float2 UV = IN.positionHCS.xy / _ScaledScreenParams.xy; // 计算屏幕UV
real depth = SampleSceneDepth(UV); // 采样深度图
#if !UNITY_REVERSED_Z // 调整 Z 以匹配 OpenGL 的 NDC ([-1, 1])
depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, depth);
#endif
// 重建世界空间位置
float3 worldPos = ComputeWorldSpacePosition(UV, depth, UNITY_MATRIX_I_VP);大部分逻辑已经被封装成函数ComputeWorldSpacePosition。
相似三角形法

- 技术美术(无限远裁剪平面怎么办) 🔺