GameTech/URP 渲染实战

案例 12.9材质展台与取舍进阶

目标:把本章的材质放进同一个场景,检查它们在同一套光照下是否协调,并总结每种材质的代价与适用场合。

放在一起看,最容易发现的问题是亮度不协调。本章各材质有的严格守恒(基准、清漆、各向异性),有的只是“看起来对”(Kajiya-Kay、布料的环境 sheen、透射项),后者的亮度全靠参数。建议在项目里固定一套“标准光照场景”(一盏主光、一个已知的环境),所有材质都在这个场景里调,再拿 URP Lit 的同色球做参照。

材质相对基准的额外开销额外资源适用场合
清漆多一组 D·V·F,多一次反射探针采样可选:清漆遮罩贴图车漆、清漆木器、碳纤维、涂层塑料
各向异性D、V 稍贵,需要切线拉丝方向(切线或方向贴图)拉丝金属、锅具、CD、缎面
Kajiya-Kay 头发两次 pow,很便宜偏移噪声贴图头发、毛发、动物毛
Charlie 布料与 GGX 相当(精确 IBL 需要 LUT)丝绒、绒布、毛毡
预积分皮肤一次 LUT 采样,曲率估计LUT 贴图角色皮肤、蜡
薄片透射一次 pow厚度贴图植物、纸、耳朵、玉石
薄膜干涉(16 波长)显著,建议做成 LUT膜厚贴图肥皂泡、油膜、甲虫、回火金属

表中的“开销”只是指令层面的相对比较,实际帧时间取决于平台、屏幕占比和带宽,务必在目标设备上用 Profiler 或 GPU 抓帧实测,不要凭感觉。

✓ 推荐
只在真正需要的材质上用进阶模型;把各个特性做成 shader_feature_local 开关,未启用时编译成基准材质;把高价的计算(薄膜、布料 IBL)预积分成 LUT。
✗ 避免
做一个“全能 Uber Shader”把所有特性都用 if 动态分支打开关闭;在移动端对整个角色使用多次环境采样;在没有正确切线的模型上开各向异性。
和 Built-in 管线的差异Built-in 管线时代,类似的效果通常写成 Surface Shader 的自定义光照函数(LightingXXX)。URP 没有 Surface Shader,自定义 BRDF 只能像本章这样写完整的顶点/片元着色器,或者在 Shader Graph 里用 Custom Function 节点(第 24 章)。本章的“模板式 include”结构可以直接移植到 Custom Function 里:把 ShadeOneLight 和光源循环包装成一个函数即可。