Banner

「PBR 系列」第一篇 · 理论基石:从渲染方程到 Cook-Torrance 框架

核心结论:PBR 不是某一个公式,而是一个由「渲染方程 + 微表面理论 + 能量守恒 + 互易性」构成的框架。Cook-Torrance 把镜面 BRDF 拆成 D / G / F 三项,于是后续四十年的工作都可以归类到对这三项的精修——以及对 Lambert 漫反射的扩展。


一、为什么需要 PBR

在 PBR 出现之前,实时渲染由 Phong(1975)与 Blinn-Phong(1977)统治了将近三十年。但当游戏走向开放世界、资产规模上万、跨光照场景一致性变成硬需求时,经验模型的几个根本缺陷无可回避:

  • 无能量守恒:Specular 项可以任意拉到超过入射能量,shininess 与高光强度耦合到无法独立调整;
  • 无菲涅尔:所有视角下反射率恒定,金属和塑料只能靠美术经验”硬调”;
  • 高光形状失真:粗糙度变化时,高光既不会拉长也不会出现长尾,与实测 BRDF 数据库(MERL 100 等)拟合误差极大;
  • 金属/电介质未分离:缺乏 metallic 工作流的概念,资产在不同 HDRI 下表现不一致。

PBR 的目标,是建立一套物理保真度可验证、参数跨光照一致、跨引擎跨美术可移植的着色框架。

PBR 核心理论
PBR核心理论

注意:基于物理的渲染只是基于现实物理特性的渲染,并不能完全与现实物理一致。

严格区分的话,PBS(Physically Based Shading) 仅指基于物理的着色,而 PBR(Physically Based Rendering) 包括 PBS、基于物理的光照(PBL)、基于物理的摄像等更完整的流水线。日常语境下两者常被混用。


二、渲染方程:所有 PBR 的元规则

1986 年 Kajiya 在 SIGGRAPH 提出的渲染方程是全局光照的”宪法条文”:

它说的是:从表面点 沿出射方向 离开的辐亮度 ,等于该点自身发光 ,加上半球域 内所有入射光 经 BRDF 加权后的积分。整个 PBR 的所有努力,本质上都在解决同一个问题:在能量守恒约束下,找到一个既物理合理又能在 GPU 上实时求值的

2.1 PBR 的两条核心公理

能量守恒:表面反射的总能量不超过入射能量

这条公理决定了「白炉测试」能成为 BRDF 的终极裁判。

亥姆霍兹互易性(Helmholtz Reciprocity):交换入射出射方向,BRDF 值不变

这条公理是路径追踪、双向路径追踪、重要性采样能正确工作的前提。


三、BxDF 术语家族

PBR 论文里频繁出现的 BRDF / BTDF / BSDF / BSSRDF 容易混淆。它们的关系本质上是按光线”去往何处”做的分类:

术语 全称 物理意义
BRDF Bidirectional Reflectance Distribution Function 不透明表面反射的方向与能量分布,PBR 最核心
BTDF Bidirectional Transmittance Distribution Function 光线穿过半透明介质(玻璃、水)时的折射与透射
BSDF Bidirectional Scattering Distribution Function BRDF 与 BTDF 的统称,覆盖反射与透射
BSSRDF Bidirectional Surface Scattering Reflectance Distribution Function 光线射入材质内部,多次散射后从不同点射出(皮肤、玉石、大理石)

工程上的关键区别在于积分维度:BRDF / BTDF / BSDF 都是 4 维函数(入射 + 出射方向),而 BSSRDF 是 8 维(入射 + 出射方向 × 入射 + 出射位置)。这也是为什么次表面散射在实时渲染中始终需要近似简化(详见第五篇)。


四、光与物质交互:建立宏观能量直觉

