学习进度
0/9 已勾只保存在这台浏览器;勾满 9 项即视为本题完成。
先把题目说成人话
太阳照着一条很长的街,脚边的影子需要清楚,远处山坡却不值得花同样多的格子。若把有限的阴影纸平均铺满全世界,近处一定会发糊;更合理的办法是把相机前方分成近、中、远几段,各自分配清晰度。这个正式方法叫级联阴影(CSM);重点是按实际观看距离分配有限格子,不是盲目增加层数。
这是虚构教学故事,不是个人项目经历。
场景:先让问题变得看得见
户外战斗只有一轮太阳。角色脚边要看清接触关系,远山只需一块大轮廓。现在镜头能照到很远,阴影被分成四段,供它们使用的总格子数却固定;近处仍会轻微游动,而且太阳每帧重新拍阴影的工作偏重。
先别急着调“偏移”或增加段数。要先回答三件事:到底需要拍到多远;有限格子要优先给哪段;哪些物体值得被太阳重复拍进阴影。三件事各有旋钮,不能互相代替。
(右脑)画面: 相机前方像一条伸向远山的长廊,太阳要从侧上方为整条长廊拍一组黑白照片。若只用一张照片从脚边一直拍到山脚,近处的人脸和鞋底只能分到很少几个方格;把长廊分成近、中、远几段后,脚边的照片可以拍得细,远山只留下大块轮廓。照片分得太多,跨在两段之间的人和建筑又会被重复拍进好几张。
(左脑)对表: 先把长廊对应到相机视锥,把“拍到多远”对应到以米计的阴影距离(Shadow Distance)。再用无量纲的级联切分比例把视锥分段,并让这些段共享主光阴影图集(Main Light Shadow Atlas)的固定像素;每个阴影格在世界中覆盖多大,决定近处是否清楚。生成阶段通过阴影投射步骤(ShadowCaster Pass)重复绘制进入各段的物体,着色阶段再选择级联并过滤采样。深度偏移与法线偏移只修正自阴影比较,级联调试图和帧调试器证明覆盖与重复绘制,图形计时才证明整帧成本。
小明:先形成一个完整猜测
小明把 Depth Bias 和 Normal Bias 一起调大。表面的阴影痤疮少了,脚底却出现悬浮缝;相机移动时,远处阴影边缘依然闪烁。
这次尝试说明两个问题被混在了一起:Bias 用来处理深度比较造成的自阴影冲突,调得过大会产生 peter-panning;远处 shimmer 更常见的来源是阴影 texel 密度不足、投影随相机变化或级联切换,不该用更大的 Bias 硬压。
小红:把猜测放回现实检查
小红先打开 URP 的 Cascade 调试色和 Frame Debugger,确认角色、地面和远景分别落在哪一级,ShadowCaster Pass 又重复提交了哪些物体。然后按顺序单独验证:
- 缩短 Shadow Distance。远处不再进入实时阴影,ShadowCaster 数量下降;若远山轮廓仍满足美术要求,这比提高整张 Atlas 更直接。
- 保持距离不变,只调整 Cascade Splits,让更多 texel 留给角色附近,而不是平均切深度。
- 保持切分不变,再比较 2 与 4 级联。更多级联可能改善不同距离的密度分配,也会增加阴影绘制和级联选择成本,必须在目标镜头实测。
- 最后才分别调 Depth Bias、Normal Bias 与过滤质量。每次只针对一种可见伪影,并检查脚底等实体阴影有没有被推离接触面。
我:用检查结果修正模型
我把阴影分级成“谁需要、需要多远、需要多细”。英雄和关键敌人保留动态投影;很小、很远或几乎不可见的装饰物关闭 Cast Shadows;远景用烘焙阴影、Blob、Impostor 阴影或不投影替代。本题锁定 URP:Screen Space Shadows Renderer Feature 是把主方向光阴影结果做成屏幕空间纹理,供后续着色采样;它不是 HDRP 的 Contact Shadows,也不会凭空补出脚底短距离接触细节。只有项目明确使用 HDRP Contact Shadows 或自定义接触阴影射线时,才把它作为近处补偿并单独计时,不能拿它替代远山阴影。主光的 Shadow Distance 以实际战斗视距为上限,Cascade Splits 围绕近景构图分配,不照搬固定比例。
最后分别验三类伪影:痤疮看 Bias 与精度;悬浮看 Bias 是否过大;闪烁看 texel 密度、稳定投影、阴影距离与级联切换。级联交界还要检查混合带。这样每个旋钮都有明确对象,不会为了治远处 shimmer 把近处接触关系毁掉。
(右脑)画面修正: 小明把阴影轻轻推离物体表面,小黑点确实少了,角色的脚却像悬在地面上,远处边缘仍在闪。小红没有继续推,而是先把太阳需要照顾的长廊缩短,再把更多照片方格留给脚边。画面这才说明:近处黑点、脚底悬空和远处闪烁看起来都叫“阴影坏了”,却不是拧同一个旋钮就能一起消失的毛病。
(左脑)严格对表: 调优顺序是:固定目标构建和战斗镜头,记录 ShadowCaster 与 GPU 基线;按美术可见距离设置 Shadow Distance;用 Cascade 调试图按近景需求调整 splits;在相同距离与 Atlas 下 A/B 级联数和分辨率;最后分别以最小改动调 Depth Bias、Normal Bias、PCF 与混合带。验收同时要求阴影阶段进入预算、关键角色接触不悬浮、痤疮/闪烁低于画面阈值、级联交界不可察觉,且远景替代方案通过美术检查。
老师解惑
- CSM 只针对方向光:它把相机视锥的深度范围分段,再从光源方向为每段生成阴影图。
- 成本既来自生成阴影图时重复绘制 Shadow Caster,也来自着色时选择级联和过滤采样。
- Atlas 分辨率、级联数、切分位置和阴影距离共同决定每个世界区域的有效 texel 密度。
- PCF 等过滤主要软化锯齿,会增加阴影采样;它不能弥补错误的距离和切分策略。
- URP 的 Screen Space Shadows 与 HDRP/custom Contact Shadows 不是同一种功能;先确认渲染管线和实现,再谈是否用于近处补偿。
工具分工
- URP Asset 与 Light 设置:控制主光阴影距离、级联数、切分、Atlas 和过滤质量。
- Rendering Debugger 的 Cascade 视图:确认每个画面区域实际使用哪一级。
- Frame Debugger:检查 ShadowCaster Pass 画了谁、重复了几次;不把绘制数量冒充 GPU 时间。
- Unity Profiler GPU Usage:比较阴影阶段在目标构建中的实际耗时。
记忆钩子
先缩到真正需要阴影的距离,再把级联密度留给近景;Bias 治自阴影,不负责治所有闪烁。
这是教学场景,不是目标项目的真实捕获或个人经历。
下一步:验证这条因果
在级联、分辨率、PCF 与 bias 之间找到证据。
教学边界:它只验证这一条画面因果,不替代完整答案、项目经历或目标设备数据。