[图形]实时渲染基于物理的材质

Physically-Based Materials

一般来说,PBR指的是Physically-Based Rendering,包括描述光源如何与不同的东西、物质互动,光照,相机(比如现实的相机如何成像),就是一切与光有关。实时渲染里面说PBR一般只是说基于物理的材质

实时渲染(RTR)里,为了保证实时性,PBR材质的丰富程度远低于离线渲染。事实上很多情况下都不完全是基于物理的,为了实时性会做大量假设,例如头发。

现在基于物理的材质(在RTR中)可以分为两类

  • 描述物体表面,主要是微表面模型(Microfacte BRDF)和迪士尼原则BRDF(Disney principled BRDF)
  • 描述体积,比如云、烟雾、头发

RTR的材质没有新理论,但是直接拿离线的过来用开销巨大,所以有一大堆实现上的hack

Microfacet BRDF

回顾一下GAMES101讲的微表面的BRDF:

f(i,o)=F(i,h)G(i,o,h)D(h)4(n,i)(n,o)f(i,o)=\frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)}


Microfacte BRDF函数表述了一个问题:给定了光的入射方向和出射方向,什么样的微表面才能把入射光反射到出射方向去(如果每个微表面都是镜面)?那就只能是法线和half vector方向一致的微表面才可以做到

Fresnel Term

入射方向有多少能量被反射取决于入射角,由Fresnel项FF描述。

对于绝缘体,入射光和法线夹角越大,反射越接近1,反之则接近0。

但是对于导体,反射率基本都在0.9以上

物理上的菲涅尔公式要考虑光线从介质到介质的折射率,非常复杂,实时渲染使用一种近似公式(Schlick’s approximation)

R(θ)=R0+(1R0)(1cosθ)5R0=(n1n2n1+n2)2\begin{align} &R(\theta)=R_0+(1-R_0){(1-cos\theta)}^5 \\\\ &R_0={(\frac{n_1-n_2}{n_1+n_2})}^2 \end{align}

Normal Distribution Function Term

微表面模型认为,宏观上看,物体表面是平滑的,但是微观上,物体表面凹凸不平,法线各不相同,所以引入法线分布函数DD来描述物体表面的法线分布情况,这是最重要的一项

如果微表面法线分布比较集中,意味着法线变化不明显,整个表面比较平坦

如果微表面法线分布很分散,往四面八方都有,意味着法线很杂乱,整个表面很粗糙

为了描述法线分布,出现了各种各样不同的模型

Beckmann NDF

各向同性的版本

D(h)=etan2θhα2πα2cos4θhD(h) = \frac{e^\frac{-{tan}^2\theta_h}{\alpha^2}}{\pi\alpha^2{cos}^4\theta_h}

α\alpha:表示表面粗糙程度,值越小越光滑
θh\theta_h:半程向量和法线夹角

这个函数长得很像高斯分布(概率论里那个),实际上它也有些高斯分布的性质

这个函数定义在坡度空间(slope space)上。什么是坡度空间?

圆心是shading point,横着穿过圆心那条表示物体表面。考虑上半球法线可能的分布方向,与宏观法线夹角是θ\thetatanθtan\theta的值也很好算。如果把这张图扩展到三维空间,tanθtan\theta所在的线会变成一个平面,Beckmann就是定义在这个平面上的高斯分布函数。

但有一点点不同,概率论里的标准高斯分布,积分区域是负无穷到正无穷,无限大。

这里定义的坡度空间,虽然平面也是无穷大的,但是最终和宏观法线夹角θ\theta是有限的,永远不会等于或超过90°,这样可以保证不存在朝下的微表面。

但是不能保证出射光不朝下…不好办

关于分母上那一堆东西,是为了归一化,希望在projected solid angle上积分结果为1

Trowbridge-Reitz/GGX NDF

D(h)=α2π((nh)2((α21)+1))2D(h)=\frac{\alpha^2}{\pi((n\cdot h)^2((\alpha^2-1)+1))^2}


与Beckmann快速衰减到接近0不同,GGX在接近90°时仍然有一定的能量,被称为long tail

峰值地方反映的是高光现象,随着衰减高光越来越少,Bachmann会看到高光基本没了,但是GGX的边缘会慢慢过渡,所以GGX高光边缘可以看到一种光晕的现象

GTR NDF

Brent Burley大神提出了一种扩展的GGX,拥有更长的拖尾,被称为GTR(Generalized Trowbridge-Reitz)

它带有一个γ\gamma参数来控制拖尾,等于2的时候是普通GGX

Geometry Term/Shadowing-Masking Term


为了解决微表面互相遮挡问题,引入几何遮蔽项

一般从上往下看遮挡部分不多,但是从掠射角(grazing angle)看遮挡严重,被遮蔽的部分应该变暗,如果没有这一项,会看到边缘非常非常亮,变成白色(话说如果没有G,分母的归一化是不是也要改…)

一种常用的G项叫做Smith,它会假设法线是某种特定的统计学分布

并且将shadowing和masking拆开(实际上这两个是有关联的),也就是:

G(i,o,m)G1(i,m)G1(o,m)G(i,o,m)\approx G_1(i,m)G_1(o,m)

m项是half vector

Energy Compensation Term

实时渲染基础(6)基于物理的渲染(Physically Based Rendering)

公式所有项都考虑到了,那么结果对了吗?No

图中是微表面BRDF从光滑到粗糙的渲染结果,但是为啥结果越来越暗

图片下面是人们做了个空背景,然后用uniform的环境光照来渲染的结果,这样的测试叫做white furnace test,如果BRDF不损失能量,那整个画面看上去应该看不到变暗的地方

