PBR and PBR Materials PBR指的是基于物理的渲染,包括材质、相机、光线传播等部分组成,一般来说最具代表性的表现部分就是材质部分。

  • 在实时渲染中,由于大部分的复杂度都远高于预期的效果,因此我们就会考虑忽略一些准确度来达到更快的效果表现。(保证效率前提下尽可能优化表现);
  • 在当前的设计逻辑里我们常见的对表面的表现使用microfacet models进行表现或者是Disney principled BRDFs(更艺术友好)
  • 在体积上定义,主要就是云雾、肤色等效果会有差异。

材质部分的理论是相对固定的,因此表现效果和加速的hack才是关键的因素

Microfacet BRDF 微表面模型

Recap:DGF项中F代表菲涅尔项,代表对应角度有多少能量被反射,D代表法线的分布项,代表法线分布的粗糙情况;G项代表几何遮蔽项。

Fresnel Term

根据入射角度问题,我们的反射清晰度不同,被反射的能量是不一样的。

s偏振是垂直于入射面的线偏振分量,p偏振就是平行于入射面的线偏振分量。 光经过界面后,反射光和折射光会携带一定量的p偏振分量和s偏振分量,这个数值可以通过菲涅耳方程定量计算出来;

下图属于非导体部分的反射效果,反射的能量随着视角变化比较显著,在相对平的角度观察其效果很不显著; 不同材质的性质显著存在差异,导体和非导体的。 金属会显见的有一些反常现象的出现。 在进行计算的时候,根据显见的公式,我们利用Schlick的近似式子,包括利用参数(R0)保证能量的守恒,能够显著降低菲涅尔项运算时的复杂度来获取更优秀的表现效果。

Normal Distribution Function

我们的法线的微表面分布越集中,我们的光线表示效果就越好,而在表面变得越来越复杂的时候,相当于把物体的微观表面的高度场被拉伸倾斜,使得对应分布场更为杂乱的,模拟diffuse的物体。

Theory

是一种二维空间的算法,有很多的模型进行模拟,有许多常见的广泛应用的经典模型,例如Beckmann,GGX等模型。大部分都是存在一定中心分布的一个模型。由于我们考虑法线的时候一般逻辑上朝上,长度被统一化,因此我们需要考虑的就是分布的两个量。中图将半球摊平显示在圆面上用于ShowCase。

Beckmann NDF

  • 是一种类似高斯函数的表达式,有聚焦和边缘衰减。里面的alpha用于表达表面的粗糙程度,值越小越接近镜面;而zeita的角为半程角。
  • 定义于切线空间,其实也就是满足了在积分域(-pi/2, pi/2)上积分为1的高斯函数,变了一下型而已,只不过没有以角度作为定义,定义在对应的线上。
D(h)=etan2θhα2πα2cos4θhD(h) = \frac{e^{-\frac{\tan^2 \theta_h}{\alpha^2}}}{\pi \alpha^2 \cos^4 \theta_h}

显见的,其也会和一个确定的角度是一一对应的,定义空间在0-180,也不会出现向下的情况。 在归一化的逻辑时,

GGX(or TR模型)

  • 有一个显著的长尾特点,不过GGX 的衰减效果比较轻微,虽然仍然存在衰减效果,不过对应的衰减显著低于常规的算法。
  • GGX的高光衰减比较少,能够显示出光晕的效果,高光比较柔和,且对diffuse效果更加友好。

Extending GGX

因为tr项会使得高光更加柔和,为了拓展这一优势,能使得这种对应的长尾能够有不同的表现复杂度,进行了拓展效果,引入一个变量γ,同时也令人惊讶的是再伽马近似10的时候我们会无线近似Beckmann,是一个很大的优势,近似统一了这部分的对应模型。——GTR(生成式tr)

Geometry

  • G项用于解决几何表面中出现的大部分自遮挡相关的问题。我们提供一个变暗的操作来保证将优化遮挡部分的逻辑。
  • 在grazing angle附近快速衰减为零,在其他地方角度大概为1亮度问题不大。观察上述公式时,菲涅尔会在边缘的部分不考虑遮挡,出现显见的高光问题,因此我们需要Shadowing Mask去修正对应的光线表现。

Shadowing-Masking Term

  • 常用的逻辑是Smith Shadowing-Masking 利用统计学分布拟合表达表面
  • 在这种逻辑下,我们一般把这个Function进行近似,把阴影投射和遮罩分开考虑进行乘算.
  • 可以看到如下图的曲线利用这样的曲线,我们通过对应的项将边缘的抵消部分逻辑进行处理来防止过量的边缘高光(分母处的数值爆炸)。

Multiple Bounce Problem

在Microfacet逻辑下的BRDF,我们会发现随着diffuse的增加整个面的效果会显著变暗,不过哑光效果的金属理论上亮度应该是近似的,这引发了法线粗糙时的错误。

下边的这个测试是white furnace test,我们需要保证不同的粗糙度下可见度是一样的才能保证对应的能量是守恒的。