在一头扎进 D、G、F 三项的繁杂数学之前,我们必须先弄懂一个根本问题:光打到物体上之后,到底经历了什么?
如果直接从 Cook-Torrance 公式起手,里面每一项都会像是凭空捏造的工程符号。但只要我们顺着「宏观的两种光学现象 金属与电介质的本质鸿沟 微观表面的统计规律」建立起递进的物理直觉,您就会发现,后续所有的公式推导,不过是这套物理图像自然而然的数学投影。

4.1 光学现象:反射与折射

把视角放到一个最简单的物理实验:一束光打到一个不透明物体的表面上。在宏观尺度(先不谈微表面),光只有两条命运:

一:在表面被直接弹开(Specular Reflection)

这部分光根本没进入物体内部——它撞到表面就立即被反射出去。反射方向遵循”入射角 = 反射角”的镜面规律。这就是我们看到的高光(Specular)

二:折射进入物体内部(Refraction → Subsurface Scattering)

剩下没被弹开的光,折射进入了物体内部。在原子/分子之间它会反复碰撞、被部分吸收(产生颜色)、被多次散射。其中一部分能量在散射途中被消耗,另一部分能量经过若干次散射后从表面(通常在入射点附近)随机方向射出。这就是我们看到的漫反射(Diffuse)

光打到表面的两种命运

关键结论:能量必须耦合

由于能量守恒,漫反射的能量 = 总入射能量 − 被高光直接反射掉的能量。这是一个简单到近乎乏味的物理事实,但它是后面所有 PBR 公式的基石:

没被高光带走的光,才有资格变成漫反射。

如果一个着色模型违反了这一点(比如经典 Blinn-Phong 直接 Diffuse + Specular 相加),它一定会在某些视角下”凭空产生能量”——反射出的总能量超过入射能量。这就是 9.2 节要讨论的”能量危机”的物理根源。

4.2 金属与电介质:两种光学现象的不同分配

不同材质对反射、折射的能量分配规则截然不同。这里我们正式定义那个在 PBR 中无所不在的参数:

基础反射率 (Fresnel Reflectance at 0 Degrees):光线垂直入射时(即与法线方向重合),被表面直接反射走的能量比例。

是 PBR 中「两种光学现象能量分配」的核心参数。在不同材质上, 的取值天差地别:

金属(Conductor)

金属内部充满了自由电子,光一进入就被这些电子瞬间吸收并以电磁波形式重新辐射出去。结果是:

  • 没有漫反射(光根本没机会在内部多次散射就被吸收殆尽);
  • 极高(60%~100%),意味着大部分光直接以高光形式弹回;
  • 是有色的——金属对不同波长光的吸收/反射比例不同。
金属 (RGB, 线性空间)
金 (Au) (1.000, 0.766, 0.336)
银 (Ag) (0.972, 0.960, 0.915)
铜 (Cu) (0.955, 0.638, 0.538)
铁 (Fe) (0.562, 0.565, 0.578)
铝 (Al) (0.913, 0.921, 0.925)

金属看起来的”颜色”,本质就是它的 金子之所以是金色,不是因为它的”漫反射颜色”——金子根本没有漫反射——而是因为它的 在红绿波段高、在蓝色波段低。

电介质(Dielectric)

非金属(塑料、木头、皮肤、玻璃、瓷器、混凝土……)允许光线进入内部,因此既有漫反射也有高光。但电介质的 性质完全不同:

  • 极低(通常 2%5%,对应 IOR ≈ 1.41.6);
  • 是无色的——对所有波长一视同仁;
  • **物体的”颜色”**主要来自漫反射部分(即光在物体内部多次散射后剩下的颜色)。
电介质 (线性空间)
0.020
塑料 / 玻璃 0.040(默认)
皮肤 0.028
宝石(钻石) 0.171

工业 PBR 中绝大多数电介质都用 这个默认值——视觉差异微乎其微,但能让美术摆脱”为每种塑料调 ”的痛苦。

Metallic 工作流的物理本质

理解了上面两点,Unity URP 中那行神秘的代码就豁然开朗:

1
2
3
4
5
6
// 大多数引擎都有的关键定义
#define kDielectricSpec half4(0.04, 0.04, 0.04, 1.0 - 0.04)

// BRDFData 初始化阶段
brdfData.diffuse = albedo * (1.0 - metallic); // ① 金属时 diffuse = 0
brdfData.specular = lerp(kDielectricSpec.rgb, albedo, metallic); // ② 在 0.04 与 albedo 之间插值

这两行代码的物理含义:

  • ①:metallic = 1 时,diffuse 完全消失——因为金属没有”光进入内部再散射”的过程;
  • ②:metallic = 0 时,(电介质默认);metallic = 1 时, 直接取 albedo——这反映了”金属的颜色就是它的 ”这一事实。

metallic 参数本质上是”两种光学现象的能量分配开关”,而 是这个开关的具体表达。

学术补遗:物理学严格意义上,电介质(Dielectric) 是能够被电极化的绝缘体——电荷只能在微观范围内移动产生极化,包括气态、液态、固态甚至真空。固态电介质里玻璃、树脂、高分子聚合物都属于此类。它们的反义词就是导体(金属)。

4.3 微表面理论:宏观平坦,微观崎岖

到这里我们已经搞清楚了总能量怎么分配——但还没讨论高光和漫反射各自的形状(如何分布到不同方向)。这就是微表面理论要回答的问题。

核心假设

微表面理论(Microfacet Theory)——由 Torrance & Sparrow 在 1967 年提出——的核心假设是:

宏观上看似平坦的表面,在极微观尺度下其实由无数个完美的微小镜面(microfacets)构成。

每个微表面都是绝对镜面——它对光做严格的镜面反射。但因为这些微表面朝向各异,从宏观角度看反射光被打散到多个方向,于是宏观上的”高光”才有了模糊、有了大小、有了形状。

微表面 vs 宏观表面

哪些微表面对反射有贡献?

对于给定的入射方向 和出射方向 (以及对应的半角向量 ),只有那些法线恰好指向 的微表面,才能把入射光精确反射到出射方向。

但”朝向正确”还不够——这些微面之间还会互相遮蔽(masking)自阴影(shadowing)

  • 从光源方向看,前面的微面挡住后面的微面 → shadowing
  • 从相机方向看,前面的微面挡住后面的微面 → masking

只有”朝向正确 + 既不被遮蔽也不被阴影”的微面,才真正参与反射。

三个统计量

要把上面的物理直觉变成可计算的公式,需要三个统计量:

  1. 有多少微面朝向”正确”?(朝向半角向量 的概率密度) → 这就是后面要讲的 D 项(NDF)
  2. 这些朝向正确的微面,有多少没被遮蔽? → 这就是 G 项(Geometry)
  3. 每个微面镜面反射的强度是多少?(菲涅尔效应) → 这就是 F 项(Fresnel)

把这三个统计量乘起来,再除以一个归一化分母,就构成了下一节要讲的 Cook-Torrance 公式。

回到漫反射:对漫反射部分,微表面理论同样有效——光进入内部后的散射方向分布也受微表面统计影响,这就是 Oren-Nayar 模型的物理基础(详见 9.5 节)。


五、Cook-Torrance 框架

把 4.3 节的三个统计量整合,就得到了 Cook-Torrance 1982 年提出的镜面反射 BRDF 公式:

逐项解读:

  • 分子 :朝向正确的微面比例 × 单微面的菲涅尔反射率 × 这些微面没被遮蔽的比例;
  • 分母 :来自微面投影到宏观表面与几何归一化的精确推导(不是凭空冒出的常数 4);
  • 整体:宏观尺度上单位入射光对应的反射辐亮度密度。

这就是著名的 Cook-Torrance 框架(1982)。后续所有 specular BRDF 的发展,都是对 D / G / F 三项的精细化——而漫反射部分则在第九节单独演化。

接下来分别梳理三项的演化。


六、法线分布函数(D 项)的演化

6.1 Beckmann(1963)

