games202:五,基于物理的材质:Microfacet、Kulla-Conty估计、LTC、NPR

今天讲我们熟悉的PBR啦,PBR实际包含材质、光照、相机(透镜成像)、光线传播等等,一般说起来就是指材质。

  • 在RTR中的PBR:
    1. 对表面:大部分是用微表面模型和迪士尼原则的BRDF(艺术家友好但不是PBR)。
    2. 对体积:多数关注快速近似计算单独或多重的散射。(头发TressFX、皮肤、云等)
    3. RTR中基本都不是PBR,使用各种小技巧来模拟离线渲染,性能才是第一位

一,微表面模型Microfacet BRDF

复习下微表面理论:微平面理论复习

f c o o k − t o r r a n c e = F ( i , h ) G ( i , o , h ) D ( h ) 4 ( n , i ) ( n , o ) f_{cook-torrance}= \frac {F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)} fcooktorrance=4(n,i)(n,o)F(i,h)G(i,o,h)D(h)

  1. F为菲涅尔方程(Fresnel Rquation),考虑不同入射角下反射光所占比例的区别(角度越大,反射越多)----[0.1]
  2. G为几何函数(Geometry Function)(也叫Masking-Shadowing项),描述微表面之间的自遮挡(光线入射角大时更容易遮挡)----[0.1]
  3. D为法线分布函数(Normal Distribution Function–NDF),有Beckmann、GGX、严老师模型等分布模型「法线分布函数复习」

1.1NDF

1.1.1 Beckmann分布

D b ( h ) = e x p − t a n 2 θ h α 2 π α 2 c o s 4 θ h D_{b}(h) = \frac{exp^{- \frac{tan^2θ_h}{α^2}}}{πα^2cos^4θ_h} Db(h)=πα2cos4θhexpα2tan2θh
(类高斯分布),其中θ为n、h的夹角,这里用tanθ而不是用θ是因为BeckmannNDF被定义在坡度空间上,见下图,即把高斯函数定义在一个平面上,又因为高斯函数的远处无线小但大于0,在平面最远处可以定义一个极限90度的tan数值,这样可以保证不可能出现大于90而朝下的微表面。

在这里插入图片描述

1.1.2 GGX分布

比Beckmann有更好的Long tail高光长尾(衰减更加柔和)
在这里插入图片描述在这里插入图片描述

1.2 G几何修正项

又名Shadowing Masking项。

  • 自遮挡可以分为两种情况:挡住入射光线,被称为阴影(Shadowing);挡住出射光线,被称为遮蔽(Masking)。G就是提供这个使表面“变暗”的操作。
  • 另外,公式中除G项外的结果,在物体边缘掠射角度处会变得异常亮,而G项可以修正这一点
  • 常用的是Smith几何项
    在这里插入图片描述

1.3 能量补偿项

在G项计算中,由于没有考虑到多次弹射中的能量损失,所以当粗糙度大时能量不守恒(粗糙度大整体变暗),而且越粗糙能量损失越多。
在这里插入图片描述
工业界为了解决这个问题会对模型增加一个能量补偿项,通过创建一个额外的BRDF波瓣来近似估计丢失的能量。(当光线不被遮挡的时候会直接被看到;而当反射光线被微表面遮挡的时候,认为这些被挡住的光线经过后续弹射,直到被看到)

1.3.1 Kulla-Conty估计方法

(通过经验方式补全丢失的能量)

  • 假设L为1,那么一次反射后的出射能量为 E ( μ o ) = ∫ 0 2 π ∫ 0 1 f ( μ o , μ i , φ ) μ i d μ i d φ − > ( μ i = s i n θ ) E(μ_o) = \int_{0}^{2π} \int_{0}^{1} f(μ_o,μ_i,φ)μ_idμ_idφ-> (μ_i=sinθ) E(μo)=02π01f(μo,μi,φ)μidμidφ>(μi=sinθ),那么光线丢失的能量就是 1 − E ( μ o ) 1-E(μ_o) 1E(μo)
  • 再考虑到BRDF的可逆性,入射出射方向的丢失都要考虑,因此这里的BRDF设计为 c ( 1 − E ( μ o ) ) ( 1 − E ( μ i ) ) c(1-E(μ_o))(1-E(μ_i)) c(1E(μo))(1E(μi)),要求将这个BRDF积分后,要等于恰好等于丢失的能量。
  • 这里的c可以计算出来 c = 1 π ( 1 − E a v g ) c = \frac {1}{π(1-E_{avg})} c=π(1Eavg)1 E a v g E_{avg} Eavg是半球上E的余弦加权平均值, E a v g = 2 ∫ 0 1 E μ μ d μ E_{avg} = 2 \int_{0}^{1}E_{μ}μdμ Eavg=201Eμμdμ
  • 推导过程如下(贴大佬):

