URP 渲染实战 / 第 2 章 URP 架构与一帧的流程 / 案例 2.4
案例 2.4Forward 的每物体光源上限入门
目标:仍用 Forward 路径,分别尝试“把上限提到 8”和“把地面拆成 12×12 块”,理解每物体上限的含义。

上限提到 8,地面多了 4 团光斑,但离“全部 24 盏”还差得远,而且 8 已经是硬上限。把地面拆成小块后,每一块只被附近少数几盏灯照到,4 盏的额度绰绰有余,画面就和 Forward+ 一样了。这正是 Forward 时代的经典做法:大面积的地形、地面要切块。代价是 Draw Call 和剔除开销增加——Forward+ 从根本上消除了这个两难。
渲染路径怎么选
| 考量 | Forward | Forward+ | 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。
本案例出自《URP 渲染实战》第 2 章「URP 架构与一帧的流程」。在章节中阅读上下文 →