Beckmann 分布假设微表面法线分布服从高斯:

物理推导严格,但实时渲染中存在两个问题:

  1. 包含 exp() 与高次方除法,运算开销大;
  2. 高光衰减过快,无法表现真实金属在掠射角的”晕染”。

6.2 Phong(标准化版)

便宜,但本质是经验拟合,没有微表面理论支撑,且高光过于”硬”。

6.3 GGX / Trowbridge-Reitz(工业标准)

GGX 由 Walter 等人在 2007 年的论文 “Microfacet Models for Refraction through Rough Surfaces” 中重新引入实时渲染(其原始形式实为 1975 年 Trowbridge-Reitz 的发现):

其中 (Disney 约定)。GGX 之所以击败 Beckmann 成为现代标准,原因有三:

  1. 长尾特性(Long Tail / Heavy Tail):高光中心衰减后并不归零,而是缓慢拖出一条尾巴,与 MERL 数据库的实测拟合显著优于 Beckmann;
  2. 解析采样可行:GGX 的 CDF 可解析反演,便于重要性采样,路径追踪与 IBL 预积分都能受益;
  3. GPU 友好:仅含一次平方倒数运算,无 exp(),ALU 成本极低。
1
2
3
4
5
6
7
// URP BRDF.hlsl 中的 GGX NDF
float D_GGX(float NoH, float roughness)
{
float a2 = roughness * roughness;
float d = (NoH * a2 - NoH) * NoH + 1.0;
return a2 / (PI * d * d);
}

注意这里巧妙利用了 (NoH * a2 - NoH) * NoH + 1.0 = NoH^2 * (a2 - 1) + 1,省一次乘法。


七、几何遮蔽函数(G 项)的演化

7.1 物理意义

G 项度量微表面之间的相互遮挡:从光源方向看不到的微表面(Shadowing)和从相机方向看不到的微表面(Masking),它们的交集才是对反射有效的微表面比例。

7.2 Cook-Torrance 隐式几何项

最早的 Cook-Torrance G 项基于 V 形凹槽假设:

物理基础薄弱,但当年 GPU 性能限制下仍被广泛采用。

7.3 Smith 模型

Smith(1967)提出更严格的统计模型:将 Shadowing 与 Masking 视为独立事件,分别用基于 NDF 的可见性函数 表达:

对 GGX,对应的 函数为:

7.4 Heitz 高度相关 Smith Joint(现代标准)

“独立性假设”在 Shadowing 与 Masking 高度相关时(例如同方向掠射)会高估能量损失。Heitz 在 2014 年的论文 “Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs” 中提出高度相关的联合可见性函数(Height-Correlated Smith Joint)

或写为:

其中 是 Heaviside 函数。这个版本在能量守恒上表现最佳,已成为 UE5、Unity HDRP、Filament 的默认实现。

7.5 工程优化:可见性项 V

由于 G 项在 BRDF 中总是与 同时出现,将其合并为单一可见性项 可消去掠射角的奇异性:

代入 GGX 后可解析化简为:

1
2
3
4
5
6
7
8
// Filament / URP 中的可见性函数
float V_SmithGGXCorrelated(float NoV, float NoL, float roughness)
{
float a2 = roughness * roughness;
float GGXV = NoL * sqrt(NoV * NoV * (1.0 - a2) + a2);
float GGXL = NoV * sqrt(NoL * NoL * (1.0 - a2) + a2);
return 0.5 / (GGXV + GGXL);
}

Hammon 还提出了一个免 sqrt 的近似:

UE4 移动端常用此版本进一步省 sqrt。


八、菲涅尔项(F 项)的演化

8.1 从 4.2 节到精确菲涅尔

第四节我们已经为 建立了直觉——光线垂直入射时被表面直接反射的比例,金属/电介质有截然不同的取值。但 仅是垂直入射这一种特殊情况。菲涅尔项 描述的是反射比随入射角变化的完整规律——掠射角下几乎全反射(),垂直入射时收敛到

