Real-Time Physically-Based Materials

PBR不只包括了材质,但是人们提到PBR时通常指的是材质
在PBR材质方面,RTR要明显落后于离线渲染,其可用的材质不如离线渲染中的丰富
RTR中为了实时性做了大量的简化,因此RTR中的"PB"实际上通常不是真的physically based

PBR材质在RTR中主要有两类:

  • For Surfaces
    • Microfacet Models (used wrong so not PBR)
    • Disney Principled BRDFs (artist friendly but still not PBR)
      PBR_Material_Surface
  • For Volumes
    • Mostly focused on fast and approximate single scattering and multiple scattering (for cloud, hair, skin, etc.)

在RTR中,PBR材质相较GAMES101中并无太多新的理论,但是引入了许多hack的做法,毕竟性能表现在RTR中总是优先考虑的关键因素

Microfacet BRDF

微表面模型认为,物体表面虽然在宏观上具有比较一致的性质(颜色、法线分布等),但是在微观上表面由一系列微表面组成,这些微表面各自都是一个镜面,且其法线、颜色等性质各不相同
Microfacet BRDF中有如下几个关键部分
MicrofacetBRDF

  • Fresnel Term: 菲涅尔项决定以某一方向入射至该微表面的能量有多少被反射;
  • Shadowing-Masking Term:
  • Distribution of Normals: 法线分布,

Conception of Microfacet BRDF

The Fresnel Term

如GAMES101中提到的,物体表面对光的反射与光的入射角度有关,通常入射角度越接近Grazing Angle,反射的比例越大;越就近垂直入射,反射比例越小(绝缘体基本符合,对于导体情况有些不同)
FresnelTerm

Fresnel Term在物理上精确地表示需要考虑光线的S极化和P极化
但在Rendering中为了简化,通常使用Schlick’s Approximation
FresnelTermFormulae

Normal Distribution Function(NDF)

NDF是使用一个函数来描述材质的微表面的法线分布情况
NDF_GlossyAndDiffuse

NDF是个二维分布函数,因为法线的朝向是二维表示的(θ,ϕ\theta, \phi)
有许多模型可以用来描述NDF:

  • Beckmann, GGX, etc
  • Detailed Models [Yan 2014, 2016, 2018…]
    NDFModel_Beckmann
    注:NDF描述的法线是在三维中的,但是上图在单位圆内定义法线分布,这是从半球正上方看的投影,也就是之前提到过的Projected Solid Angel(投影立体角)

Beckmann NDF

Beckmann NDF类似高斯函数,用α\alpha(类似高斯函数中的标准差)控制表面的粗糙程度,用θh\theta_h表示半程向量与法线的夹角(图中表示的各向同性材质)
BeckmannNDF
Beckmann NDF是定义在Slope Space上的(使用tanθh\tan\theta_h而不是直接使用θh\theta_h),tanθh\tan\theta_h相当于图中单位圆切线上某一点到切点的距离,这个距离可以取到无穷大并且还能对应到一个唯一的θh\theta_h,这么做就保证了不会出现面朝物体内部的微表面
Beckmann NDF的分母中有一些项是为了进行归一化,使其在Projected Solid Angel下积分为1

GGX(Trowbridge-Reitz)

GGX相比Beckmann有一个显著特征就是其拥有长尾,这使得θh\theta_h增大时,法线分布量不会过快衰减到接近0
注:我们知道,高斯函数当其自变量取值距离均值超过三个标准差时,其值接近0,Beckmann也有类似性质
GGX

GGX的Long Tail特点使得其描述物体材质时候相对于Beckmann有一个优势:
物体的高光不会突然消失,而是有一个较为平滑的边缘过渡,类似光晕的效果
BeckmannvsGGX

Brent Burley在GGX的基础上实现了扩展,称为Extending GGX或Generalized Trowbridge-Reitz(GTR)
ExtendingGGX

Shadowing-Masking Term

Shadowing-Masking Term又称Geometry Term,用于描述微表面间的自遮挡
从光源出发,因为自遮挡而照不到一部分微表面,这种现象称为Shadowing;而从Camera出发,因为自遮挡而看不到一部分微表面,这种现象称为Masking
Shadowing-MaskingTermSelfOcclusion

