约 个字 行代码 预计阅读时间 分钟
Real-Time Physically-Based Materials
基于物理的渲染(physical-based rendering, PBR)是指任何被渲染出来的事物都是基于物理的,涉及到材质、光照、相机、光传输等等。所以,虽然 PBR 材质通常称作「材质」,但它包含的可不仅仅只有材质。
在 RTR 领域,PBR 的进展比离线渲染要落后很多(材质数量少,准确度低),而且 RTR 中的 "PB" 通常不见得真的是「基于物理的」。
-
对于表面,主要是微表面模型(使用不当,因此不是 PBR)和迪士尼原则下的 BRDF(对艺术家友好,但仍非 PBR)
-
对于体积,主要关注快速且近似的单次散射和多次散射(适用于云、头发、皮肤等)
-
通常没有太多新理论,但有很多实现技巧
- 尽管如此,性能(速度)仍是关键考量因素
Microfacet BRDF
回顾:材质与外观
NDF
NDF 全称为法线分布函数(normal distribution function),所以和统计学中的正态分布(normal distribution)没有关系。相关的描述模型有:
-
Beckmann NDF:与高斯分布类似,但是定义在斜率空间(slope space)上
\[ D(h) = \frac{e^{-\frac{\tan^2 \theta_h}{\alpha^2}}}{\pi \alpha^2 \cos^4 \theta_h} \]- \(\alpha\):表面粗糙度(数值越小,越接近镜面/高光效果)(对应高斯函数的标准差 \(\sigma\))
- \(\theta_h\):半程向量 \(h\) 和法线 \(n\) 之间的夹角
- 描述了各向同性的结果(但也能用来表示各向异性,这里就不展开介绍了)
- 无论角度多大,永远都是有值的,保证微表面不会朝下
- 分母部分的 2 次和 4 次幂是在做归一化处理(涉及到投影立体角的概念)
-
GGX(或 Trowbridge-Reitz)
-
典型特征:长尾(衰减到掠射角的时候衰减速度放缓,因此相比 Beckmann 值会大些)
-
比较 Beckmann 和 GGX:相比 Beckmann,GGX 的过渡会更加自然
-
扩展 GGX(由来自 WDAS 的 Brent Burley 实现)
- GTR(广义 Trowbridge-Reitz 分布)
- 更长的拖尾
-
Shadowing-masking term
阴影遮蔽项(shadow-masking term)(又称几何项)\(G\)
- 用于统计微表面自遮挡的量
- 阴影 -> 光,遮蔽 -> 眼睛
-
提供暗化效果,特别是在掠射角周围
-
重要性:假设没有 \(G\) 项,当入射/出射角为掠射角时,物体表面会变得超级亮!
-
常用的阴影遮蔽项是 Smith 阴影遮蔽项,它解耦了阴影与遮蔽:\(G(\mathbf{i, o, m}) \approx G_1(\mathbf{i, m}) G_1(\mathbf{o, m})\)
Kulla-Conty Approximation for Multiple Bounces
处理好微表面 BRDF 的 \(F, N, G\) 三项后,我们还会遇到一个问题:随着粗糙度的增加,物体看起来会越来越暗,说明能量发生了损失。
图片所示有一个专门的测试,叫做白炉测试(white furnace test),用来测试 BRDF 有无能量损失。
下图解释了为什么粗糙表面能量损失越严重:越粗糙的表面会有越多越深的沟壑,所以某个微表面的反射光很有可能被另一个微表面挡住,人眼看不到这些反射光,自然觉得能量损失了。
既然损失了能量,就得试图补回来。虽然存在精确的补偿方法(基于模拟的方法),但对 RTR 而言太慢了。一个基本的思路是:被遮挡意味着需要再弹射一次。
出射光的 2D BRDF lobe 为:
其中 \(\mu = \sin \theta\)
关键思路:
- 我们可以设计一个额外的 lobe,其积分结果为 \(1 - E(\mu_o)\)(即损失的能量)
- 出射 BRDF lobe 可因入射方向不同而异
- 考虑到光路可逆性(reciprocity),它应具有以下形式:\(c(1 - E(\mu_i))(1 - E(\mu_o))\)
其中 \(c = \pi (1 - E_{\text{avg}})\),而 \(E_{\text{avg}} = 2 \int_0^1 E(\mu) \mu d \mu\)。验证一下,发现 BRDF 函数 \(c(1 - E(\mu_i))(1 - E(\mu_o))\) 的积分结果确实是 \(1 - E(\mu_o)\)。