Microfacte在粗糙情况下出了什么问题?

表面越粗糙,法线分布越广,表面沟壑会变多。当光线打到微表面时,会更容易被其他表面挡住。光线在表面多次弹射的可能性更大

解决办法的思路很简单,将丢失的能量补回去。真的在微表面考虑光线弹射的结果,运算速度会比较慢,只能用在离线渲染里

RTR怎么做?考虑一下,如果光线被遮挡,那么一定会发生下次弹射,所以遮挡等于下次弹射。根据这个事实,提出了Kulla-Conty近似,是一种经验性的模型。

Kulla-Conty

The Kulla-Conty Approximation

要补全丢失的能量,首先要知道丢了多少能量,也就是有多少能量能离开表面,需要计算一个公式:

E(μo)=02π01f(μo,μi,ϕ)μidμidϕ,μ=sinθE(\mu_o)=\int_0^{2\pi}\int_0^1f(\mu_o,\mu_i,\phi)\mu_i\mathrm{d}\mu_i\mathrm{d}\phi,\mu=sin\theta

公式将BRDF和cos和lighting放在一起积分。

首先认为所有入射光都是1,f是BRDF项。整个积分从0到1,再在半球上积分。结果是入射1,最后出去了多少radiance。其实就是在uniform的入射光等于1情况下解渲染方程,最后出去的值是0到1

cos项呢?我们知道球坐标系可以用θ\thetaϕ\phi来表示,它对应的立体角是sinθdθdϕsin\theta\mathrm{d}\theta\mathrm{d}\phi,然后公式里定义了μ=sinθ\mu=sin\theta,可以换元

损失的能量一定是1E(μo)1-E(\mu_o),最后只要把这部分补上就行了。

为了构造额外的BRDF项fmsf_{ms},我们期望它具有如下性质:

  • 使得积分出来的的结果等于1E(μo)1-E(\mu_o)
  • 满足光照方向的对称性(交换μo\mu_oμi​​​​\mu_i​​​​不改变BRDF的值)

Kulla-Conty公式:

fms(μo,μi)=(1E(μi))(1E(μo))π(1Eavg),Eavg=201E(μ)μdμf_{ms}(\mu_o,\mu_i)=\frac{(1-E(\mu_i))(1-E(\mu_o))}{\pi(1-E_{avg})},E_{avg}=2\int_0^1E(\mu)\mu\mathrm{d}\mu

如果材质还带有颜色信息呢?

fms(ωr,ωi)=FavgEavg1Favg(1Eavg)(1E(μo))(1E(μi))π(1Eavg),Favg=201F(μ)dμf_{m s}(\omega_r, \omega_i)=\frac{F_{avg} E_{avg}}{1-F_{avg}\left(1-E_{avg}\right)}\cdot \frac{\left(1-E(\mu_o)\right)\left(1-E(\mu_i)\right)}{\pi\left(1-E_{avg}\right)},F_{avg} = 2\int^{1}_{0}F(\mu)d\mu

其中,FavgF_{avg}为平均菲涅尔项(具体推导不写了,看其他人的文章)

最后最后最后,使用能量补偿的渲染方程长这样:

Lr(x,ωr)=Le(x,ωr)+Ω+Li(x,ωi)(fr(x,ωi,ωr)+fms(ωi,ωr))(nωi)dωiL_{r}\left(x, \omega_{r}\right)=L_{e}\left(x, \omega_{r}\right)+\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) (f_{r}\left(x, \omega_{i}, \omega_{r} \right)+f_{ms}\left(\omega_{i}, \omega_{r} \right))\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i}

E(μ)E(\mu)EavgE_avg预积分时,可以对GGX重要性采样。具体采样公式推导:(GGX重要性采样)[https://www.cnblogs.com/wickedpriest/p/13788527.html]


起飞!

既然微表面BRDF看起来比较偏暗,那直接叠个diffuse不就完事了(草,不就是我吗
完全错误

Linearly Transformed Cosines(LTC)

【论文复现】Real-Time Polygonal-Light Shading with Linearly Transformed Cosines
Real-Time Polygonal-Light with LTC
LTC用于解决多边形光源情况下,microfacet的着色问题

主要思路是:

  • 通过某种线性变换将BRDF变成cos函数
  • 把多边形光源也一起变过去(就是图里四边形一起变过去)
  • 转换后的cos函数有解析解

具体要怎么做呢

L(ωo)=LiPF(ωi)dωi=LiPcos(ωi)dMωiMωi=LiPcos(ωi)Jdωi\begin{align} 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}\frac{M\omega_i^{\prime}}{\parallel M\omega_i^{\prime}\parallel}\\\\ &=L_i\cdot\int_{P^{\prime}} cos(\omega_i^{\prime})J\mathrm{d}\omega_i^{\prime} \end{align}

怎么去解呢?不知道,留个坑

这个方法只能用于平面多边形,凸多边形不适用

不考虑阴影

Disney’s Principled BRDF

既然已经有了符合物理的微表面模型,为什么还要研究其他非物理的材质呢?

  • 微表面模型的描述能力对于现实的材质来说还是不够。比如多层材质
  • 基于物理的材质对艺术家不友好

迪士尼原则BRDF并不完全基于物理

Non-Photorealistic Rendering(NPR)

(占坑)


[图形]实时渲染基于物理的材质
https://ksgfk.github.io/2021/09/22/图形-实时渲染基于物理的材质/
作者
ksgfk
发布于
2021年9月22日
许可协议