☰
PBR材质革命:填对参数,光照再变也不假
2026/10/7 9:24:33 网站建设 项目流程

一句话说清它解决了什么:

以前做材质是"调到好看",PBR 是"填入物理属性,然后在任何光照下都自动好看"。

旧流程里,一个金属在白天的场景调好了,搬到夜晚场景就不对了,要重新调。PBR 的目标是:材质只描述"这个表面是什么",光照怎么变都不用改。


一、核心思想:能量守恒

PBR 的全部约束其实就一条物理常识:

打到表面的光 = 反射掉的 + 吸收掉的 ☀ 入射光 ↘ ──────────── 表面 ↗ ↘ 反射 进入内部(被吸收或散射后出来) 反射的不能比入射的多。

旧的做法里,你可以把漫反射和高光都调到很亮,总反射超过入射——物理上不可能,所以在换光照后会显得假。PBR 的参数设计从机制上防止你这么做。


二、光打到表面会发生两件事

理解这两件事,PBR 的参数就全通了。

☀ ↘ ┌─────────────────────┐ │ ① 直接弹回来 → 高光 (Specular) │ 保留光源的颜色 │ │ ② 钻进材质内部 → 漫反射 (Diffuse) │ 被染上材质自己的颜色,再散射出来 └─────────────────────┘
高光(镜面反射)漫反射
来源表面直接弹回进入内部散射后出来
颜色光源的颜色物体自身的颜色
方向集中(有角度)四面八方均匀

金属和非金属的区别,就在于这两者的配比:

非金属(塑料、木头、皮肤、石头) ☀ ↘ ──────── 少量高光(白色) + 大量漫反射(物体颜色) → 所以你能看到塑料是红的,同时表面有白色反光 金属(铁、金、铜) ☀ ↘ ──────── 全是高光(带金属自己的颜色) + 几乎没有漫反射 → 所以金属没有"固有颜色",只有"反射环境的颜色"

这个区别很关键:金属之所以看起来像金属,是因为它只反射环境,不自己"发色"。所以一块金属放在纯黑房间里,你什么都看不见。


三、五个参数,逐个说清

主流的 PBR 流程叫Metallic/Roughness(金属度/粗糙度),参数就这几个。

① Albedo / Base Color — 基础颜色

非金属: 物体的固有颜色(红塑料就填红色) 金属: 金属的反射颜色(金填金黄,铁填浅灰)

最容易犯的错:把光影画进贴图里。

❌ 贴图里画了阴影、高光、AO → 引擎再打一次光,变成"双重光影",看起来很脏 ✅ 贴图只有纯粹的颜色,平的 → 光影全部交给引擎实时计算

这是旧流程转 PBR 时最大的习惯改变。Albedo 应该看起来"平淡无味",像在均匀阴天拍的。

② Metallic — 金属度

0 = 非金属 1 = 金属

它基本是一个开关,不是滑条。现实中没有"半金属"材质。

✅ 正确用法:0 或 1,中间值只用在"金属和非金属的交界像素" (比如掉漆的金属,漆是 0、露出的铁是 1) ❌ 错误用法:把 Metallic 设成 0.5 让东西"有点金属感" → 结果既不像金属也不像塑料,一片灰糊

生锈、油漆、灰尘覆盖的地方 =非金属(0),因为你看到的是锈和漆,不是底下的铁。

③ Roughness — 粗糙度

控制表面微观的平整程度,决定高光是"一个点"还是"一大片"。

Roughness = 0 (光滑) Roughness = 1 (粗糙) ☀ ☀ ↘ ↘ ───────── ╱╲╱╲╱╲╱╲ ↗ 集中反射 ↗↑↖→↙ 各方向散开 像镜子 像磨砂 高光是个小亮点 高光是一大片柔和的 环境反射清晰 环境反射模糊
0.0 ─── 镜子、抛光金属、平静水面 0.2 ─── 光滑塑料、车漆 0.4 ─── 皮革、抛光木头 0.6 ─── 混凝土、树皮 0.9 ─── 粗布、绒面 1.0 ─── 完全漫反射(现实中很少)