这种Roughness越大,面越粗糙,法线被干扰的越严重,这种情况会导致光线打在微表面的时候,这种光线就更容易被其他部分的光线遮挡。在自然场景下G也应该考虑Roughness的,因为粗糙的表面多次弹射会把遮挡的光线再反弹出去相当一部分,而在原有的ggx中并没有考虑补偿对应的能量。 在Heitz et al.中有对应的解决方案,不过对能量守恒的要求过大会产生反复计算影响效果。

The Kulla-Conty Approximation

解决在单次反射的Brdf下,不管使用什么样的NDF,我们都能优秀的实现对应的光线缺失部分的相应补偿填充与完善。

在实时渲染中的处理办法:当表面被遮挡,也就同时意味着光线发生的二次弹射;在这种方法里我们用一种经验公式的近似来近似模拟、仿真这一部分丢失的能量值。 这里来说本质上就是一个求积分的工作,在利用对应项进行能量反弹计算的时候,我们可以通过这个公式得出我们在进行反弹操作的时候弹射了多少能量;那么显然的,我们的能量耗散就是1E(u0)1-E(u_0).(o为观察方向。)

为什么总能量是1?在白盒测试的时候,已经假定所有光都是垂直照射到表面,并且radiance一致,所以可以假定都为1。

基本思想上来说,我们只要将对应部分的亮度能量进行补偿,就可以保证在GGX等模型下的正确光照亮度。从这种角度,我们就可以利用一个常数作为积分后的近似数值逻辑,将对应的积分部分设计为c(1E(μi))(1E(μ0))c(1 - E(\mu_i))(1 - E(\mu_0)). 详细的近似公式如下:

fms(μ0,μi)=(1E(μ0))(1E(μi))π(1Eavg),Eavg=201E(μ)μdμf_{\text{ms}}(\mu_0, \mu_i) = \frac{(1 - E(\mu_0))(1 - E(\mu_i))}{\pi(1 - E_{\text{avg}})} , \, E_{\text{avg}} = 2 \int_{0}^{1} E(\mu) \, \mu \, d\mu

推导供参考:

这一Function比较复杂,不过我们可以预计算为一张表,供查找计算。 优化后的亮度效果很优秀。Function比较如下图所示:

Further:What with Color BRDF?

当BRDF存在颜色的时候,颜色会发生吸收,这样会出现能量的吸收,相应的由于颜色吸收会有能量的耗散损失。

  • 在Kulla-Conty逻辑中,我们假设没有颜色的损失,再利用Frensel,假设平均每次光线的反射中有多少的能量损失,再将衰减部分作为衰减系数乘算:对应项可以记录为: 在进行多颜色的渲染时,我们用RGB分通道计算加和返回来表现对应的能量效果。我们先假设没有颜色的能量损失,再由于颜色的损失,利用等比的逼近来分通道计算损耗而返回。
An Hack

一个神秘的Hack趋势:我们给MicroFacet加入diffuse,利用diffuse+cook terrance 这是一个玩去哪错误且非常可怕的一种效果,非常物理不正确,不过这个是工业的一种常见近似。

ShadingMicroFacet Using Lineraly Transformed Cosines(LTC)

线性变换的余弦方法,常用于解决微表面模型的着色逻辑;

  • 我们利用多边形的光源,用于照亮微表面的光线模型;(lobe是波瓣,用于固定了入射/出射后的余下部分:输入二维输出两维,输入固定时输出也是显见固定的)核心思想是,我们可以通过线性变换,将BRDF变为一个余弦函数;如果我们能找到对应的变换方法,多边形光源对应的顶点、方向都做相应变换,那么我们也可以对应的将对应的光源位置变换为相应的统一方向位置。(相当于把这个光照球转到一个统一位置进行变换。)、
  • 好处在于,对于任意的入射和Shading Point 我们不好再任意角度的立体角做相应的渲染积分,而光源的多边形任意方向的brdf lobe利用矩阵转换成一个固定cos下的固定多边形进行积分。而在固定的范围内,我们有解析解保证是完美的角度!

Transform

通过记号计算,我们将任意一个2D BRDF lobe利用M变换变换为Cosine。 我们的积分域、方位角以及对应的BRDF->cosine都发生了变换。乘完全对应的矩阵完成变换。

Theory

我们先假定,对于多边形光源内覆盖的立体角,内部的渲染是统一的亮度;那么Li是固定的值,周我们在渲染的时候,将F项利用角度转换转换一个方向使其对应的角度被归一化。 公式推导如下:

ωi=MωiMωiL(ω0)=LiPF(ωi)dωi=LiPcos(ωi)dMωiMωi=LiPcos(ωi)Jdωi\begin{aligned} \omega_i &= \frac{M\omega'_i}{\|M\omega'_i\|} \\ L(\omega_0) &= 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 \end{aligned}

在Final Steps,我们将cos等部分预计算,然后来获取解析解。最快速的逻辑是采用优化方法进一步迭代算法。 这种算法暂时只考虑了Shading,没有进一步优化对遮挡的相应工作;不过这里相关遮挡的Research很优秀。可以先计算shading再进一步加入Shadow。

