GameTech/URP 渲染实战

案例 2.4Forward 的每物体光源上限入门

目标:仍用 Forward 路径,分别尝试“把上限提到 8”和“把地面拆成 12×12 块”,理解每物体上限的含义。

图 2-11Forward 路径。左:整块地面,上限 4;中:整块地面,上限 8;右:地面拆成 144 块,上限 4

上限提到 8,地面多了 4 团光斑,但离“全部 24 盏”还差得远,而且 8 已经是硬上限。把地面拆成小块后,每一块只被附近少数几盏灯照到,4 盏的额度绰绰有余,画面就和 Forward+ 一样了。这正是 Forward 时代的经典做法:大面积的地形、地面要切块。代价是 Draw Call 和剔除开销增加——Forward+ 从根本上消除了这个两难。

渲染路径怎么选

考量ForwardForward+Deferred
每物体光源数≤ 8(默认 4)不限(总可见数有上限)不限
MSAA支持支持不支持
相机栈 Overlay 相机可用可用Overlay 相机不能用 Deferred 的 Renderer
自定义光照模型(卡通等)自由自由(需支持 _FORWARD_PLUS)需 UniversalForwardOnly,不享受延迟光照
带宽低低高(多张全屏 GBuffer)
适合移动端、灯少、风格化多数项目的默认选择桌面/主机、海量动态灯、需要 GBuffer 做屏幕空间效果

一个现实的提醒:自己写的 Shader 要同时支持 Forward 和 Forward+,就必须像 URP 的 Lit 那样声明 #pragma multi_compile _ _FORWARD_PLUS 并使用 LIGHT_LOOP_BEGIN/END 宏,否则在 Forward+ 下附加光会算错或者完全不显示。第 6 章会写一个完整的多光源 Shader。