粗糙度贴图是让材质"真实"的头号要素。现实中没有任何表面是均匀粗糙的——用过的东西会有磨亮的边角、沾手印的地方、积灰的凹陷。这些变化全靠粗糙度贴图表现。

一个均匀粗糙度的材质,不管颜色多漂亮,看起来都会像塑料玩具。

④ Normal Map — 法线贴图

用一张图骗引擎"这里的表面朝向变了",从而在平面上做出凹凸的光影,不增加任何面数。

实际模型:平的一个面 法线贴图:告诉每个像素"你的朝向是斜的" 结果: 看起来有砖缝、有划痕、有布纹

那种紫蓝色的图就是法线贴图,RGB 三个通道存的是朝向的 XYZ。

注意:它只骗光影,不改轮廓。所以侧面看会露馅,深度大的结构还是得靠模型或视差贴图。

⑤ AO — 环境光遮蔽

标记"哪些缝隙里光进不去",让凹陷处暗一点。

┌──┐ ┌──┐ │ │ │ │ ← 凸起处光充足 ───┘ └──┘ └─── ↑ 缝隙里光被挡住,应该更暗

AO 只影响环境光,不该影响直接光照。现在很多引擎有实时 AO(SSAO),贴图 AO 主要用来补充细小结构。


四、两套流程的区别

你可能会看到另一套参数,叫Specular/Glossiness(镜面/光泽度)。

Metallic / Roughness(主流) Base Color + Metallic + Roughness → 参数少、不容易出错、省一张贴图 → 缺点:金属与非金属交界处可能有白边 Specular / Glossiness(旧,影视和部分管线仍用) Diffuse + Specular(彩色) + Glossiness → 控制更精细 → 缺点:容易填出物理上不存在的值

对游戏项目:直接用 Metallic/Roughness。Unity 的 URP/HDRP、Unreal、Substance 都以它为默认。

注意Glossiness 和 Roughness 是反的:Roughness = 1 - Glossiness。拿到素材先确认是哪套,搞反了材质会"该亮的地方糊、该糊的地方亮"。


五、贴图的颜色空间:最隐蔽的坑

这条不懂会导致"贴图看起来总差一点,但说不出哪里不对"。

贴图分两类: ① 存"颜色"的 → sRGB(要做伽马校正) Albedo / Base Color Emission ② 存"数据"的 → Linear(不做校正) Roughness Metallic Normal AO Height
❌ Roughness 贴图被当成 sRGB 读取 → 数值全部偏移 → 材质整体偏光滑或偏粗糙 → 你会不断调参数试图修正,但永远差一点 ✅ Unity 里:非颜色贴图的导入设置取消勾选 sRGB

Unity 的 Inspector 里那个sRGB (Color Texture)复选框,Roughness / Metallic / AO / Normal 全部要取消勾选。Normal 贴图如果设了Texture Type = Normal Map,Unity 会自动处理。


六、PBR 需要环境光才成立

这是初学最容易卡住的地方:

“我按教程填好了金属度和粗糙度,为什么金属看起来像一块死灰?”

因为金属靠反射环境来显形,而你的场景里没有环境。

PBR 的完整构成: 直接光照(Directional / Point Light) + 间接光照 / 环境光(IBL,通常来自 HDRI 天空盒) ↓ 正确的 PBR 效果
只有直接光 加上 HDRI 环境 ┌────────┐ ┌────────┐ │ ⚫ │ │ 🔵🟡 │ │ 死灰 │ ──► │ 反射出 │ │ 的球 │ │ 天空和 │ └────────┘ │ 地面 │ └────────┘

所以 PBR 项目必须配:

  • 一张HDRI 天空盒(或 Skybox 材质)作为环境光来源
  • 反射探针(Reflection Probe)让室内物体也有合理反射
  • 烘焙或实时的间接光