然而,无论是 \(E(\mu)\) 还是 \(E_{\text{avg}}\),它们都不是解析解。不过我们可以借助前面学到的分割和近似方法,进行预计算或打表(tabulate),不过需要保证依赖的参数数量不能太多。\(E(\mu)\) 和 \(E_{\text{avg}}\) 依赖的参数/维度分别是:
- \(E(\mu)\):粗糙度和 \(\mu\)(2D 表格)
- \(E_{\text{avg}}\):只有粗糙度(1D 表格)
结果
但如果 BRDF 包含颜色信息的话,意味着有部分光会被吸收,那么能量自然就会损失了。所以还需额外定义一个平均菲涅尔项,反映有多少反射出去的能量:
而之前的 \(E_{\text{avg}}\) 对应有多少能量为我们所见,但不会参与到后续多次弹射。
因此,关于能量(颜色)看到的比例:
- 直接能看到的:\(F_{\text{avg}} E_{\text{avg}}\)
- 弹射一次后能看到的:\(F_{\text{avg}} (1 - E_{\text{avg}}) \cdot F_{\text{avg}} E_{\text{avg}}\)
- ...
- 弹射 \(k\) 次后能看到的:\(F_{\text{avg}}^k (1 - E_{\text{avg}})^k \cdot F_{\text{avg}} E_{\text{avg}}\)
将这些全部加起来(求级数),可以得到颜色项 \(\dfrac{F_{\text{avg}} E_{\text{avg}}}{1 - F_{\text{avg}}(1 - E_{\text{avg}})}\)。它可以直接和无颜色的补偿 BRDF 相乘。
结果
最近有一种不好的现象是将微表面 BRDF 和漫反射 lobe 相结合,这在计算机视觉的材质识别领域尤为普遍。这实际上是一种完全错误的做法。
- 物理上完全不正确
- 无法保证能量守恒(原来在 Kulla-Conty 法中得到修正,当然也可通过其他方法修正)
Linearly Transformed Cosines (LTC)
定义好为表面的 BRDF 后,接下来看如何给微表面着色。我们用到的方法是线性变换余弦(linearly transformed cosine, LTC)。
- 虽然可以用在其他 NDF 上,但主要还是用在 GGX 上
- 不考虑阴影
- 处在多边形光照(polygon shaped lighting)下
关键思路如下:
- 任何出射的 2D BRDF lobe 均可转换为余弦形式
- 光源的形状也可随之进行变换
- 在(固定的)余弦 lobe 上对变换后的光源进行积分具有解析解

