Unity 阴影贴图深度解析:光空间变换、级联阴影与 SRP 阴影系统

📅 2026/8/11 1:54:50
Unity 阴影贴图深度解析:光空间变换、级联阴影与 SRP 阴影系统
引言:阴影瑕疵是工程问题而非美术问题拉近视角观察物体与地面的接触线,锯齿、抖动、漏光、悬浮依次出现——这些"老毛病"无法靠调美术参数根治,因为它们的根源是 Shadow Map 的离散化本质:用一张有限分辨率的深度图表达连续几何的遮挡关系,必然引入量化误差。Shadow Map 的概念很简单:从光源视角渲染深度图,着色时把片元投影回光源空间比较深度。真正的难点在工程化:多光源如何调度、级联如何分割、滤波如何软化边缘、不同管线的控制边界在哪。本文按数学基础、管线实现、滤波算法、自定义实践的顺序展开。一、数学基础:光空间变换链1.1 四个变换环节世界到光空间(WorldToLight):把顶点变换到光源坐标系,方向光用平行光视锥,点光/聚光用透视视锥;光投影矩阵:方向光为正交投影(深度与距离无关,适合平行光),点光/聚光为透视投影;NDC 到纹理坐标(Scale-Bias):把 [-1,1] 映射到 [0,1] 的纹理采样空间;光视锥剔除:只渲染可能产生阴影的物体,控制填充成本。// 光空间变换的标准写法 float4 shadowCoord = mul(_WorldToShadow, mul(unity_ObjectToWorld, v.vertex)); shadowCoord.xyz /= shadowCoord.w; // 透视除法