Unity ApplyShadowBias 返回什么,什么是Shadow Map 采样,什么是阴影 acne(纹波/摩尔纹) 和 peter-panning(悬空阴影)
在 Unity 的阴影渲染中这几个概念紧密相关理解它们能帮你更好地调试阴影效果。1.ApplyShadowBias返回什么ApplyShadowBias是 Unity 内部用于渲染阴影贴图Shadow Map时的一个函数你通常不会直接调用它。它的作用是返回一个经过深度偏移Bias调整后的裁剪空间坐标。具体来说它接收一个从光源视角生成的裁剪空间位置clipPos然后根据当前的渲染设置如光源类型、阴影强度等计算一个深度偏移量。将这个偏移量应用到clipPos.z即深度值上。返回调整后的坐标用于后续写入 Shadow Map。核心目的通过人为改变写入 Shadow Map 的深度值来减少“阴影痤疮Shadow Acne”这种渲染错误。2. 什么是 Shadow Map 采样这是阴影渲染的核心步骤可以理解为“从光源的视角拍一张深度照片然后从相机视角使用这张照片”。生成 Shadow Map拍照把光源当作一个相机渲染整个场景但只记录每个像素距离光源的深度值不是颜色形成一张纹理这就是 Shadow Map。采样与比较查照片在最终渲染场景时对于一个屏幕上的像素点计算出该点在光源空间中的位置和深度距离光源的距离。到 Shadow Map 中采样出光源视角下那个位置记录的深度。进行比较如果“点的实际深度” “Shadow Map 中记录的深度”加上容差说明该点被挡住了就在阴影中。否则不在阴影中。一句话总结Shadow Map 采样就是查询“从光源看过来这个点是否被其他物体挡住”的过程。3. 什么是阴影 Acne 和 Peter-Panning这两个都是阴影渲染中的经典问题由 Shadow Map 的深度偏移Bias设置不当引起。问题阴影 Acne也叫阴影痤疮、条纹、摩尔纹Peter-Panning也叫悬空阴影、悬浮阴影现象物体表面出现奇怪的、自阴影的条纹、波纹或斑点尤其在光滑平面上很明显。物体投射的阴影和物体本身之间出现明显空隙看起来像物体悬浮着影子在地面上。示意图表面有黑白相间的锯齿状条纹物体的脚离地面的影子有一段距离产生原因Bias 太小。由于 Shadow Map 分辨率有限和浮点精度误差物体表面在计算自身阴影时采样到的深度值有时比自己的实际深度大有时小导致表面一部分认为被自己遮挡一部分认为没被遮挡。Bias 太大。人为添加的深度偏移量过大导致物体应该被阴影覆盖的区域被错误地判定为在“更前方”于是阴影向后“缩”产生了空隙。解决办法适当增加光源设置中的Bias值。适当减少光源设置中的Bias值。核心矛盾你需要找到一个恰到好处的 Bias 值在 AcneBias 太小和 Peter-PanningBias 太大之间取得平衡。实际调试建议在 Unity 的 Light 组件中你可以直接调整这两个参数Bias主要控制深度偏移直接影响 Acne 和 Peter-Panning。从0开始微调直到表面条纹消失且阴影没有明显分离。Normal Bias沿着法线方向偏移对消除曲面 Acne 特别有效通常比单纯增大 Bias 效果更好且不容易引起 Peter-Panning。常用技巧对于角色或小物体使用较小的 Bias对于地面或大平面可以稍微增大。也可以使用Shadowmask或屏幕空间阴影等更高级的技术来从根本上缓解这些问题。