跳转至

4 Real-Time Physically-Based Materials

PBR主张整个渲染流程,包括材质、光照、相机、光传输等都应遵循物理规律,但业界通常将其狭义理解为“PBR 材质”。

对于实时渲染中的 PBR 材质,分为两种。一种在物体表面上定义,另一种在体空间上定义

  • For surfaces, mostly just microfacet models (used wrong so not PBR) and Disney principled BRDFs (artist friendly but still not PBR)
  • For volumes, mostly focused on fast and approximate single scattering and multiple scattering (for cloud, hair, skin, etc.)

4.1 Microfacet BRDF

微表面模型在 GAMES101 有相应的介绍,总结来说就是下图

微表面模型下的 brdf 项由三项组成:

Fresnel Term 项,表示光线在不同入射角下的反射比例,入射方向与法线的夹角越大,反射的光也越多。常用的估计方法是 Schlick 估计,因为准确计算的的话计算量比较大。

\[ \begin{align} R(\theta) &= R_0 + (1 - R_0)(1 - \cos\theta)^5 \\ R_0 &= \left( \frac{n_1 - n_2}{n_1 + n_2} \right)^2 \end{align} \]

Normal Distribution Function,这个是法线分布函数。如果法线分布比较散,那么材质比较粗糙;反之,如果法线分布比较聚集,那么材质比较光滑。对于法线分布函数,常用的有 Beckmann 和 GGX

Beckmann NDF 的推导

首先我们做一个平行于水平面的关于球的切平面,我们认为法线与该平面的交点的分布是一个二维的正态分布,设法线与该平面的交点为 \((p,q)\),满足

\[ P(p, q) = \frac{1}{2\pi \sigma^2} e^{-\frac{p^2 + q^2}{2\sigma^2}} \]

然后我们考虑落在该平面上某个小区域的法线数量,从法线分布和交点分布两个角度去考虑,可以得到如下等式

\[ D(\theta_h) \cos\theta_h \, \mathrm{d}\omega_h = P(p,q) \, \mathrm{d}p \, \mathrm{d}q \]

然后我们计算 \(d \omega_h\)\(dp dq\) 的关系

\[ \mathrm{d}p\,\mathrm{d}q = r\mathrm{d}\phi\, \mathrm{d}r = \tan \theta_h \mathrm{d}\phi \frac{1}{\cos^2\theta_h} \mathrm{d}\theta_h = \frac{\tan\theta_h}{\cos^2\theta_h}\mathrm{d}\phi \,\mathrm{d}\theta_h \]
\[ d\omega_h = \sin\theta_h\mathrm{d}\phi \,\mathrm{d}\theta_h \]

将上面这两个式子带入可得

\[ D(\theta_h) \cos\theta_h = P(p,q) \cdot \frac{1}{\cos^3\theta_h} \quad \Rightarrow \quad D(\theta_h) = \frac{P(p,q)}{\cos^4\theta_h} \]

我们用参数 \(α\) 表示“粗糙度”,常常取 \(\alpha = \sqrt2 \sigma\)

\[ P(p,q) = \frac{1}{\pi \alpha^2} e^{-\frac{\tan^2 \theta_h}{\alpha^2}} \]

GGX

GGX 分布也被称为 Trowbridge-Reitz。相比于 Beckmann 的分布,一大特点就是 GGX 更加丝滑,在较远处不像 Beckmann 一样直接消失,而会有比较长的尾巴。

从而使用 GGX 得到的结果,相比于 Beckmann 会更加平滑,有良好的过渡,因此被业界广泛使用

Shadowing-Masking Term:用于描述微表面之间的自遮挡效应:当光线以掠射角入射或出射时,部分微面元会被其他微面元遮挡,导致光照减弱。如果没有这一项的话,就会导致物体的边缘会非常亮,因为分母会变得非常小。

常用的模型是 Smith 模型,将整体的几何遮挡因子\(G(\mathbf{i},\mathbf{o},\mathbf{m})\) 近似解耦为入射方向与法向的遮蔽项 \(G_1(\mathbf{i},\mathbf{m})\) 和出射方向与法向的遮蔽项 \(G_1(\mathbf{o},\mathbf{m})\) 的乘积,

\[ G(\mathbf{i}, \mathbf{o}, \mathbf{m}) \approx G_1(\mathbf{i}, \mathbf{m}) G_1(\mathbf{o}, \mathbf{m}) \]


在基于微表面理论的渲染模型中,若仅考虑单次光线反弹(即一次反射),会导致能量守恒被破坏——尤其在高粗糙度材质下更为明显,因为此时微表面结构复杂,光线会在多个微面元之间发生多次散射(multiple bounces),而传统模型未计入这部分“丢失”的能量