完整菲涅尔方程涉及 s 偏振与 p 偏振两个分量,在实时渲染中无法直接使用。 的取值参考 4.2 节金属/电介质对照表。

8.2 Schlick 近似

Schlick(1994)的近似公式将菲涅尔项压缩到一次五次方:

1
2
3
4
float3 F_Schlick(float u, float3 f0, float f90)
{
return f0 + (f90 - f0) * pow(1.0 - u, 5.0);
}

直观理解:

  • (半角与入射光的夹角余弦);
  • 垂直入射时 ,结果为
  • 掠射角时 ,结果为

8.3 的双控

通用 Schlick 近似在 处插值。直观理解为:

决定”正面有多亮”, 决定”边缘有多亮”。

材质类型 说明
金属 基于固有颜色(如铜 0.95, 0.64, 0.54) 1.0 掠射几乎全反射
非金属 0.02~0.08(IOR 1.5 ⇒ 0.04) 1.0 塑料、皮肤、木头
布料(丝绸/天鹅绒) 0.02~0.04 0.5~1.0(艺术调控) 强化掠射反射,突出”包边亮”

这就是为什么布料的 Sheen 效果能用 Schlick 近似的 通道来艺术化控制——这点在第四篇会展开。

在大多数电介质和金属上,Schlick 近似与精确菲涅尔的误差小于 1%,但在低折射率介质(IOR < 1.4)和导体的某些波段会出现可见偏差,因此 Disney BRDF 在精确路径追踪场景下仍会使用完整菲涅尔。


九、漫反射(Diffuse)模型的演化

第四节我们从两种光学现象出发,建立了”漫反射 = 总能量 − 高光”的物理直觉。漫反射模型四十年的演化,本质上是围绕两个问题的逐步修补:

  1. 能量问题:漫反射的能量怎么和镜面反射正确分配?
  2. 形状问题:粗糙表面的漫反射真的”对所有出射方向无差别”吗?

我们按这条主线串起 Lambert → 能量危机 → Shirley 耦合 → Oren-Nayar 四个阶段,自然过渡到第二篇 Disney Diffuse 的工业折中。

9.1 理想的起点:Lambert

最简单的假设:光折射进物体内部后,被绝对均匀地散射到所有方向。BRDF 与方向完全无关:

其中 是 albedo,分母 来自半球积分归一化。

1
2
3
4
5
float Fd_Lambert()
{
return 1.0 / PI;
}
float3 Fd = diffuseColor * Fd_Lambert();

Lambert 的两个假设都是粗暴近似

  • 形状层面:现实粗糙表面(月球、混凝土、棉布)在掠射角并不”无差别”——它们边缘反而更亮(retro-reflection),Lambert 完全没体现;
  • 能量层面:Lambert 自己不知道镜面反射存在——它只管自己那份能量,不管”被高光抢走多少”。

工程脚注:Unity URP 中出于美术习惯保留亮度,diffuse 项没有除以 PI,相应地 specular 项要乘 PI 维持能量平衡——这是一个偏离物理但被引擎广泛沿用的工程妥协。

Minnaert 与早期经验修正(1941)

Lambert 之后、Shirley 之前,曾有一段”纯经验拍脑袋”的过渡期。Minnaert(1941,最初用于天文观测月球反照率)提出了一个简单的修正形式:

参数 控制边缘变暗()或变亮()。这种纯经验修正既不基于微表面统计,也不考虑能量守恒——只是工具箱里的”调参旋钮”。但它是漫反射开始脱离 Lambert 的第一次尝试。类似工作还有 Lommel-Seeliger(稀薄介质)、Hapke(行星表面),多用于天文与遥感,游戏引擎中已被 Oren-Nayar 与 Shirley 取代。

之所以在这里提到它,是为了说明:学界从 1940 年代起就意识到 Lambert 的局限,但缺乏理论框架——一头缺能量耦合的物理基础(Shirley 1997 才补上),另一头缺形状的微表面解释(Oren-Nayar 1994 才补上)。

