材质与外观
前面几章讨论了光线如何传播、如何求交、如何用随机路径估计光照。但即使光线完全相同,打到不同表面后也会产生完全不同的画面:塑料柔和,金属强烈反光,粗糙石头高光发散,玻璃会折射和透射。
这就是材质要回答的问题:当光到达一个表面时,表面如何吸收、反射、散射或透射这些光?
材质不是“贴一张颜色图”
Section titled “材质不是“贴一张颜色图””初学图形学时,很容易把材质理解成“给模型贴图”。贴图确实很重要,但材质不是单纯的颜色图片。更准确地说,材质是一组表面规则,它决定:
- 光照到表面后,有多少能量被吸收。
- 有多少能量沿漫反射方向散开。
- 有多少能量形成高光或镜面反射。
- 表面微观起伏如何改变法线方向。
- 光是否能进入物体内部,产生透射、折射或次表面散射。
同一张基础色贴图,如果配上不同粗糙度、金属度和法线贴图,可以表现成喷漆金属、磨砂塑料、陶瓷或旧木头。材质的核心不只是“颜色是什么”,而是“光遇到这个表面后怎么分配”。
从 BRDF 看材质
Section titled “从 BRDF 看材质”在渲染方程中,材质主要藏在 fᵣ 里:
Lₒ(x, ωₒ) = Lₑ(x, ωₒ) + ∫Ω fᵣ(x, ωᵢ, ωₒ) Lᵢ(x, ωᵢ) cosθ dωᵢfᵣ 通常被称为 BRDF,也就是双向反射分布函数。它描述一个方向来的光 ωᵢ,有多少会被反射到观察方向 ωₒ。
BRDF 可以先从两个维度理解:
- 方向性。 表面是向各个方向均匀散射,还是集中反射到某个方向?
- 能量分配。 入射光有多少进入漫反射,有多少进入高光或镜面反射?
漫反射材质的方向性弱,光被分散到很多方向;镜面材质的方向性强,光集中在接近反射方向的位置。大多数真实材质都位于这两者之间。
常用材质参数
Section titled “常用材质参数”现代实时渲染和离线渲染里,常见材质参数大致可以分成几类。
基础色常叫 base color 或 albedo。它表示表面本身的颜色,但它不应该包含明显的阴影、高光或环境光。因为这些光照结果应该由渲染器根据当前灯光重新计算。
对于非金属材质,基础色主要影响漫反射颜色。对于金属材质,基础色更多影响镜面反射颜色,因为金属通常几乎没有普通漫反射。
粗糙度描述表面微观结构的混乱程度。它并不一定意味着肉眼能看到凹凸,而是指微小表面法线的分布是否集中。
- 粗糙度低:微表面方向接近一致,高光小而亮,反射更清晰。
- 粗糙度高:微表面方向分散,高光宽而暗,反射更模糊。
这就是为什么抛光金属能映出清晰环境,而磨砂金属只呈现柔和亮斑。
金属度描述材质更接近金属还是非金属。它不是简单的“更亮开关”,而是改变反射能量的分配方式。
非金属通常有明显漫反射,镜面反射颜色接近白色或浅灰;金属通常没有普通漫反射,反射颜色会被金属本身染色。例如金、铜的高光带有明显颜色。
在许多 PBR 工作流中,金属度一般接近 0 或 1,中间值更多出现在过渡、污渍、混合材质或贴图过滤结果中。
法线决定表面如何面对光源和观察者。法线贴图并不会真的改变模型轮廓,但会改变每个像素参与光照计算时使用的方向,从而制造细小凹凸的光照效果。
这类细节在近景非常重要:砖墙、织物、皮革、划痕和压花都可以通过法线变化让表面更有质感。
透明、透射与折射
Section titled “透明、透射与折射”透明度控制背景是否能透过物体被看到;透射和折射则进一步描述光进入物体后如何改变方向。玻璃、水、宝石、薄塑料膜都需要这些参数。
透明材质通常比不透明材质更难渲染,因为它会牵涉排序、深度写入、多次折射、吸收和内部反射。实时渲染中常需要在真实物理和性能之间折中。
交互辅助:调节材质外观
Section titled “交互辅助:调节材质外观”下面的小程序用一个简化的球体渲染来观察基础色、粗糙度和金属度的影响。它不是完整 PBR 渲染器,但可以帮助你建立几个关键直觉。
可以尝试:
- 把粗糙度调低,观察高光如何变小、变锐。
- 把粗糙度调高,观察高光如何扩散,反射感如何变弱。
- 把金属度调高,观察漫反射颜色如何减少,反射颜色如何更接近基础色。
- 切换基础色,观察非金属和金属对颜色的使用方式并不相同。
微表面模型直觉
Section titled “微表面模型直觉”许多 PBR 材质模型都基于微表面理论。它把一个宏观看起来平整的表面,看成由很多微小镜面组成。
粗糙度越低,这些微小镜面的方向越一致;粗糙度越高,它们的方向越分散。当光照到表面时,只有一部分微小镜面的方向刚好能把光反射到观察者眼中,于是形成高光。
这个模型解释了几个常见现象:
- 光滑表面的高光更集中,因为很多微表面朝向一致。
- 粗糙表面的高光更宽,因为能产生反射的微表面方向分布更散。
- 斜视角下表面更容易出现强反射,因为菲涅耳效应增强。
- 高光不应该凭空增加能量,反射越强,其他方向可分配的能量就越少。
菲涅耳效应描述反射强度随观察角度变化的现象。简单说:越贴近表面掠视,反射通常越强。
你可以在现实中观察玻璃桌面或水面:正面看时更透明,斜着看时更像镜子。很多非金属材质也有类似现象,只是没有玻璃那么明显。
在材质模型里,菲涅耳效应很重要,因为它让表面在不同视角下有动态变化。没有菲涅耳的材质往往会显得死板,尤其是塑料、清漆、水、玻璃和皮肤这类表面。
物理可信的材质需要遵守能量守恒:表面反射、散射、透射出去的光不能超过入射光。否则物体可能在没有光源的情况下越反弹越亮。
这对材质设计有实际意义:
- 漫反射和镜面反射不能无限叠加。
- 金属增强镜面反射时,普通漫反射通常会减少。
- 粗糙度改变高光形状时,不应该让总能量随意暴涨。
- 贴图颜色不宜全部接近纯白,否则会让间接光过强。
能量守恒不是为了让画面“保守”,而是为了让材质在不同灯光、不同场景中都更稳定。
PBR 的基本工作流
Section titled “PBR 的基本工作流”PBR 指 physically based rendering,通常翻译为基于物理的渲染。它并不是某一个固定公式,而是一组让材质更符合真实光照规律的建模原则。
常见金属度工作流会使用:
- 基础色。 表面的主颜色。
- 金属度。 控制金属与非金属行为。
- 粗糙度。 控制高光宽度和反射模糊程度。
- 法线。 控制细节光照方向。
- 环境反射。 提供来自周围环境的间接镜面光。
-
先判断材质类别。
它是非金属、金属、透明材质,还是多种材质混合? -
设置基础色。
尽量使用不带阴影和高光的颜色数据。 -
设置粗糙度。
用它决定表面是抛光、半哑光还是粗糙。 -
设置金属度或镜面参数。
区分金属和非金属,避免把金属度当作亮度滑块。 -
补充法线和细节贴图。
让表面有细小起伏、划痕和纹理方向。 -
在真实灯光下检查。
材质不能只在一个展示环境中好看,还要在不同光照里保持合理。
常见材质问题
Section titled “常见材质问题”材质调试时,可以从下面几个症状反推原因:
- 物体像塑料。 可能金属度、粗糙度或环境反射设置不合适。
- 画面过亮。 基础色过白,或者漫反射和镜面反射没有正确分配能量。
- 高光太硬。 粗糙度过低,或法线贴图细节不足。
- 高光太脏。 粗糙度贴图噪声过强,或者法线贴图空间使用错误。
- 金属发灰。 环境反射不足,或金属材质仍保留了不该有的漫反射。
- 法线方向反了。 凹凸看起来内外颠倒,常见于切线空间或绿色通道约定不一致。
材质调试的关键是分离变量。先关掉复杂光照,只看基础色;再看法线;再看粗糙度;最后打开完整环境和反射。这样比一边猜一边调要稳定得多。
本章把“材质”从颜色贴图扩展成了表面对光的响应规则:
- 材质决定光在表面如何吸收、反射、散射和透射。
- BRDF 描述入射方向到出射方向之间的反射分布。
- 基础色、粗糙度、金属度、法线和透明参数共同塑造外观。
- 微表面模型可以解释高光大小、反射模糊和粗糙度的关系。
- 菲涅耳效应让表面反射随视角变化。
- PBR 的目标是让材质在不同光照下都保持可信和稳定。
下一章会继续往复杂外观推进:当光不只是停留在表面,而是在皮肤、玉石、头发、布料、烟雾和透明介质中传播时,渲染器需要更丰富的光传输模型。