关于 scenario-unity-rendering-lighting
面向图形技术美术的 Unity 渲染与照明技能,围绕 Unity 6.3 上的 URP 17.3 提供可测量的工作流。它通过脚本和可重复的质量门槛指导曝光、照明、烘焙、调色与性能检查。
主要功能
- 01URP 管线与质量层级配置
- 02使用参考卡校准曝光和照明
- 03照明烘焙审计与预算检查
- 04反射探针和漏光诊断
- 05渲染通道与性能测量
适用场景
- 01为不同设备设置图形质量层级
- 02先校准曝光再调整灯光
- 03检查烘焙照明与反射问题
- 04测量移动设备上的渲染开销
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unity-rendering-lighting安装后在 Claude Code 中输入/scenario-unity-rendering-lighting确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/ut_lighting.pyscripts/AgentKit/Lighting/LightingAudit.csLightingBake.csLightingCapture.csLightingPipeline.csLightingPost.csLightingScenes.csLightingUtil.csscripts/Runtime/AgentPlayerCapture.csAgentPSOWarmup.cs详细介绍
渲染与光照(轻量化 / 图形技术美术)
Unity 中的专业光照是一套有度量的循环:先校准曝光,再以锚点为准布光、烘焙、调色;在追求审美之前,先用数字(灰卡、过曝、烘焙内存、原生 Pass)从同一组相机书签评估每个阶段。本技能通过代码驱动 Unity 6.3 中的 URP 17.3;此处所有内容均于 2026-09-24 在 Apple M5 Max(Metal)上的 Unity 6000.3.21f1 中运行。如果这里提到的某个相关技能不在你的可用技能中,请让用户安装它
(npx skills add scenario-labs/skills --skill <name>);若需无人值守地继续,请根据工具架构推进,并指出这一缺口。
必备背景: scenario-unity-expert(通道、ut_run、AgentCapture、AgentProfile、
ut_review、6.3 陷阱)。
核心立场(专家的关键差异)
- 先曝光,后布光(Pierre Yves Donzallaz,yqCHiZrgKzs [00:20:21])。URP 6.3 只有 固定曝光:每个区域设置一个 Post Exposure,根据 18% 灰卡解算灯光(未辅助的 太阳读数为 2.0,在没有色调映射器时为 +1.03 EV;在 Neutral 下,解算后的读数为 0.98,即 +0.16 EV)。
- 烘焙后变灰是预期现象;应在早期选定的色调映射器下通过后期处理修正(Kyle Banks, 1agSNKuAfTM [00:04:58];PYD [01:01:29]):Lookdev 使用 Neutral;对比度、饱和度、 Shadows Midtones Highlights 推得过头后,再调回来。ACES 会使画面变暗(K3-wPnhmDi4 [00:54:50];实测 -1.4 EV):在它的设置下重新解算曝光。
- 先调阴影距离,再调分辨率(6.3 Manual;HCXCmHgV7Sk [00:15:32]):10 m 范围内的 1024 分辨率,胜过 40 m 范围内的 2048 分辨率。Max Distance = 玩家能看到的最远动态 阴影;最后一个级联应在最后一个投射体处结束。带软阴影的风格化房间中,1024 是最佳 选择;更高分辨率看起来“过于锐利”(URP 电子书)。
- 实际渲染所用的是 Quality 级别的资源,后期处理也一样(URPS [00:03:14], [00:30:06])。编辑前先确认并报告。Unity 6 会按参数叠加 Graphics 默认配置文件、当前 URP 资源的配置文件,然后是场景 Volume;依赖质量层级的后期效果(Bloom 成本、DoF、 APV 漏光减弱)应放在各层级的资源配置文件中,绝不能放进场景 Volume,因为后者会在 所有层级中生效(实测)。模板中的两个资源共用一个配置文件,并使用 Neutral 色调映射器。
- 烘焙不会移动的内容;按成本拆分设置(Ciro Continisio,hMnetI4-dNY [00:35:51]): 像素密度、最大尺寸、方向模式和 Shadowmask 会占用内存;采样数和反弹次数只影响烘焙 时间。小道具应保留 Contribute GI,并将 Receive GI 设为 Light Probes([00:48:30])。 一个 Shadowmask 纹素可容纳 4 个投射阴影的 Mixed 灯光(6.3 Manual)。Lightmap 的采样 成本比 APV 低 3 到 4 倍,但占用 3 倍内存(APV24 IpVuIZYFRg4 frame 00:23:43):手机 平台的静态几何体应使用 Lightmap。
- 天空是室内的默认光源(PYD22 DlxuvvYZO4Q [00:08:17];U25 [00:45:56])。没有 烘焙 GI 和局部 Box Probe 时,室内与光滑表面会受到天空光照影响(一张 Smoothness 为 0.3 的桌子会呈灰蓝色,直到添加 Probe 才恢复正常)。
- 风格化是制作选择,不是滤镜(Kyle Banks [00:22:04] 至 [00:23:06]):一张调色板 纹理、三平面世界空间噪声、一个共享着色器(对 3 张纹理进行 7 次采样,在 Switch 上 没问题);低配层级使用 Simple Lit(URP 电子书);Subtractive 是成本最低的混合模式 (TRB)。卡通着色器仍必须采样 Lightmap、Shadowmask 和 Probes,否则烘焙结果会消失; 6.3 中需基于 URP Unlit 目标构建自定义光照(差异章节第 5 节)。
- 在平铺式 GPU 上,带宽就是预算;务必验证(6.3 Manual;U25 [00:30:26];Ryan Keeble,
bl0vKZkzNOs [00:14:30]):使用 Forward;除非确有需要,否则不要使用深度纹理或不透明
纹理(将复制操作放在 After Transparents);不使用软阴影;MSAA 设为 2x。在 Quest 2
级别的 GPU 上,每增加一个全屏 Pass,耗时 1 到 2 ms。
PassAudit会读取 Render Graph 的原生 Pass:在 After Opaques 阶段复制深度或使用 Opaque Texture,都会拆分不透明物体、 天空盒和透明物体的 Pass(实测)。
首先确认
只询问一次:平台和设备档位(计算能力或 GLES);帧预算(移动端按 65% 计算);一句情绪描述(KB [00:03:25])、参考素材、风格化还是写实;一天中的时间;哪些内容会移动;室内场景;自定义着色器;烘焙内存预算。
| 决策 | 默认值 | 何时更改 |
|---|---|---|
| 渲染管线 | URP 17.3 | 仅当 PC/主机需要其独有功能时使用 HDRP;不用于新功能、移动端、Web 或 Switch 1 (rps) |
| PC 档位 | Forward+、深度纹理、MSAA 4x、HDR 32-bit、2048 阴影(覆盖 60 m,分为 2 个级联)、软阴影 Medium、附加阴影、Distance Shadowmask(已在 Forward+ 上验证)、当绘制调用受 CPU 限制时启用 GPU Resident Drawer | 设备测试 |
| 移动端档位 | Forward,不使用深度/不透明纹理(不透明纹理也会在没有 StoreAndResolve 时静默禁用 MSAA)、MSAA 2x、渲染比例 0.85、1024 阴影(覆盖 30 m)、1 个级联、关闭软阴影、不使用附加阴影、Shadowmask 模式、偏差 0.1 / 0.5(模板中的 1 / 1 泄漏了) | 设备范围较广时:通过 copy_from 添加低端档位(Simple Lit、不使用实时阴影)[已添加] |
| 各档位后期处理 | 一个 Grading Mode (HDR) 和各处使用 LUT 32;移动端配置文件:bloom Kawase 或 Dual (6.3)、不使用 HQ filtering、Half 或 Quarter、最多 5 次迭代、不使用 DoF、不使用 SSAO、Leak Reduction Performance;PC:SSAO Downsample、Leak Reduction Quality | 美术方向 |
| 全局光照 | 静态几何体使用光照贴图,并搭配 Mixed sun(当手机档位会烘焙静态太阳阴影时使用 Shadowmask,否则使用 Baked Indirect);动态物体使用 APV;开放或布局会变化的场景:仅使用 APV | 低端风格化项目使用 Subtractive (CC [00:41:17]);一天中的不同时间使用 APV 场景或天空遮蔽 |
| 探针 | Adaptive Probe Volumes | 不支持计算时使用 Light Probe Groups,或需要移动探针时使用 (APV24 [00:08:31]) |
| 抗锯齿 | PC 使用 MSAA 4x 或 TAA/STP;移动端使用 MSAA 2x 或 FXAA | TAA/STP 绝不与 MSAA、堆叠或动态分辨率同时使用;GLES 上不使用 STP |
工作流
对于任何会渲染或烘焙的操作,使用 ut_run.run_method(P, "AgentKit.Lighting....", args, graphics=True);仅报告、档位、体积和审计使用 -nographics(它无法烘焙 GI:Bake 会拒绝执行)。普通命令(L.raw_command):
Unity -batchmode -nographics -quit -projectPath P -logFile <job>/unity.log -executeMethod <method> -agentJob <job>,
参数位于 <job>/args.json,结果在 AGENT_RESULT 行中。完整代码和结果:
references/procedures.md。
- 报告管线。
LightingPipeline.ReportPipeline:每个关卡的资源、渲染器、功能、资源配置文件、GRD 前置条件。GATE:每个关卡都有自己的资源。 - 将档位作为数据配置。
ConfigureTiers(asset_props、renderer_props、quality_props、renderer_features、volume_profile+volume_overrides,以及用于 BRG 变体和静态批处理的项目graphics),然后在新进程中运行 ReportPipeline,再运行L.tier_check。GATE:0 个不匹配、0 个错误(档位不匹配、GRD 链、未启用 Use Rendering Layers 的 APV 遮罩)。 - 书签和色卡。
AgentView_*摄像机、灰色色卡(太阳光、阴影区、每个区域一张),室内放置一颗镀铬球;CaptureStage。GATE:L.stage_review错误数为 0;色卡表已打开。 - 先确定曝光,再布置灯光。 Lookdev 体积(Neutral,固定 Post Exposure);太阳光
I * 2^-EV(card);其他灯光按比例设置;区域曝光体积的优先级设为 1。GATE:受阳光照射的色卡与目标曝光相差不超过半档;太阳光与阴影区最多相差 4 档[新增]。 - 烘焙。 先运行
LightingAudit.AuditLighting(贡献对象、光照贴图 UV、无法显示烘焙结果或参与烘焙的着色器、Shadowmask 重叠、style: "stylized"规则),再运行LightingBake.Bake生成预览,最后生成最终结果。使用阴影遮罩范围场景(P13)验证每个档位实际渲染时的 Lighting Mode。GATE:烘焙报告符合预算、无 UV 警告、审计错误数为 0。 - 反射和漏光。 每个区域放置 Box 探针(重要性设为 2,混合距离设为 0.25 m)。漏光排查步骤:墙体厚度接近探针间距、APV Options 偏差值(0.1 / 0.175)、Rendering Layer 遮罩(
apv_layers,最多 4 个,重新烘焙),最后使用 Probe Adjustment Volume(APV24 [00:18:13] 至 [00:23:13])。GATE:室内中等平滑度表面不呈天蓝色(蓝色减红色小于或等于 0)。 - 调色。 在场景体积中确定最终效果,在档位配置文件中填写成本字段,并重新求解曝光。GATE:饱和度和对比度高于烘焙阶段,裁切比例不超过 5%,色卡处于范围内。
- 测量。 使用
AgentProfile+ut_stat.budget_check;逐档位运行PassAudit;采集 PC 与 Mobile 截图;针对仅在特定档位出现的异常构建开发版播放器(P12),并检查 PSO 跟踪记录和渐进式预热(P15)。GATE:将预算作为趋势指标;设备结论需在热浸测试后结合供应商 GPU 捕获结果得出(scenario-unity-mobile);Mobile 与 PC 的曝光差异不超过 0.35 EV,饱和度差异不超过 15%[新增]。
数值
| 数值 | 对照基准 | 来源 |
|---|---|---|
| EV100:14(晴天)、10(阴天)、8(日落)、6(明亮室内)、1(昏暗室内) | 现实世界参考值;URP 没有 EV,使用比例 | PYD [00:17:37] |
| 51 与 102 texels/m | 2048 覆盖 40 m,与 1024 覆盖 10 m | 6.3 Manual |
| 聚光灯 1、点光源 6、最多 16 张贴图 | 附加光源阴影图集 | 6.3 Manual |
| 256 个采样;每个纹素 4 盏灯 | 降噪器下限;阴影遮罩通道 | 6.3 Manual |
| 背景 0.2,游戏区域 1 | Scale In Lightmap | CC [00:17:30] |
| 0.20 与 0.67 至 0.83 ms;42.7 与 14.5 MB | 光照贴图与 APV 采样(PS4 1080p);内存 | APV24 |
| 1,723 / 9 / 0 / 0 px | 移动端阳光漏光:模板偏差,0.1 / 0.5、Shadowmask、Subtractive | 实测 |
| 1.33 与 0.67 MB | 室内光照贴图集,Shadowmask 与 Subtractive(512 x 512) | 实测 |
| 约 2,450 到 22 到 38 次绘制调用;主线程 / 3 | 900 个立方体,GRD 关闭与开启,编辑器播放模式 | 实测 |
| 6 / 8 / 7 个原生通道 | 移动端:关闭深度 / 在不透明物体之后复制 / 在透明物体之后 | 实测 |
| 14 个 PSO,在 5 帧内预热 | 室外场景,Metal 开发版播放器,每帧 3 个 | 实测 |
| 每个全屏通道 1 到 2 ms | Quest 2 级别的平铺渲染器 | RK [00:14:30] |
质量门槛
- 可测量: 新进程分层读取结果不匹配数为 0;ReportPipeline 和 AuditLighting 错误数为 0;
烘焙时间不超预算;最终色调映射器下的色卡处于范围内;高光剪裁最多 5%,暗部压死
最多 30%;室内的铬球不呈天蓝色;分层承诺提供远处阴影时,远处阴影必须存在
(P13);手机上不透明物体、天空盒和透明物体使用一个原生通道;将
budget_check作为趋势指标。 - 视觉: 每个阶段后检查舞台表;阴影清晰,无阴影痤疮或接缝;接合处无漏光;无天空色偏;情绪描述句能准确描述画面;移动端呈现的图像与其他平台一致
(
references/critique.md)。
常见错误
| 错误 | 表现 | 修复 |
|---|---|---|
| 凭感觉调整灯光,再靠曝光补救 | 灰卡曝光 +0.9 EV,室内光线始终无法平衡 | 使用灰卡,固定曝光,解决灯光问题 |
| 提高分辨率而不是缩短距离 | 分辨率设为 4096,靠近摄像机时仍然模糊 | 将 Max Distance 设为最后一个可见动态阴影的位置 |
在这台 Mac 上使用 CPU 光照贴图器或通过 -nographics 烘焙 | 被拒绝,或没有烘焙出任何内容 | 使用 GPU 光照贴图器,设置 graphics=True;Apple Silicon 上没有 CPU 回退方案 |
| 小型道具关闭 Contribute GI | 没有烘焙接触阴影;Shadowmask 下使用实时阴影 | 开启 Contribute GI,将 Receive GI 设为 Light Probes |
| 同一表面上有超过 4 个带阴影的 Mixed 灯光 | 多出的灯光被冻结为完全烘焙 | 使用 light.shadowmask_overlap;将多出的灯光设为 Baked 或 Realtime |
| 在光照贴图几何体上使用 Toon 或自定义着色器 | 烘焙光照和阴影消失 | 使用 light.shader_no_lightmap / no_shadowmask / no_meta;scenario-unity-shaders 会添加这些变体 |
| 在场景体积中按层级设置泛光 | Mobile 仍承担 PC 泛光开销 | 仅在层级配置文件中设置开销字段 |
| 一个层级使用 LDR,另一个使用 HDR | 调色后各层级效果不一致 | 使用统一的 Grading Mode(HDR)和 LUT 大小 |
| APV 蒙版未启用 Use Rendering Layers | 该层级忽略蒙版 | 在每个资源上启用 m_SupportsLightLayers |
| 室内没有局部反射探针 | 镀铬物体和木材反射天空 | 每个区域设置一个盒式探针,importance 设为 2 |
| 启用 Depth Priming 并使用自定义着色器 | 关闭 MSAA 后物体消失 | 添加 DepthOnly 和 DepthNormals 通道,或将 priming 设为 Disabled |
| 在薄墙上使用模板 Mobile 的 bias 1 / 1 | 沿墙面与天花板接缝出现锯齿状阳光 | 将 bias 设为 0.1 / 0.5;烘焙太阳光(Shadowmask 或 Subtractive) |
| 启用 GRD 但未配置其整套链路 | 没有任何批处理 | 启用 BRG Variants Keep All、SRP Batcher 和 Forward+,关闭静态批处理 |
交接
- **接收:**来自 scenario-unity-world-building 的白盒模型(此处检查静态标志、光照贴图 UV);来自 scenario-unity-shaders 的着色器(DepthOnly、DepthNormals、Meta 通道;使用光照贴图时的 LIGHTMAP_ON 和 SHADOWS_SHADOWMASK 变体);来自 scenario-unity-performance 和 scenario-unity-mobile 的预算。
- **交付:**层级(JSON 规范 + 回读)、层级配置、烘焙及其报告、阶段表、通道审计。交给 scenario-unity-shaders:风格化着色说明(调色板、共享着色器、在采样光照贴图、阴影遮罩和 APV 的 URP Unlit 目标上使用渐变;低层级使用 Simple Lit 变体)以及 Render Graph 通道。交给 scenario-unity-performance:GRD 基准测试 CSV 和 GPU 问题。交给 scenario-unity-mobile:Mobile 层级、各图形 API 的 PSO 跟踪、热浸测试和供应商 GPU 捕获(Xcode、Android GPU Inspector、Arm Performance Studio、Snapdragon Profiler)。交给 scenario-unity-pipeline-automation:CI 的原始命令行。2D Renderer 灯光:scenario-unity-2d。
Unity 6.3 说明
- 仅使用 Render Graph;
_CLUSTER_LIGHT_LOOP取代_FORWARD_PLUS。Render Graph Viewer 可连接到设备播放器;PassAudit通过反射读取内部信息(若其位置变动,则available: false)。 - URP 仅支持 Fixed 曝光,不支持物理光照单位、SSR 或体积效果;HDRP 处于维护阶段;Built-in 将在 6.5 中弃用。
- 功能表说明 Distance Shadowmask“仅适用于 Forward 渲染路径”(MSAA 也有相同说明);但在 6000.3.21f1 上,它在 Forward+ 中的渲染效果与 Forward 完全相同(P13)。
- GPU 光照贴图仅适用于 Apple Silicon;CPU 光照贴图将在 6.6 中弃用;OptiX 将在 6.5 中弃用。
- Bloom
filter:Gaussian、Dual、Kawase(6.3 新增)。GraphicsStateCollection为实验性功能。APVLeakReductionMode.ValidityBased是一个过时别名,ToString()会将其打印为 Performance。 - Dynamic batching 将在 6.5 中弃用。STP 会强制启用 TAA,需要 compute,绝不支持 GLES。
参考资料
references/procedures.md:P1 至 P16 的操作流程,包含可复制的代码、各自的实时测试和结果。references/critique.md:用于捕获、卡片、烘焙、反射、等级、层级和带宽的评审标准。references/expert-notes.md:专家原则、风格化方案、不同意见和观察结果。references/gui-paths.md:上述操作流程对应的窗口和菜单。references/sources.md:来源、凭据、时间戳、基线缺口、修订历史。scripts/ut_lighting.py,scripts/AgentKit/Lighting/*.cs,scripts/Runtime/*.cs(播放器辅助工具:仅用于验证构建)。