本系列共 五篇,沿着「物理理论 → Cook-Torrance 框架 → Disney 工业化 → 引擎工程化 → 扩展模型」的脉络,系统梳理基于物理的渲染(PBR)从 1970 年代微表面理论到 2020 年代分层材质前沿的全链条。每一篇可独立阅读,但顺序串联起来能形成一张完整的 PBR 知识地图。
系列目录
第一篇 · 理论基石:从渲染方程到 Cook-Torrance 框架
由 Kajiya 渲染方程出发,建立 PBR 的两条核心公理(能量守恒 + 互易性),梳理 BxDF 术语家族(BRDF/BTDF/BSDF/BSSRDF),并沿着微表面理论展开 Cook-Torrance 框架的三项演化:
- NDF (D 项):Beckmann → Phong → GGX,长尾效应为何成为工业标准
- G 项:隐式几何项 → Smith → Heitz 的 Joint Smith
- F 项:菲涅尔精确解 → Schlick 近似 →
双控 - 漫反射:Lambert → Oren-Nayar 的逆反射修正
第二篇 · Disney Principled BRDF 全解析
本系列的核心。Burley 2012 的论文不仅是数学的整理,更是工业化的奠基。本篇详解:
- 三大设计原则(艺术导向、参数归一化、可观测)
- 11 个参数完整解析(BaseColor / Metallic / Roughness / Specular / Anisotropic / Sheen / Clearcoat / Subsurface 等)
- Disney Diffuse 公式从原始形式到 Lambert + retro-reflection 整理形式的推导
- Disney Specular(GGX + Smith + Schlick)三项的具体选型理由
- 2015 BSDF 扩展:透射、各向异性的二次迭代、薄表面材质
- 完整 HLSL 参考实现
第三篇 · 实时化工程实践:IBL、Filament 与 URP 源码
理论必须落到引擎。本篇覆盖:
- Karis Split Sum 近似:IBL 卷积积分如何被拆成「预滤波 cubemap × BRDF LUT」
- 预积分 FGD LUT:通道编码、烘焙脚本、运行时采样
- Filament 标准模型:reflectance / baseColor / roughness 的重映射理由
- URP BRDF.hlsl 源码对照:BRDFData 结构、DirectBRDF、GlobalIllumination 函数解构
- 移动端优化:half 精度、ALU 折叠、IBL mip 级联简化
- 调试三件套:白炉测试、粗糙度梯度图、金属/电介质对照
第四篇 · 布料与 Sheen 渲染:从 Charlie 到丝绸天鹅绒
布料是 Disney 框架的第一个真正”破例”——GGX 在掠射角无法表现绒毛的环形高光。本篇剖析:
- 为什么传统微表面 BRDF 在布料上失效
- Charlie 分布 vs Ashikhmin Velvet vs Neubelt 修正版
- Visibility 项三选一:V_Charlie / V_Ashikhmin / V_Neubelt
- Filament 的 cloth specular BRDF(sheen color + subsurface color 双参数)
- UE4 The Order: 1886 的方案:金属/非金属布料分类设计
- 丝绸 vs 天鹅绒:同一个 Charlie 模型如何用 roughness、F90、tangent warp 区分质感
- 各向异性布料(IllusionRP 实战代码)
第五篇 · 次表面散射与能量补偿:从 BSSRDF 到 Kulla-Conty
PBR 的最后两块拼图:高维次表面散射的近似与单次散射的能量找回。
- BRDF / BSSRDF / BTDF 的维度差异
- 扩散剖面(Diffusion Profile)与 Gaussian Sum 近似
- 主流 SSS 方案对比:Light Warping / Pre-Integrated Skin / Spherical Gaussians / Separable SSS
- Translucency 透射近似(Colin GDC 2011 的快速半透明方案)
- 多次散射的能量危机与白炉测试
- Kulla-Conty 补偿模型与预积分 LUT
- 前沿:SpongeCake 分层微薄片 BSDF(2023)
符号约定(Nomenclature)
整个系列五篇文章共用一套符号体系。为方便跨篇阅读,先统一约定如下,后续不再重复说明。
| 数学符号 | 含义 | 代码对应(HLSL/GLSL) |
|---|---|---|
| 入射光方向(指向光源) | lightDirectionWS, L |
|
| 出射方向(指向相机) | viewDirectionWS, V |
|
| 半角向量 |
halfDir, H |
|
| 宏观表面法线 | normalWS, N |
|
| 切线 / 副切线 | tangentWS, bitangentWS |
|
| 真实粗糙度 = |
roughness |
|
| 半向量 |
LoH, VoH |
|
| 垂直入射时的反射率(Schlick 基底) | F0, brdfData.specular |
|
| 掠射角时的反射率(通常为 1) | F90 |
|
| 法线分布函数(NDF) | D_GGX(...) |
|
| 几何遮蔽 / 可见性项 | V_SmithGGXCorrelated(...) |
|
| 菲涅尔项 | F_Schlick(...) |
|
| 漫反射反照率(diffuse albedo) | diffuseColor |
|
| 微薄片体积密度(仅第四、五篇用) | — |
点积速记(出现频率最高的代码变量):
| 速记 | 计算 | 物理意义 |
|---|---|---|
NoL |
入射光与法线夹角余弦,决定 Lambert 余弦衰减 | |
NoV |
视线与法线夹角余弦,加 |
|
NoH |
半角与法线夹角余弦,NDF 主输入 | |
LoH |
菲涅尔项主输入 | |
VoH |
同 LoH(半角对称时相等) |
约定:saturate(x) = clamp(x, 0, 1);所有点积在 BRDF 内默认 saturate;clamp 下限可省略时用 max(x, 1e-5) 防 NaN。
阅读建议
公式较多,建议在桌面端阅读以获得最佳数学公式渲染效果。
如果时间紧张,可以先看每篇的「核心结论」段落(在每篇开头),需要细节时再回头查公式与代码。
主要参考资料:QianMo 的 PBR-White-Paper、Burley 的 Disney Principled BRDF (2012/2015)、Karis 的 Real Shading in UE4 (2013)、Filament 文档、Unity URP 源码,以及 Imageworks、Guerrilla 等公司的 SIGGRAPH 课程笔记。