引入Shadowing-Masking项主要是为了使得在观察方向接近Grazing Angle时,有一个变暗的效果
当观察角度接近Grazing Angle时,BRDF分母中的两个向量点乘运算结果接近0,因此如果不引入Shadowing-Masking项,整个BRDF的值会趋于无穷大,导致图中球体的边缘呈现一圈白色
WhyShadowingMaskingTerm

Smith Shadowing-Masking Term是一个较为常用的Shadowing-Masking Term
它假设Shadowing和Masking不相关,将其拆开进行考虑
SmithShadowingMasking

The Kulla-Conty Approximation

Microfacet BRDF还存在一些问题,在白炉测试(White Furnace Test)下可见,Microfacet BRDF存在能量损失
WhiteFurnaceTest

这是因为,至此我们还未考虑多次反射问题
表面越粗糙,微表面间的遮挡现象越显著,如果不考虑多次反射,那么被挡住的光线就直接损失了,这就是为什么在白炉测试中,表面越粗糙,渲染结果越暗
MicrofacetBRDFMissingEnergy

The Kulla-Conty Approximation就是用来解决上述问题的

在离线渲染中,确有精确的计算方法,其在微表面中进行Ray-Tracing
但是对于RTR而言,其开销实在过于巨大,因此RTR中通常使用各种近似,这些近似方法一般都基于一个基本观察:被遮挡就意味着要发生下一次弹射

注:这部分初看还是挺绕的,得多看几遍,跟着推导一下,就明白了

Kulla-Conty Approximation是使用经验性的方法来补全因自遮挡而损失的能量

一次弹射下,离开微表面的能量表示如下:
Kulla-Conty1
上式就是对于微表面计算一次渲染方程,即Lighting项、BRDF项、cos\cos项相乘后在半球上积分
首先假设使用Uniform光照,其中θ\thetaϕ\phi是反射/入射方向的极坐标表示,式中令μ=sinθ\mu=\sin\theta
换元后可以消除cos\cos

E(μo)=02π02πf(θo,θi,ϕ)cosθisinθidθidϕ=02π01f(μo,μi,ϕ)μidμidϕ\begin{aligned} E(\mu_o)&=\int_0^{2\pi}\int_0^{2\pi}f(\theta_o,\theta_i,\phi)\cos\theta_i\sin\theta_i\mathrm{d}\theta_i\,\mathrm{d}\phi \\ &=\int_0^{2\pi}\int_0^1f(\mu_o,\mu_i,\phi)\mu_i\mathrm{d}\mu_i\,\mathrm{d}\phi \end{aligned}

这里的E(μo)E(\mu_o)与观察方向有关,不同方向的积分结果可能各不相同,E(μo)E(\mu_o)的结果介于0和1之间

我们得到了一次弹射下,有多少能量离开微表面,那么因为自遮挡而损失的能量显然为1E(μo)1-E(\mu_o)(因为我们假设使用Uniform光照,所以无损失的情况下离开微表面的能量为1)
为了使离开的能量为1,我们需要补上损失的这部分能量,Kulla-Conty Approximation中定义了一个用来表示多次反射的BRDF,而使用这个BRDF进行积分计算的结果为1E(μo)1-E(\mu_o)
通常来说,BRDF都是可逆的(即互换入射与出射方向,其积分结果不变),因此将多次反射BRDF表示为:

fms(μo,μi)=c(1E(μi))(1E(μo))c=1/[π(1Eavg)]Eavg=201E(μ)μdμ\begin{aligned} f_{ms}(\mu_o,\mu_i)&=c(1-E(\mu_i))(1-E(\mu_o)) \\ c&=1/[\pi(1-E_{avg})] \\ E_{avg}&=2\int_0^1E(\mu)\mu \mathrm{d}\mu \end{aligned}

验证一下:

Ems(μo)=02π01fms(μo,μi,ϕ)μidμidϕ=2π01[1E(μo)][1E(μi)]/[π(1Eavg)]μidμi=2[1E(μo)]/[1Eavg]01[1E(μi)]μidμi=[1E(μo)]/[1Eavg][1Eavg]=1E(μo)\begin{aligned} E_{ms}(\mu_o)&=\int_0^{2\pi}\int_0^1f_{ms}(\mu_o,\mu_i,\phi)\mu_i\mathrm{d}\mu_i\,\mathrm{d}\phi \\ &=2\pi\int_0^1[1-E(\mu_o)][1-E(\mu_i)]/[\pi(1-E_{avg})]\cdot\mu_i\mathrm{d}\mu_i \\ &=2[1-E(\mu_o)]/[1-E_{avg}]\int_0^1[1-E(\mu_i)]\mu_i\mathrm{d}\mu_i \\ &=[1-E(\mu_o)]/[1-E_{avg}]\cdot[1-E_{avg}] \\ &=1-E(\mu_o) \end{aligned}