接下来的演化,就是分别修补”能量”与”形状”这两条线索。先看更严重的”能量层面”。

9.2 灾难的发生:非耦合的能量危机

第四节我们已经知道:”被高光反射走的光,不能再变成漫反射”。但 Blinn-Phong 时代的引擎完全无视这一物理事实,直接把 Lambert 漫反射和 Phong 高光暴力相加

这条公式本身没毛病——除了它严重违反能量守恒。后果是经典的”塑料感”:

边缘过曝灾难

考虑掠射角的情况:当视线接近表面切线方向时,菲涅尔效应让镜面反射 飙升至接近全反射。物理上,此时应该几乎没有光进入物体内部,漫反射 应当显著变暗。但在 Blinn-Phong 中:

  • 漫反射 仍然按 Lambert 计算——没有任何衰减
  • 镜面反射 因菲涅尔变得很强;
  • 两者相加的总反射能量超过了入射能量。

视觉表现:物体边缘诡异地发亮、发白,整体呈现廉价塑料质感——美术只能靠手动降低 强行调和,但那又破坏了正面的高光强度。整个 PBR 出现之前,所有引擎都被这个矛盾困扰着。

调参泥潭

更糟的是这种非耦合带来的资产不可移植性

  • 在白色摄影棚下调好的塑料球,到了黄昏 HDRI 下又变成了”金属塑料怪”;
  • 同一套 albedo 在不同 specular 强度下能呈现完全不同的颜色感受;
  • 美术只能针对每个场景单独调材质,资产无法复用。

PBR 革命的第一个动机,就是结束这场能量灾难

9.3 能量的补救:Shirley 耦合模型(1997)

为终结上述灾难,Shirley 等人在 1997 年的 “A Practitioners’ Assessment of Light Reflection Models” 中首次将菲涅尔透射率引入漫反射项,把第四节那条两种光学现象的物理事实直接翻译成公式

公式

直观理解:

  • 入射时损失一次菲涅尔反射 表示有多少能量真正穿过表面进入了内部;
  • 出射时再次损失菲涅尔反射 表示从内部散射出来后,还有多少能在视线方向被观察到;
  • 两者剩下的乘积才是真正可被看到的漫反射能量。

掠射角时 ,漫反射被显著压暗——这正好回到第四节我们建立的直觉:掠射角下高光抢走几乎全部能量,漫反射应近乎消失

1
2
3
4
5
6
7
// Shirley energy-coupled diffuse 简化形式
float3 Fd_Coupled(float NoL, float NoV, float3 albedo, float3 F0)
{
float3 F_in = F_Schlick(NoL, F0); // 入射方向衰减
float3 F_out = F_Schlick(NoV, F0); // 出射方向衰减
return albedo * (1.0 - F_in) * (1.0 - F_out) / PI;
}

意义

Shirley 这一步的意义远超它本身——它第一次把高光和漫反射在物理层面锁死。从此以后任何号称 PBR 的着色模型,都必须显式或隐式地满足能量耦合约束。Disney 2012 BRDF、Frostbite Diffuse、UE4 / URP 的能量预分配(albedo * (1 - metallic)),全部源自这一思路。

历史小注:Phong 早在 Shirley 之前就尝试过类似想法,但缺乏菲涅尔的精确表达。Shirley 的贡献在于把”能量耦合”从经验拍脑袋升级为基于菲涅尔的严格数学表达。

9.4 形状的补救:Oren-Nayar 模型(1994)

Shirley 解决了能量分配问题,但还有一个独立的问题:形状失真

Lambert 假设表面是绝对平坦的——光在内部”完美均匀地散射”。但如果表面是粗糙的呢?想象月球表面布满凹凸不平的环形山、砖墙的水泥粗砂、织物的纤维交错。这些表面在掠射角下并不会变暗,反而会变亮——这就是粗糙表面的特征:逆反射(Retro-reflection)