在下图中,我们可以观察到越 diffuse 的物体,越暗,因为光线在多个微面中多次弹射丢失了一些能量。

我们希望的是下面一行的结果都是一样的,经过反射后并不会丢失能量。

解决这个问题的一个方法是 The Kulla-Conty Approximation

我们假设所有光照都是1,那么所有入射的能量与出射的能量是相同的,可以得到下面的式子

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

入射能量为1,每一个小块的能量是 \(\mu_i \, d\mu_i \, d\phi\),这一块反射出去的能力是 \(f(\mu_o, \mu_i, \phi) \, \mu_i \, d\mu_i \, d\phi\),所以最后得到的结果 \(E(\mu_o)\),应该为1

但是根据之前的分析可以知道,实际上得到的 \(E(\mu_o)\) 是不到1的,我们需要补 \(1 - E(\mu_o)\)

思路是造一个新的、附加的 BRDF 分量(称为“multiple scattering lobe”),它的积分值恰好等于 \(1−E(μ_o)\)

根据 Helmholtz 互易原理,BRDF 应满足 \(f(\mathbf{i},\mathbf{o})=f(\mathbf{o},\mathbf{i})\)。因此,设计的补偿项应具有如下形式:

\[ c \cdot (1 - E(\mu_i)) \cdot (1 - E(\mu_o)) \]

这里通过计算可以得到

\[ f_{\text{ms}}(\mu_o, \mu_i) = \frac{(1 - E(\mu_o))(1 - E(\mu_i))}{\pi (1 - E_{\text{avg}})}, \quad E_{\text{avg}} = 2 \int_0^1 E(\mu) \, \mu \, d\mu \]

Note

具体的计算如下:

\[ \begin{align*} E_{\text{ms}}(\mu_o) &= \int_0^{2\pi} \int_0^1 f_{\text{ms}}(\mu_o, \mu_i, \phi) \, \mu_i \, d\mu_i \, d\phi \\ &= 2\pi \int_0^1 \frac{(1 - E(\mu_o))(1 - E(\mu_i))}{\pi (1 - E_{\text{avg}})} \, \mu_i \, d\mu_i \\ &= 2 \frac{1 - E(\mu_o)}{1 - E_{\text{avg}}} \int_0^1 (1 - E(\mu_i)) \, \mu_i \, d\mu_i \\ &= \frac{1 - E(\mu_o)}{1 - E_{\text{avg}}} \cdot (1 - E_{\text{avg}}) \\ &= 1 - E(\mu_o) \end{align*} \]

对于上面这个式子的计算,\(E(\mu)\) 仅与 roughness 和 \(\mu\) 有关,所以可以预计算出相应的二维图像,这样计算的时候可供分子来查询

然后 \(E_{avg}\) 就只与 roughness 有关,是一个一维的表格,也可以提前预计算得到。


加上这一项之后,得到的结果就不会有能量衰减了,从图中可以很明显看出来

上述的推理建立在物体是白色,即不吸收能量的情况,理想的物理情况就是能量是守恒的。但是对于有颜色的情况,正常的物理情况就是会吸收一部分的能量。为此我们引入平均菲涅尔反射率 \(F_{avg}\) 的概念,表示从所有入射方向加权平均后,有多少能量被表面反射出去。

\[ F_{\text{avg}} = \frac{\int_0^1 F(\mu) \, \mu \, d\mu}{\int_0^1 \mu \, d\mu} = 2 \int_0^1 F(\mu) \, \mu \, d\mu \]

\(F_{avg}\) 代表有多少能量反射出去,\(E_{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}}\)

求和之后就可以得到

\[ \frac{F_{avg}E_{avg}}{1-F_{avg}(1-E_{avg})} \]

将这一项乘上没有颜色版本的 brdf,就可以得到最终的 brdf 项。

下图就是得到的最终版本的渲染结果

4.2 Linearly Transformed Cosines (LTC)

这个方法主要用于处理多边形光源的问题,但是不能处理阴影的问题。

主要的思路是任何出射的二维BRDF波瓣都可以通过线性变换映射为一个余弦波瓣,同时光源的形状也可同步进行相应变换;在此变换后,将变换后的光照在余弦波瓣上进行积分可得到解析解。