此时,还有一个问题没有解决
前面提到,Eavg=201E(μ)μdμE_{avg}=2\int_0^1E(\mu)\mu \mathrm{d}\mu
E(μ)E(\mu)本身就是一个二重积分,这里再进行一次积分就太过复杂了
在前面的Split Sum中我们就使用预计算处理过积分问题
注:RTR中对于难以计算的、不知道是否有解析解的积分,通常使用预计算打表的方法
为了降低预计算打表的开销,这里假设EavgE_{avg}只与μo\mu_o以及roughness有关
于是EavgE_{avg}被存储成一张Texture的形式,如下:
Kulla-Conty_table

补上多次反射的部分后,结果就比较正确了
Kulla-Conty_result1

但是至此我们还没有考虑物体表面有颜色的情况
我们知道,物体表面有颜色本身就是一种能量的损失(物理上理解物体表面就是不同频率范围的光反射率不一样,因而呈现特定颜色)

Kulla-Conty Approximation将其拆分为两部分,第一步先考虑物体没有颜色的情况,即所有光都会被反射,第二步再考虑由于物体表面的颜色造成的能量损失
为此,定义一个Average Fresnel,这个平均菲涅尔项表示的是每次反射平均反射多少能量

Favg=01F(μ)μdμ/01μdμ=201F(μ)μdμFavg[0,1]\begin{aligned} F_{avg}&=\int_0^1F(\mu)\mu\mathrm{d}\mu\bigg/\int_0^1\mu\mathrm{d}\mu=2\int_0^1F(\mu)\mu\mathrm{d}\mu \\ F_{avg}&\in[0, 1] \end{aligned}

注:这里的Average Fresnel不考虑入射的ϕ\phi角度。准确来说应该考虑ϕ\phi,但是因为引入平均菲涅尔是为了表示反射很多次的情况下平均每次反射的能量的比例,而多次反射中每次入射的ϕ\phi不尽相同,这没法计算也不必计算,即便不考虑ϕ\phi,对于表示平均情况也足矣

再回过头来考虑先前提到的EavgE_{avg}
这个EavgE_{avg}代表的是每次反射中平均有多少能量离开微表面,那么显然,这部分能量是不参与后续的反射的,真正参与后续反射的能量是1Eavg1-E_{avg}

于是,所有能量可以分成以下部分:

  • 一次反射离开的能量(直接看到的能量): FavgEavgF_{avg}E_{avg}
  • 多反射一次后离开的能量(总共两次反射的能量): Favg(1Eavg)FavgEavgF_{avg}(1-E_{avg})\cdot F_{avg}E_{avg}
    注:Favg(1Eavg)F_{avg}(1-E_{avg})表示第一次反射后没离开微表面的能量,而这部分能量下一次离开的部分则需再乘以FavgEavgF_{avg}E_{avg}
  • 多反射kk次后离开的能量: Favgk(1Eavg)kFavgEavgF_{avg}^k(1-E_{avg})^k\cdot F_{avg}E_{avg}

因此,所有上述部分能量之和就是个无穷级数,其结果为:

FavgEavg/[1Favg(1Eavg)]F_{avg}E_{avg}/[1-F_{avg}(1-E_{avg})]

将这个结果乘以第一步中考虑的不带颜色的BRDF,就是我们最终需要的考虑颜色的BRDF
Kulla-Conty_result2

这部分的最后,闫令琪老师指出了当今常见的一种用来补全微表面模型反射损失能量的错误方法,即将Microfacet BRDF与一个Diffuse Lobe组合
这种方法是使用一个Diffuse部分来补全损失的能量,解决Microfacet BRDF渲染结果偏暗的问题,但是这是完全错误的
首先,我们使用Microfacet BRDF就是描述了其微表面分布,也就是说这个分布我们是清楚的,那么这个加入的Diffuse是从何而来呢?一个表面怎么可能既是Microfacet BRDF描述的分布,同时又是Diffuse分布呢?
这么做虽然有时候看起来没问题,但是完全没有保证能量守恒,当加入全局光照等其他因素后,可能会出现材质本身发光的情况
AnUndesirabelHack

