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 估计,因为准确计算的的话计算量比较大。
Normal Distribution Function,这个是法线分布函数。如果法线分布比较散,那么材质比较粗糙;反之,如果法线分布比较聚集,那么材质比较光滑。对于法线分布函数,常用的有 Beckmann 和 GGX
Beckmann NDF 的推导
首先我们做一个平行于水平面的关于球的切平面,我们认为法线与该平面的交点的分布是一个二维的正态分布,设法线与该平面的交点为 \((p,q)\),满足
然后我们考虑落在该平面上某个小区域的法线数量,从法线分布和交点分布两个角度去考虑,可以得到如下等式
然后我们计算 \(d \omega_h\) 和 \(dp dq\) 的关系
将上面这两个式子带入可得
我们用参数 \(α\) 表示“粗糙度”,常常取 \(\alpha = \sqrt2 \sigma\)
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})\) 的乘积,
在基于微表面理论的渲染模型中,若仅考虑单次光线反弹(即一次反射),会导致能量守恒被破坏——尤其在高粗糙度材质下更为明显,因为此时微表面结构复杂,光线会在多个微面元之间发生多次散射(multiple bounces),而传统模型未计入这部分“丢失”的能量
在下图中,我们可以观察到越 diffuse 的物体,越暗,因为光线在多个微面中多次弹射丢失了一些能量。
我们希望的是下面一行的结果都是一样的,经过反射后并不会丢失能量。
解决这个问题的一个方法是 The Kulla-Conty Approximation
我们假设所有光照都是1,那么所有入射的能量与出射的能量是相同的,可以得到下面的式子
入射能量为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})\)。因此,设计的补偿项应具有如下形式:
这里通过计算可以得到
Note
具体的计算如下:
对于上面这个式子的计算,\(E(\mu)\) 仅与 roughness 和 \(\mu\) 有关,所以可以预计算出相应的二维图像,这样计算的时候可供分子来查询
然后 \(E_{avg}\) 就只与 roughness 有关,是一个一维的表格,也可以提前预计算得到。
加上这一项之后,得到的结果就不会有能量衰减了,从图中可以很明显看出来
上述的推理建立在物体是白色,即不吸收能量的情况,理想的物理情况就是能量是守恒的。但是对于有颜色的情况,正常的物理情况就是会吸收一部分的能量。为此我们引入平均菲涅尔反射率 \(F_{avg}\) 的概念,表示从所有入射方向加权平均后,有多少能量被表面反射出去。
\(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}}\)
求和之后就可以得到
将这一项乘上没有颜色版本的 brdf,就可以得到最终的 brdf 项。
下图就是得到的最终版本的渲染结果
4.2 Linearly Transformed Cosines (LTC)¶
这个方法主要用于处理多边形光源的问题,但是不能处理阴影的问题。
主要的思路是任何出射的二维BRDF波瓣都可以通过线性变换映射为一个余弦波瓣,同时光源的形状也可同步进行相应变换;在此变换后,将变换后的光照在余弦波瓣上进行积分可得到解析解。
其中 \(\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)


