在这里插入图片描述

  • E a v g E_{avg} Eavg还是不知道且很复杂,对于这种复杂又不知道有无解析解的积分,我们可以:预计算、打表,由于这里的积分只与粗糙度和μ有关,我们可以得到预计算图(而且由于过度平缓,32*32分辨率就行)
    在这里插入图片描述
    这样做后结果明显好转:
    在这里插入图片描述
    但此时依然有问题,因为如果BRDF是有颜色的,则能量会吸收,能量积分和不为1了。Kulla-Conty方法是先考虑没有颜色的情况,再考虑由颜色引起的能量损失(从菲涅尔项入手–菲涅尔就体现了不同波长的反射率)。

  • 这里定义了“平均菲涅尔项”(不考虑观察方向的情况下) F a v g = ∫ 0 1 F ( μ ) μ d μ ∫ 0 1 μ d μ = 2 ∫ 0 1 F ( μ ) μ d μ F_{avg} = \frac{\int_0^1 F(μ)μdμ}{\int_0^1μdμ} = 2\int_0^1 F(μ)μdμ Favg=01μdμ01F(μ)μdμ=201F(μ)μdμ

  • 在有颜色时,第一次反射有 F a v g E a v g F_{avg}E_{avg} FavgEavg的能量被反射,第二次有 F a v g ( 1 − E a v g ) F a v g E a v g F_{avg}(1-E_{avg})F_{avg}E_{avg} Favg(1Eavg)FavgEavg的能量被反射,可以得到累加颜色项 F a v g E a v g 1 − F a v g ( 1 − E a v g ) \frac{F_{avg}E_{avg}}{1-F_{avg}(1-E_{avg})} 1Favg(1Eavg)FavgEavg与不带颜色的结果相乘,即可补足颜色的能量损失。
    在这里插入图片描述

特别提醒

有的人或引擎(点名learnopengl)在微表面BRDF后加上一个diffuse,这样做完全错且没有意义且完全错误,物理不正确且不守恒,会搞出来会发光的物体…………(还好我直射光没加,但计算环境光还是加了,是参考opengl的),老师没教过这种做法,这么写了出门别说是他学生……

1.4 线性变换余弦(LTC-Linearly Transformed Cosines)

LTC是为了解决微表面模型下 「多边形光源采样问题」 的一种专门的着色方法(用GGX-NDF且无阴影)。

在这里插入图片描述

任意BRDF的任意光源下的渲染方程积分不好计算,该方法将2d的BRDF线性变换为截断余弦分布,将问题转换为固定余弦下对任意多边形光源积分的问题(有解析解),从而大大的提升了面光源积分的计算效率。

  • 核心方法:

对任意观察方向预计算一个变化矩阵M,将标准空间的BRDF转化到余弦空间,这个过程中所有输入w的方向、积分域都相应改变(相当于用一个余弦空间lobe去拟合标准lobe,整个面光源都被变换)。

在这里插入图片描述在这里插入图片描述

  • 具体计算:

在面光源中假设光源 L i L_i Li是uniform的,因此渲染方程变为 L ( ω o ) = L i ⋅ ∫ P F ( ω i ) d ω i L(ω_o) = L_i \cdot \int_P F(ω_i)dω_i L(ωo)=LiPF(ωi)dωi,带入 ω i = M ω i ′ ∥ M ω i ′ ∥ ω_i = \frac{Mω_i'}{\Vert Mω_i'\Vert} ωi=MωiMωi及余弦变换,得到
L ( ω o ) = L i ⋅ ∫ P c o s ( ω i ′ ) d M ω i ′ ∥ M ω i ′ ∥ = L i ⋅ ∫ P c o s ( ω i ′ ) J d ω i ′ L(ω_o) = L_i \cdot \int_P cos(ω_i')d\frac{Mω_i'}{\Vert Mω_i'\Vert} = L_i \cdot \int_P cos(ω_i')Jdω_i' L(ωo)=LiPcos(ωi)dMωiMωi=LiPcos(ωi)Jdωi
这里的J是Jacobi项,雅克比行列式,是换元后产生的系数(二重积分常用)。

