Games202 PBR与NPR

Real-Time Physically-Based Materials

PBR是Physically Based Rendering,是基于物理的渲染。它包括材质、光线、相机、光线传输等,模拟一切和光相关的东西。但是在Rendering这个领域,PBR很多时候被当成PBR材质。

在离线渲染中,材质发展比较快。但在实时渲染中材质的丰富程度要弱于离线渲染,主要是速度限制,质量和准确度也会差一些,比如毛发渲染。

实时渲染的PBR材质大约分成两类,一类是物体表面,也就是微表面模型和Disney Principled BRDFs;一类是在体积上定义的,比如体积云、雾。

Microfacet BRDF

一、微表面模型

image-20210330110841853

再拿出这个图。F(i,o)是Fresnel项,D(h)是法线分布,只有半程向量和法线方向一致,才能很好的反射出来。

Fresnel项给出了有多少能量被反射,这取决于入射光的角度(grazing angle)。总体而言,垂直看反射的会少,掠射看角度会变多。对于金属它的反射比例会比较高。它在物理上考虑了S和P极化的效应,但是比较复杂,Schlick 给出了一个近似
$$
R(\theta) = (\frac{n_1-n_2}{n_1+n_2})^2 +(1-R_0) (1-\cos \theta)^5
$$
二、NDF

NDF是微表面的法线分布。如果法线分布集中,那么微表面的发现变化不明显,表面平坦,就得到了一个Glossy的效果;如果分布比较混乱,就得到了Diffuse的效果。

image-20210508102257996

为此,引入Normal Distribution Function(NDF),有GGX、Beckmann模型等用来描述。由于方向是分布在半球上的函数,把这个函数用Projected Solid Angle描述。

Beckmann NDF是关于法线方向$h$的函数,其函数分布符合
$$
D(h) = \frac{\exp \left(-\frac{\tan^2 \theta_h}{\alpha^2}\right)}{\pi \alpha^2\cos^4 \theta_h}
$$
这是一个类似Gaussian函数的分布,$\alpha$就对应了一个roughness,$\theta_h$是半长向量$h$和法线$n$的夹角。这里假设了材质具有各向同性。Beckmann分布定义在一个坡度空间(Slope Space)上:

image-20210508103129626

$\tan \theta$实际上是法线延长之后和切平面相交到顶端的距离。所以,这实际上是在一个平面上定义的Gaussian函数,而不是角度上的。由于Gaussian函数的覆盖是一个无限大区域,所以任意大函数值都对应了一个有限的角度结果,保证了不会出现面朝下的微表面。而如果定义在角度上,那么角度在90度以上,函数仍然会有对应值。分母上$\pi \alpha^2 \cos^4 \theta_h$是归一化常数,是为了保证在Projected Solid Angle上的积分值是1。

GGX NDF,也叫Trowbridge-Reitz(TR)模型,是另一种NDF模型。这个函数有一个长尾性:

image-20210508103748364

它虽然衰减的很快,但是衰减到一定程度之后速度就会放缓,到了Grazing Angle仍然不是0,这就是其长尾效应。所以它在高光的周围会出现一种类似光晕的现象,并且对比较粗糙的表面来说除了高光之外的部分有一点Diffuse的感觉:

image-20210508104014185

所以GGX的效果要更好一点。

Brent Burley对GGX进行了拓展,提供了一种Generialize TR(GTR)模型,引入了一个参数$\gamma$:

image-20210508104520624

$\gamma$比较小的时候,接近Beckmann;$\gamma=2$就是GGX。

三、Shadowing Masking Term

接下来考虑最后一项,Shadowng-Masking Term $G(i,o,h)$。它也叫做Geometry term,解决的是微表面之间的互相遮挡。尤其是在grazing angle的时候:

image-20210508104750946

越是Grazing angle,就越容易发生遮挡。从Light出发的遮挡、光线无法照射叫做shadowing,从眼睛出发的遮挡、光线无法被接收叫做Masking。这一项解决的就是变暗的操作。在垂直看的时候,应该没有这种操作;而在Grazing angle的时候,它应该剧烈减少。

如果没有G项,考虑下面的图

image-20210508105145134

在边缘上,由于$D$不够小,但分母$n\cdot i$很小,BRDF就会很大,导致边缘变成白色。

常见的是Smith Shadowing Masking项,首先近似
$$
G(i,o,h) \approx G_1(i,h) G_1(o,h)
$$
然后定义$G_1$项

image-20210508105359460

这样在边缘上剧烈变小,就可以有效防止边缘问题。

四、能量守恒

但是这个模型仍然存在一些问题。把物体从光滑到粗糙,发现结果是越来越暗:

image-20210508105607536

但抛光和哑光理论上结果应相差无几。所以人们做了一个Uniform的环境光照,观察渲染结果,在纯色背景下理论上是看不到物体的。但是发现越来越rough的时候,出现了能量损失,物体出现了。这个测试叫做白炉测试

这个模型之所以出问题,是因为没有考虑到多次bounce。比较严重的沟壑意味着光线打到微表面的时候,反射光更容易被其它微表面挡住,越粗糙就越容易多次弹射,所以只考虑一次bounce就会产生能量损失。Heitz等人做过基于模拟的精确方法来做多bounce,但是非常慢。

考虑到一条光线如果被遮挡,就相当于会发生另一次bounce。所以工业界常使用一种经验性的方法Kulla-County近似来补全能量。先计算
$$
E(\mu_0) = \int_0^{2\pi} \int_0^1 f(\mu_0, \mu_r, \phi) \mu_i d\mu_i d\phi
$$
这实际上是Uniform的Radiance下one bounce的出射能量结果。实际上这里的积分应该是$\cos \theta \sin \theta d\theta$(因为做了变量代换),令$\mu_i=\sin \theta$,那么上式就变成$\sin \theta d\sin \theta = \mu_i d\mu_i$。因此,需要补全的能量就是$1-E(\mu_0)$。$E$可能是和观察方向有关的,所以在一次bounce下损失的能量只需要把剩下的部分补上去,就得到了比较好的结果。由于BRDF可逆,所以补全的BRDF可以有这样的形式
$$
f_{ms}=c(1-E(\mu_i))(1-E(\mu_o))
$$
$c$是一个归一化常数。实际上,计算出来
$$
c = \frac{1}{\pi(1-E_{avg})}, E_{avg} = 2\int_0^1 E(\mu) \mu d\mu
$$
推导:

image-20210508111025890

但是$E_{avg}$仍然是不可知的。所以这里又需要进行预计算了,而这里实际上只依赖于观测方向$\mu_0$和用roughness描述的BRDF。这样打成一张表,问题就解决了。