物理直觉

Oren & Nayar 在 1994 年的 “Generalization of Lambert’s Reflectance Model” 中给出了解释:

  • 把表面建模为一系列 V 形凹槽;
  • 光在掠射方向打到 V 形凹槽时,能照亮槽内”朝向相机”的那一面;
  • 同时这些朝向相机的面相互遮蔽,限制了光向其他方向散射;
  • 净效果:掠射角看到的”亮区”比 Lambert 预测的更多

这就是为什么月球望远镜里的圆盘边缘和中心一样亮(如果是 Lambert 球应当像水滴一样边缘暗)——月球表面的粗糙度产生了 retro-reflection。

公式

其中 是粗糙度的标准差,

痛点:能量未耦合 + 性能昂贵

Oren-Nayar 解决了形状问题,但留下了两个新麻烦:

  1. 没有能量耦合:Oren-Nayar 仍然是个”独立”的漫反射,不知道镜面反射的存在。在 PBR 工作流中需要额外手动加 Shirley 的 衰减;
  2. ALU 开销:包含 sin、tan、多次条件判断,每像素几十个 ALU 指令,在性能敏感场景被认为”性价比不高”。

工程上常用一个 UE4 的简化版本:

1
2
3
4
5
6
7
half3 Diffuse_OrenNayar(half NoV, half3 albedo, half roughness)
{
half lambda = -0.5 * NoV + 1;
half lambda2 = (1 - lambda);
half fakey = (1 - lambda2 * lambda2) * 0.62;
return lerp(1, fakey, roughness) * albedo;
}

9.5 演化总结:呼唤工业界的大一统

回顾这条演化链,工业界面对的处境其实很尴尬:

模型 解决了能量? 解决了形状? 性能
Lambert 极快
Minnaert 🟡 仅经验
Shirley Coupled (1997) 中等(多次菲涅尔)
Oren-Nayar (1994) 慢(含 sin/tan)

学术界搞出了能量精确的 Shirley,又搞出了形状精确的 Oren-Nayar,但没有任何一个模型同时解决了两个问题,更没有一个能跑满 60fps

工业界急需一个”缝合怪”——既能体现能量耦合精神,又能表现 retro-reflection 形状,还能让 GPU 廉价求值。

这就是 Disney Diffuse(2012)的舞台。Burley 用一对 Schlick 的 pow5同时拟合这两种现象——它在严格能量守恒上做了妥协,但在视觉上”看起来很对”,并且只比 Lambert 多几个 ALU。

下一篇,我们就走进 Disney 的世界。


十、白炉测试(White Furnace Test)

把所有理论拼起来后,需要一个验证工具。白炉测试就是这个工具——将物体放入恒定 1.0 亮度的环境光(”白炉”)中,对纯白色金属(),理论上每个像素应当都是 1.0。任何偏暗都意味着 BRDF 损失了能量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 简化的白炉测试:对 BRDF * NoL 在半球做数值积分
float3 WhiteFurnaceTest(float3 N, float3 V, float roughness)
{
float3 sum = 0;
const int N_SAMPLES = 1024;
for (int i = 0; i < N_SAMPLES; ++i)
{
float2 Xi = Hammersley(i, N_SAMPLES);
float3 H = ImportanceSampleGGX(Xi, N, roughness);
float3 L = reflect(-V, H);
float NoL = saturate(dot(N, L));
sum += SpecularBRDF(L, V, N, roughness, 1.0) * NoL;
}
return sum / N_SAMPLES;
}

实测会发现:单次散射的 Cook-Torrance 在高粗糙度下能量明显损失( 而非 1.0),这是因为模型只考虑了光线的”一次反射”。这条线索会在第五篇 Kulla-Conty 补偿处展开。


十一、本篇总结

第一篇我们走完了一条完整的物理 → 数学 → 工程链条:

物理基础

  • 光打到物体表面只有两种光学现象:表面反射(Specular)或折射进入内部后散射(Diffuse);
  • 总能量守恒:被高光抢走的,不能再变成漫反射;
  • 金属与电介质的差异本质上是 的差异,决定了两种光学现象的分配比例。

微表面统计

  • 宏观平坦的表面在微观下由无数微小镜面构成;
  • 三个统计量回答三个问题:D(多少朝向正确)、G(多少没被遮蔽)、F(每个微面反多少);
  • Cook-Torrance 把它们组合成

D / F / G 三项与漫反射的演化

概念 关键演化路径 工程实现
渲染方程 Kajiya 1986 URP LightingPhysicallyBased()
NDF (D) Beckmann → Phong → GGX D_GGX()
几何项 (G/V) 隐式 → Smith → Smith Joint V_SmithGGXCorrelated()
菲涅尔 (F) 精确 → Schlick (双控 ) F_Schlick()
漫反射 Lambert → 能量危机 → Shirley → Oren-Nayar 见第二篇 Disney Diffuse

留下两个待解问题

  1. 能量+形状的统一:学术界给出了 Shirley(能量精确)与 Oren-Nayar(形状精确),但没有任何模型同时解决两者,更没有能在 60fps 下跑动的统一方案;
  2. 参数化标准:每个 BRDF 项的参数(、各向异性等)如何打包成一组美术友好、跨引擎可移植的统一接口?

这两个问题都将在 Disney Principled BRDF(第二篇)中得到工业界的统一答案。


十二、工程调试

Diffuse 项的能量溢出排查

如果你在自定义 PBR shader 中观察到”白色塑料球比白色金属球还亮”,几乎可以肯定是 diffuse 没做能量耦合。检查清单:

  1. 关闭直接光,只看 IBL:纯漫反射输出应当 ≤ albedo(理论上限);如果偏亮,说明 specular IBL 也被算进了 diffuse 通道;
  2. 抓帧看 G-Buffer:在 RenderDoc / Frame Debugger 里查 _GBuffer0(diffuse)通道,纯白塑料应当显示约 (0.96, 0.96, 0.96),剩 4% 给了
  3. 检查 metallic 边界:metallic = 1.0 时,diffuse 通道必须为 0;任何残留都是工作流 bug。

NoV 边界 NaN

F_Schlick(NoV, F0) 中如果 ,结果是 ,不会 NaN;但在 V_SmithGGXCorrelated 中分母 时退化。常见做法:

1
float NoV = abs(dot(n, v)) + 1e-5;   // 防 0;abs 处理背面法线

abs 而非 saturate 是为了背面光照的合理性(双面材质如树叶、纸)。

视锥外 Hammersley 序列偏差

烘焙 BRDF LUT 时,如果 importance sampling 的方向 L 落在表面下方(NoL ≤ 0),必须 continue 跳过——不要简单地 saturate,否则积分误差会累积导致 LUT 噪声。


参考文献

  1. Kajiya, J. T. (1986). The Rendering Equation. SIGGRAPH ‘86.
  2. Cook, R. L., & Torrance, K. E. (1982). A Reflectance Model for Computer Graphics. ACM TOG.
  3. Walter, B., et al. (2007). Microfacet Models for Refraction through Rough Surfaces. EGSR.
  4. Heitz, E. (2014). Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. JCGT.
  5. Schlick, C. (1994). An Inexpensive BRDF Model for Physically-based Rendering. EG.
  6. Oren, M., & Nayar, S. K. (1994). Generalization of Lambert’s Reflectance Model. SIGGRAPH ‘94.
  7. Shirley, P., et al. (1997). A Practitioners’ Assessment of Light Reflection Models. Pacific Graphics.
  8. Minnaert, M. (1941). The reciprocity principle in lunar photometry. Astrophysical Journal.
  9. Hammon, E. (2017). PBR Diffuse Lighting for GGX+Smith Microsurfaces. GDC.
  10. QianMo. PBR-White-Paper. GitHub.
  11. LearnOpenGL CN. PBR 理论.