上边换元的公式是有解析解的,可以解出BRDF。那具体是怎么转换到余弦空间呢?论文做了一个转换矩阵的预计算,更详细的内容可以看原论文Linear-Light Shading with Linearly Transformed Cosines-2019,或者知乎牛人的论文复现

  • tip:
  1. 由于LTC不考虑阴影,因此如果有物体挡住了这个面光源,就吃不消了
  2. 这工作是unity research的Eric Heitz大佬做的,得到业内广泛认可
  3. 各向异性的表面也能用LTC,因为不同方位角总能找到合适的变换矩阵,使拟合误差最小
  4. LTC就是一种将 变化BRDF 和 变化光源 的 shading问题,转化为 固定BRDF 和 变化光源 问题的一种解决方案

二,迪士尼Disney Principled BRDF

微表面模型虽然很好但也存在一些问题:

  1. 不擅长表现真实材质(比如不加能量补偿项时的能量缺失),如清漆(clear coat)这种多层材质的表现
  2. 艺术家不友好,实际使用人–艺术家并不在乎物理准不准确

迪士尼原则的BRDF就是对艺术家友好的一种模型(虽然物理不正确但也被叫做PBR),他的参数更简单易懂直观好操控,分为了10个参数见图:
在这里插入图片描述

  • 挑几个说下:

subsurface(次表面):比diffuse更平的效果
specularTint(镜面反射颜色):镜面反射的颜色(让步美术),0表示无色,1表示材质固有色,但边缘镜面反射都为无色
sheen(光泽度):一种额外的绒毛掠射分量,主要用于天鹅绒等布料
sheenTint(光泽颜色):控制sheen的颜色,0表示无色,1表示材质固有色
clearcoat(清漆强度):第二个镜面波瓣,控制透明涂层的明显程度
clearcoatGloss(清漆光泽度):控制透明涂层的光泽度,0表示磨砂,1表示光滑

  • tips:
  1. 参数越多越冗余、重复
  2. 虽然迪士尼BRDF不完全符合物理,但他模拟的就是能量守恒模型,如果不考虑误差也可以说是能量守恒的(学术界后期处理模拟、近似也很多,不用那么死板)
  3. 迪士尼BRDF不太适合实时渲染,如果用Disney那一整套算法都得改

三,NPR - Non-photorealistic rendering

NPR=(fast and reliable可靠的)stylization风格化(通过一些轻量级的处理)。一般思路是先绘制真实风格,再从中抽象、强调重要的部分,得到风格化的结果。

  • 一些背景:学术界对 NPR 的研究不太活跃,相关的会议 NPAR 在 2017 年之后没有再举办

3.1 描边Outline

not just contours(外边缘),包含Boundary edge(面的边缘)、Crease(折痕)、Material edge(不同材质边缘)、Silhouette edge(由多个面共享的外边缘)
在这里插入图片描述

  • 1,shading 描边
    可以使模型法线与视线方向越垂直的地方颜色越暗,再使用阈值、step等方式取用----但这样效果可能粗细不一致(左图)

在这里插入图片描述在这里插入图片描述

  • 2,Geometry 描边
    也可以通过几何方法(类似把模型放大一圈,放在原模型背后),只扩大模型背对视角的面使背面模型大一圈,并用黑色渲染,然后再渲染正面(右图)。这个思路有很多优化方法,如扩大边、沿法线扩大、扩大后平滑角等。
  • 3,Image 描边
    图像后处理,如sobel算子等方式进行边缘检测(英雄联盟用);除了在图像上处理,还可以在法线、深度图等删改进行处理。

3.2 色块

阈值化颜色,可以在shading过程中进行,也可以后处理时再阈值化。还可以进行更细化的操作如量化(Quantization)颜色。也可以diffuse、specular分开阈值化等等,操作很多。
在这里插入图片描述

3.3 素描Strokes Surface Stylization

什么是素描效果?—描边的同时,暗的地方有美术笔触

在这里插入图片描述在这里插入图片描述

  • Tomal art maps(TAMs)方法:

    1. 设计不同笔触的纹理,并为每个纹理制作mipmap(注意这里缩小的同时没有更密集)
    2. 搜索适配—根据着色点的明暗及位置
  • tips:

    1. npr是美术驱动的,实现是最简单的,是在翻译艺术家的想法
    2. npr本质就在做if else,对不同风格、设计、材质甚至部位都要有不同的实现
    3. npr做的好不好很大程度取决于其背后的“photorealistic真实风格”做的好不好,先真实才好抽象

参考资料

1,GAMES202高质量实时渲染-个人笔记:基于物理的实时渲染-风烟流年
2,《GAMES202:高质量实时渲染》4 实时高质量着色-zhiwei

猜你喜欢

转载自blog.csdn.net/yx314636922/article/details/129492675