观察发现:
- BRDF \(\xrightarrow{M^{-1}}\) 余弦
- 方向:\(\omega_i \xrightarrow{M^{-1}} \omega_i'\)
- 积分域:\(P \xrightarrow{M^{-1}} P'\)
具体做法就是对变量的一个简单改动:\(\omega_i = \dfrac{M \omega_i'}{\|M \omega_i'\|}\)(附带归一化处理),因此渲染方程变为:
- 假设多边形光源的光是均匀分布的,所以把 \(L_i\) 拿到积分外面来
- 对于上述积分,可以求得解析解
结果
Disney principled BRDF
动机
- 基于物理的材质在表现所有真实材料方面并不完美,比如大多数微表面模型缺乏漫反射项
- 基于物理的材质对艺术家不够友好,比如复杂的折射率 n-ik
因此迪士尼原则下的 BRDF 的高层级设计目标是保证对艺术家友好,而不必满足物理上的正确性。
这在 RTR 领域中经常被指代为 PBR。
BRDF 的设计遵循以下重要原则:
- 应使用直观表示而非物理参数
- 参数数量应尽可能少
- 参数的合理取值范围应在 0 到 1 之间
- 在合理情况下,允许参数超出其常规范围
- 所有参数组合都应尽可能稳健且符合实际
下面是一张显示各参数影响的表格:
- 横着的参数表示金属性
- 随着参数空间的增长,部分参数的效果可能会有重合的地方
优点
- 易于理解/控制
- 单个模型可以支持大量材质
- 开源实现可用
缺点
- 不基于物理(但并不是很大的问题)
- 参数空间大
Non-Photorealistic Rendering (NPR)
最后来介绍一下非真实感渲染(non-photorealistic rendering, NPR)。它最大的特点是风格化(stylization)。而在 RTR 领域中,它还要求快速且可靠(reliable)。其目标是生成艺术风格的外观。
对应地有真实感渲染(photorealistic rendering)的概念。它的目标是渲染出和照片无法区分的结果,因此聚焦于光照、阴影、材质等的处理。
右图竖着劈成两半,一半是真实的,一半是渲染出来的。但原作者也忘记到底哪半边是真的...
NPR 的特点有:
- 始于真实感渲染
- 运用抽象手法
- 增强关键部分
应用场景:
-
艺术
-
可视化
-
指示
-
教育
-
娱乐
-
...
应用
我们可以总结出以下风格:
- 粗犷轮廓(实为外框线条)
- 色块
- 表面笔触
Outline Rendering

轮廓(outlines)不仅仅是外形(coutours),还包括
- 边界/边缘线(boundary/border edge)(B)
- 折痕线(crease)(C)
- 材质边缘线(material edge)(M)
- 图中蓝色和粉色部分代表两种不同材质
- 剪影边缘(silhouette edge)(S)
轮廓渲染的方式有:
-
着色(shading):对法线轮廓边缘(剪影边缘)着色,即在着色法线与观察方向垂直的表面区域加深颜色
- 问题:边缘粗细可能不同
-
几何(geometry):背面加厚(backface fattening)
- 正常渲染正面
- 加厚背面,然后再次渲染
- 扩展:沿顶点法线方向加厚
-
图像(image):边缘检测(edge detection)
-
通常使用 Sobel 检测器
-
可能可以在不同信息上生效
-
Color Blocks
色块的两种不同实现方式:
- 硬着色(hard shading):针对着色的阈值处理
- 色彩简化(posterization):针对最终图像颜色的阈值处理
我们可以设置多个阈值,而不是只有一个阈值,这便是量化(quantization)。
可以在不同部分上运用不同的量化方法:
Strokes Surface Stylization
有时我们不希望这种色块风,而想要素描风。思路是将逐点的着色替换为预生成的笔触纹理(stroke textures)。这时需要考虑密度和连续性的问题。
- 密度(density):格子的密度有多细,越细看起来越黑
- 连续性(continuity)
人们研究出各种不同密度的纹理,形成下面这些色调艺术图(tonal art maps, TAMs):
- 包括不同密度的笔触
- 每种密度均配有 MIPMAP
例子
注
- 虽然 NPR 以艺术为导向,但还是需要具备将艺术家需求转化为渲染洞察的能力,比如对边缘的处理
- 沟通至关重要,有时需逐角色,甚至逐部分考虑
- NPR 没有做好,很有可能是真实感模型就没搭建好——这对 NPR 而言至关重要!
-
例子:布料
-
注意
之后不会介绍不涉及体积/散射材质,因为相关技术太复杂啦(比如人脸、毛发等):
- 依赖项过多(RTE、BSSRDF(次表面散射 BRDF)、单次/多次散射等)
- 将在离线渲染中全面讲解,并结合实时渲染技术(如 Delta 追踪、双重散射、分层材质等)
评论区