URP 渲染实战 / 第 12 章 PBR 进阶材质 / 案例 12.9
案例 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 和光源循环包装成一个函数即可。