Shading Microfacet Models using Linearly Transformed Cosine (LTC)

LTC方法主要用于解决多边形光源下GGX模型的Shading问题(不过其他模型也可以),仅解决Shading,而不考虑Shadow
LTC
引入LTC的主要目的是使渲染方程的积分具有解析解,从而避免对多边形光源进行采样。因为RTR对计算开销非常敏感,如果渲染方程有解析解,那就意味着对该BRDF在多边形光源上的积分其每一点都可以套公式,而不用采样很多点去求数值解,这显然更适合GPU来并行处理

基本思想

Key idea:

  • 任何出射的2D的BRDF都可以通过一定方式变换成一个余弦函数
  • 多边形光源也可以进行如今上述2D-BRDF一样的变换(用变换后的光源照射变换后的BRDF,其结果与用原光源照射原BRDF一致)
  • 通过上述变换,将任意BRDF Lobe在任意多边形光源下的Shading问题,转换为在固定的Cosine Lobe下对任意多边形光源积分的问题,这个积分具有解析解
    注:PBR材质模型通常较为复杂(即BRDF比较复杂),其BRDF的积分通常没有直接的解析解
    BRDF2Cosine

上面提到的变换主要有三个部分:

  • BRDF变换:BRDF M1\xrightarrow{M^{-1}} Cosine
  • 方向变换:ωiM1ωi\omega_i \xrightarrow{M^{-1}} \omega_i^{\prime}
  • 积分域变换:PM1PP \xrightarrow{M^{-1}} P^{\prime}
    注:LTC论文里定义从cosine变换到BRDF Lobe的变换为MM,因此上面进行的是MM的反变换
    LTC_Transform1
    LTC_Transform2
实现细节

首先,完美假设多边形光源是Uniform的,因此其中的Radiance是一个常量,可以提出积分之外,然后使用变换后的立体角来表示原立体角:

ωi=Mωi/MωiL(ωo)=LiPF(ωi)dωi=LiPcos(ωi)d(Mωi/Mωi)=LiPcos(ωi)Jdωi\begin{aligned} \omega_i&=M\omega_i^{\prime}\big/\lVert M\omega_i^{\prime}\rVert \\ L(\omega_o)&=L_i\cdot\int_PF(\omega_i)\mathrm{d}\omega_i \\ &=L_i\cdot\int_P\cos(\omega_i^{\prime})\mathrm{d}(M\omega_i^{\prime}/\lVert M\omega_i^{\prime}\rVert) \\ &=L_i\cdot\int_{P^{\prime}}\cos(\omega_i^{\prime})J\mathrm{d}\omega_i^{\prime} \end{aligned}

其中,JJ是雅可比行列式
LTC_demo

Disney’s Principled BRDF

为什么需要引入Disney’s Principled BRDF呢?
首先,没有一种基于物理的材质能够描述所有的真实材质,比如Microfacet BRDF就不适合描述多层材质(如刷了清漆的木桌面,其上层是Specular,下层是Diffuse)
再者,基于物理的材质对艺术家而言并不是很好用,因为其中涉及很多物理量,而通过这些并不直观的物理量来调整材质对于艺术家来说往往是比较困难的

Disney’s Principled BRDF有以下这些主要的设计原则:

  • 使用直观的描述,而不是物理量(在物理层面上完全严谨是不必需的)
  • 参数尽可能少
  • 参数值通常在区间[0,1][0, 1]
  • 在必要时,可以将参数值调节到超出上述区间
  • 将所有参数组合起来,无论如何调整,都保证模型的鲁棒性

Disney’s Principled BRDF参数效果如下:
DisneyPrincipledBRDF_Parameter
其中,SpeculatTint是描述材质的镜面反射高光颜色接近物体材质颜色的程度,数值越大,镜面反射高光颜色越接近材质颜色,数值越小,镜面反射高光则越白
Sheen用于描述类似天鹅绒材质的性状,其材质表面会有一层绒毛,Sheen值越大,其绒毛越明显。而SheenTint则是描述绒毛的颜色与材质颜色的接近程度
Clearcoat就是描述上述类似刷了清漆的桌面的材质,其外层材质会有高光,Clearcoat值越大,高光越明显。而ClearcoatGloss则是描述材质外层的光滑程度,值越大,越光滑