对应的各向异性材质而言,只是每个的lobe效果不同,而仍然是可以进行实现的。

Disney principled BRDF

Why is needed:微表面模型不足够PBR,且部分的显示上的材质,不便于通过艺术家的方式进行优化处理(n i k效果不容易选择);(如青油涂抹的物体,清漆表面会产生高光且部分会被吸收);且微表面模型不能代表所有的材质效果。

是一种艺术效果作为驱动,且并不要求在物理上完全正确的着色模型。

Principle

  • 直观、不应该使用太多物理量
  • 尽量少的 且有直观调整方式的参数
  • 参数值最好为0-1映射;直观;
  • 为了更好的显示逻辑,我们有的时候允许一定的超出范围的数值和参数使用方式
  • 参数尽量健壮且可描述。

大部分推导都是经验的公式拟合以及对应经验参数。

参数面板

  • Subsurface:部分投射,是一个对此表面散射的近似;
  • metallic:金属度
  • specular:是镜面反射部分参与受光的程度
  • ~Tint:镜面反射的反射部分对应的颜色参数是偏白还是更接近原有颜色
  • Roughness:决定镜面反射的参与度。
  • anisotropic:将物体由各向同性到各向异性进行切换。
  • sheen+sheentint:例如天鹅绒等,表面本身向上的垂直处会有绒毛类的生长效果,有一种类似绒毛覆盖的效果。tint同理,是一种接近对应albedo颜色用的参考值。
  • clearcoat+Gloss:镀膜的材质,Gloss用于描述此处层级涂抹油漆的光滑程度。

Pros and Cons

Pros

  • 参数易于理解和调节
  • 用一个模型可以描述大量不同类型的材质
  • 开源的实现效果拟合

Cons

  • 牺牲了一部分物理准确性,不过大致是PBR的 在工业界的角度来讲这是完全ok的

可以参考一下部分协助学习。 (11 封私信) 基于物理着色(三)- Disney和UE4的实现 - 知乎 https://link.zhihu.com/?target=https%3A//github.com/wdas

Non-Photorealistic Rendering(NPR,非真实感渲染)

对于实时渲染的需求,可以理解为快速且可依赖的风格化使用。 对于Photorealistic来说,是一种追求真实感,无法从相机中区分出来效果的目标,而我们的需求是不同的;

  • Goal:呈现艺术感的表现效果,允许部分的抽象和艺术处理,做部分的强化和部分简化

Application

  • 艺术处理
  • 可视化效果
  • 工业制作指示/cad 比较广泛的其他使用就是游戏中的NPR不同画风处理(笔者最近就在做风格化233)

Styles

由不少的风格,如欧卡、美卡、各种手绘风格,也有一些为了风格化设计的处理方式,比较有代表性的就是NPR的材质效果以及描边等艺术处理效果

Outline Rendering

对于工业界的处理方式,有很多的优化方法例如平滑法线 Buffer记录等更多的优化逻辑,这里的部分仅供了解,更详细的做法有更多的算法。

  • 不等于边缘-contours: 主要分为Boundry-边缘;Crease折痕;Material Edge材质边缘(在不同材质边界设计出边界)、Silhoutette Edge视觉层边界。-多边共享的一个边缘。

Shading Outline (Fresnel)

这种方法的利用观察方向和表面法向的方向夹角,通过设定不同的阈值,来进行涂黑或者颜色化处理描边的效果,就可以进行边缘的绘制,不过这种角度过滤,从数值角度上来说是截断的,会有硬边缘处理,利用sigmoid函数就可以做出更平滑的效果。

这种菲涅尔效果处理的逻辑的描边的粗细无法控制,且其实更常用于角色的边缘发光处理(bushi)

Backface Method(Geometry)

利用stencil buffer的模板测试,进行一个背面扩张,再使用一个CullFront的效果,将每一个背面的面扩张一圈,利用扩张好的部分涂色来实现一个朴素的描边处理。

Outline Rendering(Image Space)

利用Sobel算子和阈值做图像过滤,来提取出图像领域的边界用于判断边缘,将边缘处进行一个像素的描边处理。图像空间的一种处理(锐化的逻辑也有相应考虑) 可以利用图像空间的其他更多信息做进一步的改进优化;

Color Block

有两种简单的逻辑:从GGX优化/从Lambert优化;利用阈值化进行色块的统一处理。从正常的Shading计算后进行阈值化统一后输出效果。

我们可以通过不同的NPR处理逻辑获得不一样的表达效果 一些特殊的处理:描线素描效果:根据该点明暗程度向上叠加素描的纹理密度:每个点单独操作后程序化生成对应的纹理。 考虑使用连续的贴图,利用这种效果进行mipmap的。

Summary

艺术驱动 但是尽量产生自己有说服力的风格化效果。和艺术家多交流来解决有更优秀的表达效果。 其实更重要的需求是,在NPR下仍然能正确的有一套逻辑来风格化强写实材质的渲染(清漆、 金属、油漆等)