如果材质有颜色呢?这个时候,颜色本身意味着能量损失,所以可以先考虑没有颜色的情况下的损失,然后再把有颜色情况下的能量补全上去。这里定义一个平均的Fresnel项,也就是平均每次反射损失多少能量:
$$
F_{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
$$
对于有颜色的物体,这个值就会小于1.由于颜色被吸收的这些能量是不会参与到后续bounce中的,对此分成不同类型。

  • 能够直接看到的能量:$F_{avg} E_{avg}$
  • 1 bounce之后能看到的能量:$F_{avg} (1-E_{avg}) \cdot F_{avg} E_{avg}$
  • k bounce之后能看到的能量:$F_{avg}^k (1-E_{avg})^k \cdot F_{avg} E_{avg}$
  • ……

最终做级数求和,得到颜色项
$$
\frac{F_{avg} E_{avg}}{1-F_{avg}(1-E_{avg})}
$$
结果相当好:

image-20210508112616138

Linear Transformed Cosines(LTC)

线性变换余弦解决的也是微表面模型的问题。它主要解决的是GGX法线分布,对其他分布也是相同的。它不考虑Shadow的问题,而只计算Shading。同时,LTC解决的是多边形光源的着色。

image-20210515100728987

如果没有LTC方法,就需要对光源进行采样,然后进行Shadow Test等操作。LTC的目标就是解决采样的问题。LTC方法的想法是很简单的:所有的BRDF lobe都可以变换成一个余弦函数。把多边形光源也跟着变换,定义一个新的面积光源。那么新的光源着色就和原光源是相同的。

image-20210515101145153

Shading Point的BRDF是各不相同的,但是这样就转换成在固定cosine下的shading,而这个积分是在多边形范围内的,是有解析解的。

image-20210515101450020

形式化的,我们可以这样表示这两个变换:

  • $M^{-1}(BRDF) = Cosine$
  • 方向$M^{-1}(\omega_i) = \omega_i’$
  • 积分域$M^{-1}(P) = P’$

首先把渲染方程表示成
$$
L(\omega_o) = L_i \int_P F(\omega_i) d\omega_i
$$
经过变换之后,
$$
\omega_i = \frac{M\omega_i’}{||M\omega_i’||}
$$
带入到渲染方程中,
$$
L(\omega_o) = L_i \int_P \cos(\omega_i’) d\frac{M\omega_i’}{||M\omega_i’||}
$$
这样,就引入了Jacobi项
$$
L(\omega_o) = L_i \int_P \cos(\omega_i’) J d\omega_i’
$$

Disney Principled BRDF

微表面模型并不擅长表现比较真实的材质。比如,在木头表面上刷一层清漆。它不会吸收光,但是光线为了进入清漆,有一部分能量直接反射,形成高光;碰到木头的物体则是Diffuse。那么它就变成了外层高光,内层Diffuse。这种多层材质并无法用Microfact模型表示。同时,微表面模型也不好用,它的参数和物理量相关,对艺术家不友好。比如金属的折射率是复数$\bold{n}-i\bold{k}$,不是很好操纵。

为此,我们需要设置一些设计原则:他们需要尽可能少的参数,参数应该在$[0,1]$之间,并且有可能小于0或大于1;比起物理参数,直观更加重要;保证一定的鲁棒性。

image-20210515103656444

它可以把不同组合叠在一起。它给出了一些参数和属性:

  • subsurface 次表面散射,BRDF下的近似,可以给出一种比Diffuse还平的效果,仿佛被按瘪一样。
  • metallic 金属性,控制多像金属
  • specular 高光性,控制有多少镜面反射的内容
  • specular tint 反射光的颜色,控制更偏白还是更偏下面物体的颜色
  • roughness 粗糙程度,最不粗糙可以镜面
  • anisotropic 各向异性程度
  • sheen 考虑天鹅绒材质,垂直表面会长出一层绒毛。这样从grazing angle看,表面有一层雾化效果一样。
  • sheen tint 这层绒毛的颜色是偏白还是偏自己的颜色
  • clear coat 透明层
  • clear coat gloss 透明层的光滑程度

它参数设计非常直观,并且可以用一个模型描述各种不同材质。它虽然并不是基于物理的,但是一般还叫作PBR材质,这也是学术界和工业界的差别。但是与此同时,比较大的参数空间也可能带来冗余。

Non Photorealistic Rendering(NPR)

NPR一般是一种轻量级的解决方式,来实现一种风格化渲染。

Photorealistic指的是非常像照片,而NPR就是在此基础上制造一些artistic现象。它的研究方向一般是首先得到真实渲染,然后加一些变化,比如什么地方简化、什么地方强化。所以NPR的出发点是真实渲染。

image-20210515110740899

可以看到一些比较明显的特点,比如较强的渐变、比较模糊的阴影、色块、轮廓等。NPR分析的好,会让结果更好。

首先要解决的问题就是描边。Outline并不仅仅指边缘。

image-20210515111009486

它一般包括一些内容:

  • [B]oundary / border edge
  • [C]rease 折痕
  • [M]aterial edge 材质边界
  • [S]ilhouette edge 边缘,这种边界在物体最外一圈的轮廓,并且有多个面共享

Sihouette边一定对应两个面,如果观察方向和normal接近90度,就可以认为这个点在轮廓线上;如果阈值更宽,结果就会更粗,但这样可能就会让描边粗细不一样。

另一种方法是在物体基础上做一个更大的模型:

image-20210515111931260

在渲染物体的时候,知道哪些是正面、哪些是背面。把背面的扩大一圈,然后对背面的模型渲染的时候,正面就会被包裹住,从而形成描边效果。

也可以在图像上做后处理。在图像上找一些边缘,然后对边缘标上颜色,就实现了这个操作。经典方法是Sobel detector,用来做图像Filter。通过设计一些filter cernel,就可以提取出来轮廓:

image-20210515112412183

下一个问题是,得到大量的色块。对于比较glossy的材质,很多时候需要做出一些强调:

image-20210515112812908

可以在shading的过程中进行阈值化,也可以在图像空间操作。这种阈值化可以不是二值化,也可以是量化。还可以在不同部分上应用不同的阈值化方法。

最后来讨论素描风格的效果,这样就不是色块,而是许多线条了。在线条密度比较大的地方偏黑,线条密度比较小的地方偏亮,各个不同点表示的明暗程度就转换成线条密度。同时,还要保证点的笔触是比较连续的。

所以,人们设计了各种不同密度的纹理。

image-20210515113513557

根据不同Shading Point的颜色明暗,就可以在不同纹理上查找。这样实际上保证了笔触的一定连续性。不管物体距离远近,笔触密度只和shading结果有关。并且这里的MipMap不能自动生成,保证不同远近的纹理密度相同,否则就会在比较远的地方密度偏小。

NPR归根结底是对艺术语言的翻译,多和艺术家交流,多观察,因为艺术的种类千变万化。但无论如何——风格化渲染的基础是物理渲染。艺术高于生活,但归根到底是源于生活。

Author

LittleRewriter

Posted on

2021-05-20

Updated on

2021-12-02

Licensed under

Comments