\[ \begin{align*} L(\omega_o) &= L_i \cdot \int_P F(\omega_i) \, d\omega_i \\ &= L_i \cdot \int_P \cos(\omega'_i) \, d\frac{M\omega'_i}{\|M\omega'_i\|} \\ &= L_i \cdot \int_{P'} \cos(\omega'_i) J \, d\omega'_i \quad \text{— Analytic!} \end{align*} \]

其中 \(\omega_i'\) 是变换后的角,\(M\) 是线性变换的矩阵,\(J\) 是雅可比矩阵。同时我们假设了灯每处光照都是一样的

4.3 Disney’s Principled BRDF

当前主流的微表面模型虽具物理基础,但无法完整表征所有真实材质(如常缺失漫反射项),且参数复杂,这对艺术家不友好;所以我们需要改进或重新设计基于物理的渲染(PBR)材料模型。

设计的目标是便于艺术家设计而非严格物理正确的模型。

“Principled” 指 BRDF(双向反射分布函数)的设计遵循若干核心原则:

  • 优先使用直观而非纯物理的参数;参数数量应尽可能少;
  • 各参数应在合理范围内归一化为 0 到 1;
  • 在有意义时允许参数超出该范围以增强艺术控制力;
  • 且所有参数组合都应保持稳健与视觉 plausible,确保材质表现既易用又可靠。

这里介绍的就是迪士尼提出的 Principled BRDF

可以发现这里材质的参数都是描述了一种特征,比如说金属性,各向异性等等,这便于艺术家创作合适的材质。

4.4 Non-Photorealistic Rendering (NPR)

Photorealistic Rendering 意思是如照片真实般的渲染,聚焦于光照,阴影,材质等等的真实感。Non-Photorealistic Rendering 的含义就在于产出一些艺术风格的表现,但是是基于现实的。

比如说下面这张图是现实的房子,但是有着很明显的艺术感。

风格”在视觉渲染中的具体表现:其核心特征可归纳为三点

  • 粗犷的轮廓线:强化角色与物体的边界
  • 色块化的色彩填充:取代细腻渐变,营造漫画感
  • 表面笔触纹理:模拟手绘或印刷质感


在轮廓渲染中,轮廓不仅仅包含物体外缘的剪影,而是包含四种关键边缘类型

  • 边界边(Boundary / border edge, B) —— 模型几何体的开放边缘;
  • 折痕边(Crease edge, C) —— 表面法向突变形成的硬转折线;
  • 材质边(Material edge, M) —— 不同材质或纹理区域的分界;
  • 剪影边(Silhouette edge, S) —— 从当前视角看物体与背景交界的轮廓。

对于描边,我们有三种方法,一种是从渲染的角度去做,一种是从几何的角度去做,最后一种是在图像空间去处理

从渲染角度来看,我们发现边缘的法线与视角基本就是垂直的,所以可以通过在表面区域中,将着色法线与视线方向垂直的部分进行暗化处理,从而在视觉上强化物体的轮廓边缘。

至于这里黑色的部分需要多少,可以通过调整法线与出射角度的内积的阈值来做

从几何角度来看,我们可以先正常渲染物体的正面(frontface),随后将背面(backface)沿法线方向向外“膨胀”并再次渲染,利用背面被放大后露出的边缘在视觉上形成轮廓线;

该方法可扩展为沿顶点法线(vertex normals)方向进行膨胀,以获得更平滑或可控的轮廓粗细。

在图像空间做相应的边缘检测,我们是比较熟悉的,使用一个滤波器(Sobel 算子)就可以得到相应的效果


实现“色块化”(Color blocks)风格的两种不同方法:

  • 硬着色(Hard shading) 是在光照计算阶段对明暗值进行阈值分段,直接输出阶梯状的光照结果;
  • 色调分离(Posterization) 则是在最终图像生成后,对像素颜色值进行量化或阈值处理,将连续渐变的色彩压缩为有限的几个离散色阶。

其实就是设置阈值,产生色块


Strokes Surface Stylization 的实现思想是用预生成的笔触纹理替代逐点着色计算,通过在模型表面映射不同密度、方向或形状的笔触图案来表现明暗与结构;

比如说我需要生成一个素描风格的渲染图像,就是根据渲染结果在不同密度的笔触纹理中进行采样。然后使用 mipmap 的原因是在远处如果还在同一级别上的纹理上采样的话,就会自然地导致密度变大了,所以远处需要在更高级别的 mipmap 上采样(注意这里 mipmap 的生成与之前的不太一样,基本上就是截取原先级别的一小块得到的)


NPR 本质上是艺术驱动的,但工程师需具备将艺术家抽象需求“翻译”为具体渲染技术的能力(例如将“轮廓线”转化为边缘检测算法),风格化方案往往需精细到每个角色甚至每个部件单独定制,而非套用统一模板

然后 NPR 在一定程度上是基于真实性渲染的(Photorealistic models are super important in NPR)

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!