GameTech/URP 渲染实战

案例 2.3同一场景:Forward vs Forward+ vs Deferred入门

目标:用 24 盏彩色点光源照亮一块 16 米 × 16 米的地面和 15 个小球,依次切换三种渲染路径,直观对比。URP Asset 的每物体附加光上限保持默认值 4。

Assets/Cookbook/Ch02/Editor/Ch02Shots.cs(节选:paths)
[BookShot("ch02-paths", W = 640, H = 420, Panels = 3)]
static void Paths(Shot s)
{
    RenderingMode[] modes = { RenderingMode.Forward, RenderingMode.ForwardPlus, RenderingMode.Deferred };
    s.Renderer.renderingMode = modes[s.Panel];     // 相当于在 Universal Renderer Data 上切换 Rendering Path
    s.Asset.maxAdditionalLightsCount = 4;          // URP Asset 默认的“每物体附加光上限”
    ManyLightsScene(s, false);                     // 24 盏彩色点光 + 15 个球 + 一整块地面
}
图 2-10左:Forward(地面只被 4 盏灯照亮);中:Forward+;右:Deferred。后两者画面几乎一致

左图的地面上只有 4 团光斑,其余 20 盏灯“消失”了;而每个小球都比较亮——每个球是独立的物体,各自挑了离自己最近的 4 盏灯。这就是 Forward 每物体上限的典型症状:大物体丢灯。中、右两图几乎一模一样:Forward+ 与 Deferred 在“能照亮多少灯”上没有区别,它们的差异在性能特征和功能限制上,而不是画面上。