跳转至

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 为:

\[ E(\mu_o) = \int_{0}^{2\pi} \int_{0}^{1} f(\mu_o, \mu_i, \phi) \mu_i d\mu_i d\phi \]

其中 \(\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)\)

\[ \begin{aligned} E_{\mathrm{ms}}\left(\mu_{o}\right) &= \int_{0}^{2 \pi} \int_{0}^{1} f_{\mathrm{ms}}\left(\mu_{o}, \mu_{i}, \phi\right) \mu_{i} \mathrm{d} \mu_{i} \mathrm{d} \phi \\ &= 2 \pi \int_{0}^{1} \frac{\left(1-E\left(\mu_{o}\right)\right)\left(1-E\left(\mu_{i}\right)\right)}{\pi\left(1-E_{\mathrm{avg}}\right)} \mu_{i} \mathrm{d} \mu_{i} \\ &= 2 \frac{1-E\left(\mu_{o}\right)}{1-E_{\mathrm{avg}}} \int_{0}^{1}\left(1-E\left(\mu_{i}\right)\right) \mu_{i} \mathrm{d} \mu_{i} \\ &= \frac{1-E\left(\mu_{o}\right)}{1-E_{\mathrm{avg}}}\left(1-E_{\mathrm{avg}}\right) \\ &= 1-E\left(\mu_{o}\right) \end{aligned} \]

然而,无论是 \(E(\mu)\) 还是 \(E_{\text{avg}}\),它们都不是解析解。不过我们可以借助前面学到的分割和近似方法,进行预计算打表(tabulate),不过需要保证依赖的参数数量不能太多。\(E(\mu)\)\(E_{\text{avg}}\) 依赖的参数/维度分别是:

  • \(E(\mu)\):粗糙度和 \(\mu\)(2D 表格)
  • \(E_{\text{avg}}\):只有粗糙度(1D 表格)
结果


但如果 BRDF 包含颜色信息的话,意味着有部分光会被吸收,那么能量自然就会损失了。所以还需额外定义一个平均菲涅尔项,反映有多少反射出去的能量:

\[ F_{\text{avg}} = \frac{\int_{0}^{1} F(\mu) \mu \mathrm{d}\mu}{\int_{0}^{1} \mu \mathrm{d}\mu} = 2 \int_{0}^{1} F(\mu) \mu \mathrm{d}\mu \]

而之前的 \(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'\|}\)(附带归一化处理),因此渲染方程变为:

\[ \begin{aligned} L\left(\omega_{o}\right) & =L_{i} \cdot \int_{P} F\left(\omega_{i}\right) \mathrm{d} \omega_{i} \\ & =L_{i} \cdot \int_{P} \cos \left(\omega_{i}^{\prime}\right) \mathrm{d} \frac{M \omega_{i}^{\prime}}{\left\|M \omega_{i}^{\prime}\right\|} \\ & =L_{i} \cdot \int_{P^{\prime}} \cos \left(\omega_{i}^{\prime}\right) J \mathrm{~d} \omega_{i}^{\prime} \end{aligned} \]
  • 假设多边形光源的光是均匀分布的,所以把 \(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 追踪、双重散射、分层材质等)

评论区

如果大家有什么问题或想法,欢迎在下方留言~