Pros & Cons

  • Pros
    • 易于理解和控制
    • 可以描述很多种类的材质
    • 有许多开源实现
  • Cons
    • 并不是真正的基于物理(其实也并不算什么缺点,毕竟它很好用)
    • 参数空间巨大,会有冗余

Non-Photorealisitc Rendering (NPR)

在RTR中,NPR就是进行快速且可靠的风格化渲染
NPR目前在美术、教育、动画等方面的应用十分广泛
NPR

基本概念

要说Non-Photorealisitc Rendering,就不得不先清楚何为Photorealisitc Rendering
Photorealisitc Rendering真实感渲染真实感渲染的目标是渲染结果接近照片级的真实感,其重点关注光照、阴影、材质等
而Non-Photorealisitc Rendering非真实感渲染的目标则不是要求渲染结果真实,而是要产生具有各种艺术感的效果

NPR的特点

  • 从真实感渲染出发
  • 利用各种抽象
  • 强化一些重要特征

Styles of NPR

Outline Rendering

通常,我们直观地认为Outline就是物体的轮廓,但是在NPR中对于Outline有更加广泛而细致的定义

  • Outlines are not just contours
    • [B]oundary / border edge(物体的边界)
    • [C]rease(折痕)
    • [M]aterial edge(材质的边界)
    • [S]ilhouette edge(剪影,与B的差别在于,S边由多个面共享)
      Outlines
Outline Rendering - Shading

通过Shading的方法实现描边效果主要描绘的是Silhouette Edge
这里对于Silhouette Edge有一个重要观察:Silhouette Edge必须是两个面相交而成的,同时它必须是其所在物体的外轮廓,因此,我们看到Silhouette Edge的位置必然是其中一个面被我们看见,而另一个面无法被我们看见,也就是说,当观察某一个Shading Point的角度接近Grazing Angle时,该Shading Point就应该要描边
于是,可以设定一个角度阈值,当观察方向与当前Shading Point法线方向的夹角接近90°90\degree时,就进行描边
OutlineRendering_Shading
利用Shading方法进行描边有一个明显的缺点就是其无法保证描边粗细一致,法线变化较缓的区域描边较粗,法线变化较快的区域描边较细

Outline Rendering - Geometry

利用几何方法描边的具体实现被称为Backface Fattening,其主要完成以下几个工作:

  • 正常渲染朝向相机的面元
  • 将背向相机的面元(沿顶点法线方向)扩大一圈,然后重新渲染这部分背向的面元(比如渲染成黑色)
    OutlineRendering_Geometry
Outline Rendering - Image

在图像空间进行描边就是计算机视觉中常见的方法
首先进行边缘检测,再进行描边
使用Sobel Detector进行滤波,完成边缘提取
OutlineRendering_ImageSobel

当然,提取边缘也可以同时使用法线、深度等其他信息作为指导,来更加精确地找到边界
OutlineRendering_ImageDifferentInfo

Color Blocks

ColorBlocks

非真实感渲染中实现大色块主要有两种方式:

  • Hard Shading:在着色过程中进行阈值化
  • Posterization:在着色完成后图像中进行阈值化
    这里的阈值化不一定是二值化,通常大多是多值化(量化)
    ColorBlocks_Quantization

各种风格化方法可以自由组合形成不同效果
Outline&ColorBlocks_DifferentStyles

Strokes Surface Stylization

素描风格的非真实感渲染使用素描格子的疏密来表现画面的明暗,其基本思想如下:

  • 使用预先生成的素描纹理来替代点面的着色
  • 使用素描纹理格子的密度来描述画面的明暗
  • 保证纹理的连续性
    StrokesSurfaceStylization
Tonal Art Maps (TAMs)

素描风格的渲染需要预先生成以不同纹理密度来代表不同调性的贴图,而每一个密度的贴图都要生成一个MipMap
这里的MipMap与之前的各种MipMap有所不同。如果通过采样缩小素描纹理贴图,会变相地增加贴图中的纹理密度,因此这里生成MipMap通常是从上一层贴图中截取,以保证纹理密度不变
TonalArtMaps

补充说明

NPR是艺术驱动的,它需要一个“翻译”的过程,即根据需要实现的风格化渲染效果来对应地进行一些特别的渲染操作
NPR效果的优劣,一定程度上依赖于其在真实感渲染下的模型质量