Unity 里检查Window → Rendering → Lighting,确认 Environment 里有东西。空的话金属永远是灰的。


七、Unity 里的对应关系

URP / Lit 材质: Base Map ← Albedo 贴图 (sRGB ✅) Metallic Map ← 金属度 (sRGB ❌) Smoothness ← 注意!URP 用的是 Smoothness = 1 - Roughness Normal Map ← 法线 (Type: Normal Map) Occlusion Map ← AO (sRGB ❌) Emission Map ← 自发光 (sRGB ✅)

Unity 用 Smoothness,不是 Roughness。从 Substance 导出时要么选 Unity 预设(自动反转),要么手动反转一次。这个搞错的后果很明显:所有材质的光滑/粗糙完全颠倒。

通道打包(省内存和采样次数):

Unity URP 的 Metallic Map: R 通道 → Metallic A 通道 → Smoothness 所以可以把金属度和光滑度塞进一张图

八、参考数值表

照着填,比凭感觉调快得多。

材质Base Color(大致)MetallicRoughness
新车漆任意颜色00.1
光滑塑料任意颜色00.2
磨砂塑料任意颜色00.5
皮肤肤色00.4~0.6
皮革棕色系00.5
木头(抛光)木色00.3
木头(原木)木色00.7
混凝土灰00.7
布料任意颜色00.9
铁(抛光)浅灰 #C4C4C410.1
铁(旧)浅灰10.4
铝#F5F6F610.2
金#FFD700 偏暖10.1
铜#F7BD8F10.2
生锈的铁锈红00.8

最后一行值得注意:锈是非金属。很多人把生锈区域也设成金属度 1,结果锈看起来像彩色的铬合金。


九、Albedo 的亮度范围

现实材质的反射率有上下限,超出会显得假:

最暗的现实材质(沥青、木炭) 约 50/255 ← 别用纯黑 最亮的现实材质(新雪、白漆) 约 240/255 ← 别用纯白 安全范围:50 ~ 240
❌ Albedo 填 #000000(纯黑) → 物理上不存在,吸收 100% 光线,看起来像个洞 ❌ Albedo 填 #FFFFFF(纯白) → 反射超过 100%,违反能量守恒,在亮光下会发白糊掉

十、常见问题速查

现象原因
金属看起来像死灰色塑料场景没有环境光 / HDRI
材质整体脏、像蒙了一层Albedo 里画了光影
该光滑的糊、该糊的亮Roughness 和 Smoothness 搞反了
参数怎么调都差一点非颜色贴图被当 sRGB 读了
一片灰糊、不像任何材质Metallic 填了 0.5 这类中间值
锈/漆像彩色金属锈和漆应该是 Metallic = 0
法线凹凸方向反了OpenGL / DirectX 的绿通道相反,翻转 G 通道
暗部像黑洞Albedo 太接近纯黑,提到 50 以上
亮部糊成一片白Albedo 太接近纯白,压到 240 以下
物体没有反射缺反射探针,或 Probe 没烘焙

那个法线绿通道问题值得多说一句:

OpenGL 规范(Unity、Blender、Substance 默认) → 绿通道朝上 DirectX 规范(Unreal、3ds Max 默认) → 绿通道朝下 搞错的症状:凹的地方看起来是凸的 修法:在贴图软件里反转绿通道,或在导出时选对预设

十一、就记这几条

1. PBR = 填物理属性,不是调好看。换光照不用重调 2. 金属 vs 非金属是本质区别: 金属只反射环境,非金属有自己的颜色 3. Metallic 当开关用:0 或 1,别填中间值 4. Roughness 贴图是真实感的头号功臣,别用均匀值 5. Albedo 里不要画光影,保持平淡 6. 非颜色贴图取消 sRGB 7. Unity 用 Smoothness,和 Roughness 是反的 8. 没有环境光(HDRI),金属永远是死灰的

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询