编者按 PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型。腾讯游戏学院专家Leonn,将和大家分享PBR的理论知识以及在Disney和UE中的典型应用。
文 | Leonn
腾讯游戏学院专家
PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型,在游戏场景渲染中,它用更接近物理光学的方式,建立一个对全场景材质的大一统shader。大一统shader的好处包括:统一美术制作管线加快制作效率,对动态光照环境的更耗的适应性,减少shader维护的负担等。本文总结了PBR的理论知识以及具体在Disney和UE中的典型应用。
1.1 光波
1.1.1 光波能量描述
渲染来自于光照,先要明确光照度的度量。光照源于单位时间内单位视网膜接受的光的能量。
感受光波亮度
光存在波粒二象性,当光子能量较高的时候,表现粒子性,按照普朗克定律,e=hv,能量同频率(或波长)有关,按照maxwell方程,e确同振幅的平方有关。对于可见光部分,振幅的影响要大于频率的影响,光波的能量基本取决于光波的振幅(即对可见光来说,能量不主要来自颜色(频率))。量化单位时间内通过单位空间界面的能量流(enrgy flow)来量化光波,这个值通常被叫做irradiance,或者大写E,翻译为辐照度,单位应该是energy/s*t(s为面积,t为时间),即Watt/m*m。
感受光波色度
可见光区域的光能虽然同振幅相关最大,但是不同频率的光对视网膜的刺激效应不同,一些低频长波的光波的组合很容易激发人们对红色的感觉,一些高频短波的光又很容易激发人们对蓝色的感觉。因此色度感知其实是在等于感知光波的频率。可见光的振幅决定的光的能量,但是波频确决定了色彩感知。
我们看到的光波基本都不会是一个单频率的一个波,而是由各种频率的几个波组成的,这个组成比率可以用频谱来表示。事实上考虑到光波是不同频率波长的组合,那么图形学里的渲染公式应该跟当前场景中所有光波的频率种类相关,即对每个频率的光波分别计算,最后叠加。但是这个太复杂了,所以现代图形学只是按照简单的长中短,即红绿蓝把一个光束聚类降维到三维,或者简单认为任何光波都是由三种频率组成的,所以图形学用rgb来量化光能,而不是(I1,I2,I3…),基于光谱(spectrum rendering)的物理渲染则是真正考虑每个频率的维度,虽然基于低维的光谱渲染已经出现在实时渲染领域。
光波的复合
因为波的复合是个复杂的问题,所以考虑到波的复合,那么光的能量不是简单的各个波的叠加。例如下面三种情况,相位不一致,结果强度完全不一致,图形学里该怎么办?我们认为第三种情况即随机的情况是最容易发生的,这种情况结果近似波能叠加,所以在图形学公式里,才能简单的把多盏光源的结果线性相加,在这里已经忽略了光波的干涉(interference)了。不过类似的工作在离线渲染领域有很多,例如薄膜干涉效果。此外这里也没考虑到衍射(diffraction)。
1.1.2 光源
所有的光波都是从光源发出来的。
度量光源
光源在单位时间发射出的总能量叫做radiant,或希腊字母φ,翻译成辐射量。表示光源的辐射能力。因为能量的单位是焦耳J,单位时间的能量单位一般用功率表示即瓦特Watt,所以Radiant的单位是Watt。
因为光源辐射的能量在不同方向可能是不同,所以用于描述光源在特定方向的辐射能力,还有另外一个度量,即定义为单位时间内光源在单位球面度上的辐射能,叫做intensity,或I,即我们熟悉的光源强度,它的单位是Watt/sr。一整个球面的球面度是4π。
光源类型
不同的光源类型的区别是对场景表面点的影响即radiance不一样,不同的光源类型就是影响E的方程E=f()不一样。
不带位置的光,也叫方向光,不带位置,只有方向,太阳光,用一个常量C就可以表示它对所影响物体的radiance,即E=c,这种光是物理不存在的,是模拟的远距离太阳光,可以认为没有Radiant,Intensity的概念。
带位置的光,对于表面任何一点,从一个光源只有一个方向的光线射过来,也就是说光源无形状。用光源位置P1,表面位置P2,和强度I定义它对表面点的影响E,即E=f(P1,p2,I),一般来说I又是光照方向的函数,记为I(d)。即E=f(P1,p2,I(d))。或者可以表达成E=I*dist(p)*l(d)
泛光(点光):I(d)是常量的情况,叫做omni light,泛光,这是我们常说的点光,即光源强度不随方向改变。泛光的E=I/r2.(怎么推导的?E=总能量/4π*r*r, I=总能量/4π。)事实上,点光的E一般都不会用1/r2,因为距离太近的时候要在数值上处理极大值(这不是bug,因为极小值的积分会抵消,但是数值表示极大值有困难),且距离太远了无限接近极小值也没有意义,不如及早抵达0来消除一些不受光源影响的物体。一般表达成1/(s+sr+sr2)
聚光灯:l(d)随着方向改变,对于I(d)
的这种情况,就是聚光灯,它的光强随着角度的扩散变弱。E=l(d)/r2。
其实我们可以用E=J*dist(p)*l(d) (光源能量*距离衰减函数*方向分布函数)表达上面所有光源,方向光l(d)和dist(p)都是常量,泛光只有l(d)是常量,聚光灯都不是常量,一些光照计算中用所谓的uber light来表达任意光源。
1.1.3 介质对光波的反应
Scattering 散射
散射是一切光照视觉现象的基础。光波在介质中直线传递遇到物质分子会四处反射,一束光线碰到一个表面,会跟表面物质反应激发出向其他很多方向的新的光线,这就叫做散射。散射其实就是光波遇到物质分子后发生的反应,通常在原光波方向上散射出的光线更多,散射后的频率和原始光波可以认为是一致的,不讨论不一致的情况。
均匀介质
光波在光照方向上散射出来的能量要更高一些,或正向或反向。如果介质组成一致的,那么散射产生到某个方向的光波,会被互相干涉,能量抵消,只剩下直线传递的那个部分光波,所以均匀介质中光波才可以看做直线传递没有散射的。
粒子介质
如果小粒子是最理想化的均匀分布,多个粒子对同个光波的散射会成线性叠加。如果小分子是聚集成一个个比波长还小的cluster,那么就会出现同phase的光波叠加,光的能量会变成n2增长,大气里的光线散射较强是这种原因,这也叫做rayleigh散射(注意这不违反能量守恒,因为能量守恒是建立在线性叠加的基础上的而没考虑干涉);当cluster要大于波长后,变成mie散射,如云雾。
1.1.4 表面对光波的反应
表面是两种介质的分界面,上面研究光波在单一介质中的传递,这里研究光波遇到介质分界面的行为。
首先光波在遇到介质表面后不会向单一介质中那样向各个方向散射,只会向两个方向散射,反射方向和折射方向。
次表面散射
但是折射方向的光波会继续在单一介质内散射,导致最终一些散射的光线重新反射出介质,这些从体内反射出来的光线叫做次表面散射,也有一些光波在介质内被物质电子吸收。
所以表面对光源的反应,总的上来看,一些被吸收,一些被表面直接反射出去,一些被折射出去,一些经过次表面散射反射出去。因为有了次表面散射的复杂作用,一个光入射表面,不再是产生反射和折射两个新的光波,而是折射,加上向各个方向的反射光波。
1.2 BRDF
量化物质表面对光波的反应
渲染中我们大部分时间是处理光波对物质表面的反应,前面量化了光源,这里就要量化物质表面对光波的反应。因为上面提到的表面对入射光波是几种反应,而我们通常关心一个光波经一个表面点后反射到另一处(如摄像机),所以定义了一种度量,它描述给定一个光波入射方向l,一个对表面点的观察发现v,物质表面沿v反射(及次表面散射)出来的光波的irradiance和入射光波的irradiance的比值f(l.v)。这个叫做brdf(binary reflection distribution function)
严格来讲次表面散射不能用brdf来定义,定义次表面散射要用BSSRDF,但是当物件离摄像机有一定距离的时候,次表面散射出来的位置会趋近于同直接反射的位置重叠,这时候就可以用BRDF描述次表面散射。BRDF可以描述那些离摄像机不是很近的物体表面的反射和次表面散射。
对于BSSRDF来说,如果物质次表面散射出逃点距离入射点很近,这种又叫做local subsurface scattering,,而出逃点较远的话又叫做global subsurface scattering。Lss还是gss 取决于材质以及观察点,观察点远趋向于lss,而皮肤这种材质更易趋向于gss,它的次表面反射距离很长(长于一个渲染pixel),当然当观察距离足够远,皮肤也会变成lss了。更近的lss就可以用brdf来描述了。
BRDF有两个重要的属性:
f(l,v) = f(v,l),这是表面特性,此外反射能量要小于进入能量(能量守恒)
量化光波的传递
在前面度量接收器对光波的接受的时候用辐射度irradiance来量化单位时间单位表面接受光源的能量,它接受的可能是来自各个方向的多个光波辐射能,但是在计算光线传递的过程中,因为考虑到单束光线是有方向性的,所以会把irradiance再计算一个在立体角上的微分,这个量叫做radiance, 英文记为L,翻译做光束光辉,它的单位是watt/m2*sr, radiance同irradiance的区别是它表示了单位面积表面通过的单位方向的光能,而不是各个方向,把irradiance可以想象成一个漏斗,而radiance则是一个细管,在一束光波的传递过程中基本都用的是radiance。
BRDF与Shading
渲染的一切是为了计算在摄像机上的图像,有了brdf我们就能进行基于物理的光照计算。
只有小孔才能成像 图形学里通常的渲染模拟的是针孔光圈,它一般没有模拟大光圈(会有景深,远景模糊)。如下图上表示真实的小孔成像,中是图形学中为了方便计算把成像器至于针孔前的情况(这样不是倒像),下图是大光圈的情况。
成像单位(单位感光器)的辐射能量是 L*darea*dsr的积分,即成像单位上每个微小面积收到的来自于各个方向的所有入射光波的辐照度的积分。
具体的例子,设光线经过表面点p射入观察方向v的radiance是L(p,v), ps shading的目的就是为了计算这个L(p,v)*darea*dsr的积分,设光源方向是l,则从l入射到p的光束的radiance可以表示成L(p,l)。那么反射方程是:
在这里L(p,l)可以从光源的强度I计算得到,即dI/darea, f(l,v)是brdf,后面的n.l是因为L(p,L)的度量是计算当它垂直照射平面时的能量流,在此时它不垂直入射,真正进入表面的如何能量要乘上一个cosθ,即nl。这里积分上半球的l并不是说积分每个方向的入射光线,而是对特定的入射光l,认为它在上半球上各个方向都可能存在能量的进入。
简单来讲,表面的颜色和所有能入射到该表面的光线的光束能量同表面brdf有关,所以物质表面的brdf对于光照计算来说是必备的属性。
这里shading的结果只是算了光线经p反射到v的部分,这个反射包括直接的表面反射和次表面反射,事实上完整的模型还应该加上p自发光的能量,所有光线经p折射入v方向的能量,即Lo(p,v) = emitted + reflected (fresnel+ss)+ refracted ,很多时候为了简化或讨论不透明物体的就不算refracted部分了,而reflected通常又只讨论local的ss,即次表面出射点很近的部分。
根据上面的公式也可以算出来全局光照的结果,对于屏幕上的每个像素小孔成像追踪到的表面点p,计算它的L(p,v),这里所有表面的f(l,v)可求得,剩下就需要追溯所有会影响到它的光线l,遍历所有的l,如果l是指向光源就直接拿到L(p,l),如果l指向另一个表面点p2,就先递归计算L(p2, l)…如此追踪下去,这就是光线追踪的原理。整个过程只需要根据BRDF模型计算任何两个方向的brdf,以及追踪每个从光源发出的或经过反弹的光线。
1.3 BRDF的表示(次表面散射性质,能量守恒性质)
brdf的量化计算要考虑入射方向和反射方向分别有两个旋转自由度,所以BRDF有4个自由度。BRDF(lθ,lφ, vθ,vφ),对于一些情况,l和v,绕着法线旋转的时候,BRDF不变,这种叫做各项同性brdf,就相当于这有3个自由度了。
不同物质表面对光线的反应
反射角一定和入射角相同的,折射角同入射角遵守snell law,次表面散射出来可以向任何方向,折射是次表面散射和吸收的来源。(入射光->反射光+折射光->继续折射出去+次表面散射+吸收)
金属内部的运动电子会将部分折射光重定向到反射方向去并吸收一部分,所以金属的反射很强,吸收很强,次表面散射很弱且反射方向附近的反射强度大,blinn-phone用视角和反射方向的角度来量化金属的反射比。
非金属:反射弱,向各个方向的次表面反射均匀,吸收少。Lambert描述下反射光线同视角和入射方向无关,是均匀的反射体。(lambert公式里面会对摄像方向l点乘法线,这并不是说lambert的brdf认为反射比同l方向有关,l*d不是brdf的一部分,而是上面反射方程中的一部分)
Albedo与能量守恒
如何衡量一个brdf是否能量守恒?
这里先引入概念叫做DHR(directional –hemispherer-reflectance),方向/半球反射比。
R(l)代表入射光束l经表面碰撞后,向所有表面法线上半球方向反射的光线方向光束v的积分。
如果没有任何吸收和折射,那么这个值应该是1,注意这里的n*v同反射方程里是一样的。
可以反过来得到HDR(Hemisphere-directional-reflectance)(即所有法线方向上半球过来的光束l对观察方向v的brdf的积分)
并且二者相等。
这个R值就是所说的albedo,albedo的意思就是DHR。DHR或albedo〈1就能说明该brdf能量守恒,albedo是物质表面重要的属性,描述整体对光线的反射能力。
下面讨论不同表面的brdf
A 纯Lambert表面:(次表面散射能量为主)
Brdf是个常数c,R = c*π (半球上各个方向的积分为π,整球的立体角是2π) c= R/π
对于lamber表面 ,则光源l经表面p反射到v的光线L(v) = ∫c*L(l,p)*dot(l.n),最终考虑各种积分运算在ps上得到的公式就是c*I(L)*dot(L,n)*π, (这里L(l,p)的Intensity对area的微分被最终L(v)的积分抵消,反射方程里对球面各个方向的l积分得到π,lambert模型里面经常用一个漫反射参数来表示c*π这个整体),这也正是我们传统的lamber光照模型。
B 纯Fresnel 表面(直接反射能量)
首先考虑完美的绝对平滑两个物质表面分界,射入光线L,反射Rfl(表面的直接反射),折射Rfr, Rf = Rfl/L,Rf被称为fresenl反射率,对于特定的物质界面,Rf只跟入射光线的角度有关。设入射光线和法线的夹角θ,则Rf随着θ的增大而增大,垂直的时候最小,记为Rf(0)或F(0). F(0)表征了物体表面直接反射的能力(即我们看到的高光的主要部分),也可以看做材质的高光颜色(Unity的standard shader里面是使用albedo乘金属度做高光颜色),通过统计各种材质的Rf(θ)同RF(0)之间的关系,得到了各种估计公式,例如著名的schlick公式:
不同材质的Rf0特性:绝缘体的rf0较小,多数0.05一下,且随光谱变化不明显,即rgb值差不多(即非金属不用太考虑高光颜色),而金属就很高,多数0.5以上,且随光谱变化较大,rgb三个值差异较大。
半导体在这之间,但是很少存在于渲染场景中,0.2-0.45之间的物质几乎不存在与现实生活中。
Fresnel和次表面散射参数的量化
正常我们需要一个表面的albedao ρ来表示次表面散射和一个F(0)来表示fresnel反射。这是两个rgb值,为了美术习惯以及节省带宽,一般用一种metalic(单通道),一个specular(单通道,有些引擎也没有)和一个Csurf(RGB)的方法来表示。
因为当物体是金属的时候,次表面散射可以忽略,这时用Csurf表示F(0),而当物体是绝缘体的时候,f(0)通常集中在很有限的几个值上,且和光谱关系不大,甚至都不需要区分rgb三个量,有的引擎可以用一个常量rgb表示,有的引擎会用specular乘上Csurf(给一个大小调节),而Csurf就是次表面散射的albedo ,而m介于0-1之间,作为金属部分和非金属部分两个公式的混合。
所以在ue里看到的metalic只是一个调节金属度程度的值,Albedo则是表示在绝缘体下的Albedo或者金属下的Fresnel(0),而specular则表示在绝缘体下通过缩放CSURF得到的F(0)。
C 微表面理论下的纯fresnel表面(金属)
NDF 法线分布方程
大多数表面的微表面法线特性是:
连续分布,并且在主发现处分布最高。
表面越光滑,就有越多的子表面法线朝着主法线。
视角越低,就显得越光滑,因为一些低处的面被遮挡了。
微表面反射次数越多的光线颜色越深(越接近物件本身的颜色)。
回射现象,当微表面的不规则性要大于微表面的散射距离,即粗糙的尺度比较大,则可能散射的光线没被微表面遮挡而回到反射方向,表面看上去要更光滑。
微表面的每个表面都可以认为是一个绝对的fresnel反射表面。
NDF d(M),M是微表面法线 ,分布方程 d(m)代表在微表面上m方向法线的面的比例,满足下列两种表达:
所有微表面法线在方向v上的投影等同于主法线在方向上的投影 ,所以在更高的维度上,主法线确实表示了微表面法线的综合的可见行为,这也是主法线的计算依据。
但上面公式没有考虑到微表面的遮挡 即通常的vn是没有考虑微表面在其他微表面阴影中的情况 遮挡项目 G(m,v)代表所有m朝向的微表面在v方向的可视比例.可以说d描述的是微表面法线的分布,而g描述的是这些面的摆放方式,d和g共同决定了微表面在方向v上的可视程度,事实上如果不考虑g的因素,单纯考虑d也没有意义了,如果g永远是1,那么就可以用主法线来表示了。
所以上面的公式考虑到遮挡后就成了:
其中G(m,v)是方向m在v上投射时可视的系数 这个m在v方向观察时完全无遮挡就是1。
一个著名的遮挡项公式是smith的G1 masking公式:
其中下面的λ项和具体的ndf方程选择有关。
如果不只考虑微表面对微表面的遮挡 ,还要考虑微表面对光源的遮挡,就成了G2公式。
G2(l; v; m) = G1(v; m)G1(l; m) 这只是最简单的一种g2,g2不只考虑m在v上的可见程度(masking,遮挡) 还考虑m在光源l上的可见程度(shadowing)。
已知微表面的brdf,g2,d,得到的宏观表面的brdf。
而微表面的brdf通常认为是纯fresnel表面的。
而在fresnel里面只有m等于h(l+v/2)的微表面才反射能量。所以上面等式就变成了:
几种ndf模型下的 λ:
Beckmann ,在cook Torrance brdf里使用。
or
其中a是光滑程度(m指向n的程度)。
Blinn-phone
使用上面相同的lamda。
GGX 它其实最早被blinn phone 从 trowbrigdge reitz的模型派生出来,但是30年后被walter独立的发现,walter把它命名为ggx,后来在游戏中广泛应用。
Ggx的brdf下一种简化的g1。
D 微表面理论下的次表面散射(非金属)
首先金属的次表面散射程度很低,所以对于金属来说,上面的无次表面散射的微表面模型就可以了。只有非金属才会讨论这个模型。
将次表面的散射距离和微表面不规则的尺度对比。
如果次表面散射距离更小,那么微表面作用强烈,表面看上去更粗糙,可以继续用微表面理论来建模。
如果次表面散射距离更大,那么微表面作用小,表面看上去更光滑,不能再用微表面理论建模。
如果出于中间状态,可以用微表面理论建模,但是需要一个额外的量effective surface表示那些散射距离小于微表面距离的散射。
此外观察距离越远,微表面距离越大,更倾向于粗糙模型。
D1光滑表面的次表面散射 认为没有微表面
这种首先可以先想到就用A的lamber模型来表达,因为微表面作用很差,但是lambert模型里面所有光线都假设进入体内然后向各个方向均等反射出去,忽略了直接反射的光线无法被做用作次表面散射。
D1对于A模型的提升就在于加了个trade off在specular部分和scattering部分之间,它同入射角有关。入射角变大,fresnel变强,一种计算scattering的bgrf就是用如下公式:
即非fresnel的部分缩放原本的c。
D2 粗糙表面 微表面适用的次表面散射模型 认为是上面C类型的微表面带次表面的版本
这个模型最为复杂 ,如shirly的模型。
此外Disney也有个经典的微表面理论的次表面散射模型,被称作disney diffuse,后面会详细讲到,广泛用于电影中。
在实时渲染领域,微表面的次表面散射太过复杂,通常使用lambert的简单次表面散射模型来代替,而微表面的fresnel因为简单所以被采用。所以微表面的fresnel反射+lambert的次表面散射是大多数游戏引擎的brdf方案(他们之间通常会加一个metallic的值做lerp)。
2.1 Disney 模型
Disney的pbr模型的创立过程遵循了一个很科学的方法论,即拿真实材质的brdf同数学模型反复对比调优,即能体现真实材质的模型才是最准确的。
Merl 100
下图是merl100图,它是个数据库,存储了常见材质测试出来的真实brdf,因为各向同性的brdf是三个自由度,所有需要用个cube表示,下面的每个图是这个cube的一个截面。x轴表示h同n的夹角,靠近0时就是高光峰值 (specular peak,大部分图靠左边是亮线),y轴是光线同h夹角,靠近90度时是fresnel反射的峰值(fresnel peak,大部分图靠近顶端是亮线,左上角因为是peak叠加,最亮),而z轴则是光线和视线在φ上的夹角,区中截面取的是180度时。而右下角则是回射区,也叫grazing(m同n夹角接近90,即我们视线同光线同方向观察物体,且光线同物体法线几乎垂直,想想拿手电筒照亮物体的边缘,且用眼睛盯着边缘处。部分物体有回射亮斑。)
一些表面存在回射现象,尤其是粗糙表面,因为它存在一部分和主发现n反向差很大的例如垂直的h,恰好反射了这个grazing角度的光.这也被称为fresnel现象,而光滑表面则不会,光滑表面的grazing 角度反而更暗,因为这个角度上大部分光线被表面反射了,散射的更少。比如用光线垂直照射一些物体的边缘,我们盯着边缘看会看到边缘比旁边更亮一些,这是微表面模型的显著特点。
下面是φ的切片:
此外这里还有一条虚的曲线,它就做等值线,等值线上的入射光线角度等于视线的夹角,这代表这条线以下的地方受diffuse影响较大(称为散射区域),上面受specular影响较大。
Disney通过观察merl100 brdf的特点 来找到合适的模型
观察diffuse区域
Lambert假设brdf是个常量,假设光线被充分的散射到各个方向以致于失去了方向性,在各个方向散射均衡,但是从merl100我们看到对于大部分物质在散射区域能量也是分布不均的。
一个比较大的出入在于一些粗糙表面的grazing 回射现象,lambert没能表达。
观察D项
D项是法线分布,即哪些方向的H分布的多,可以通过观察θd为0时各个θh的反射来直观的观察(即merl100图的x轴,此时lv重合,为微表面为h的面的反射最强能量)。因为回射现象,光滑和粗糙的反射-θh曲线是这样的(大体随h的变大而明显衰减,但是粗糙表面因为回射现象在h解决90时反而上升)。
这时对比一些现有的法线分布模型给出的反射-θh的函数曲线,看哪个和真实相符。
黑色是真实的铬材质,红色是ggx,蓝色是blinnphone,右面是对应的高光斑。
观察出来真实表面的高光斑有个特点,峰值区间短,但是长尾,即小光斑加较远的光晕范围。
这个传统的blinnphone那种峰值和尾端均匀分布的特点不一样。
Disney模型认为ggx比较接近,但是还差一些,它因此增加了一个控制高光尾部延盏范围的参数。
观察Fresnel项
一些merl100上的fresnel项基本是这个样子的。
观察G项
首先G必须和D F联合使用,不能直接观察G,但是G的作用可以通过直接观察Albedo,因为如果不考虑物质的吸收,那么G项就是直接影响了总反射率,使用很少的简化假设,可以从D项衍生出G项,算法如《Geometrical shadowing of a random rough surface》,Albedo是半球面每个方向的反射能量和入射光线比(所以不用考虑视线方向高光项),下面分别是光滑和粗糙表面的albedo曲线。跟lambert模型不同的是albedo并不是不随角度变化的(lmabert里面的cos和这个无关)。
光滑模型的albedo在75度有个明显的提升,然后到90迅速回落。(从f项看到90度时fresnel最强,感觉总反射率应该很强,其实不是,90度的光滑表面除了grazing之外的大多数视线方向的D项即specular都很差,收不到太多光线,而90度时的体反射又很差,总反射率是不高的)
粗糙模型的albedo会一直增长到90度,因为粗糙的原因,很多遮挡被绕过了,90度时很高是有一些回射现象的产生。
下面对比一些G模型和这个merl的曲线。
此外还有观察到一些特殊材质的曲线特点。
Fabric 纺织物:
1.grazing angle有tint color的高光。
2.Fresnel peak会比较强。
因为织物会经常看到附近部分。
Iridescence 虹彩
可以通过为specular项建模,依据θh和θd,一般要使用个彩虹图采样。
基于上面的观察,Disney确定了它的PBR模型。
首先是材质模型
材质参数设计原则:
- 使用直觉而非物理参数
- 使用尽量少得参数
- 参数都应该是normalize 0-1的 线性变化的 便于线性插值
- 参数可以被美术设置的大于1 只要它有意义
- 参数的任意组合都应该有意义 鲁棒性高
选用的参数:
basesecolor:半球反射比中反射到次表面散射的那一部分比例(去掉表面反射)
Subsurface:控制次表面散射的形状
Metallic 0纯次表面散射(绝缘体) 1纯fresnel反射(金属) 在两种模型之间的线性过渡
Specular 高光反射的强度 其实是被用来计算F(0)
Specular tint 对specular的颜色偏移
Roughness:粗糙度,对diiff和specular都有影响
Anisotropic 各项异性程度 控制高光的方向比(从0各项同性到1最大的各项异性)
Sheen:for cloth,即对回射的增强,前面说织物的grazing 回射要强一些
Clearcoat:第二层高光分布
clearcoatGloss :控制clearcoat的gloss
下面是shading model
Diffuse Model(次表面散射部分)
这里没有简单的使用lambert,而是使用了基于微表面的次表面散射,但是比前面提到的sherluy的模型要简单。
首先整体上认为diffuse是跟fresel项相关的,因为fresnel越强,diffuse的反射就越弱,即公式(1 - F (θl))(1 - F (θd))
然后这个里面为什么是两个fresnel因子相乘,是因为即要考虑入射的也要考虑射出的,因为一个夹角取入射光线夹角θl, 一个取入射和半角向量的夹角θd。最后要除以积分项π。
下一步是展开两个fresnel项,采用scklic公式,但是这里认为对于diffuse不用考虑roi(折射系数,diffuse的折射光线损失),所以删除了scklic公式里面的F(0),如果不考虑roi,那么这个入射的diffuse的能量就是个定值,这个定值是baseColor系数,(他不等同于albedo,albedo是半球反射比,而这个baseColor则是对于diffuse用于固定的入射能量)。
最后它引入了量FD90 , 这个要回到前面提到的对D的观察,注意到粗糙表面的边缘回射现象很强,所以FD90 正是为了调节这个 影响,他是个经验公式,可以看到roughness越大,它越强,光线和视线夹角越小则越强。它带来了一个0.5-2.5范围的调节。
使用这个diffusemodel得到的brdf图和merl100则相似度很大。
此外这里还要考虑一个subsurface的系数,subsurface表示使用次表面散射的sbrdf,即散射范围要大于粗糙程度,这个参数会在这个模型和sbrdf模型之间过度,使用的sbrdf来自HanrahanKrueger subsurface BRDF。
Specular Model(表面高光反射部分)
NDF
总体上使用的GGX, GGX的公式其实是Trowbridge-Reitz
即考虑半角向量同法向量的夹角,以及α代表的粗糙度。粗糙度为1,则绝对粗糙,各方向相同,粗糙度0,绝对平滑(此时半角向量夹角越小,值越大)。但是ggx只是更通用的Generalized-Trowbridge-Reitz公式的一个γ取2的版本。
根据前面对merl100的观察,本模型选取了GTR中参数为2的版本。
但是对于clearcoat那一层则选取γ为1.(即光斑更小,拖尾更长)
此外这里暴露的粗糙度参数alpha直接就是rouphness平方,一个是为了方便美术调整,而是保证线性插值正确。
Fresnel项
基本采用schlick公式
它被限制在0-0.8,匹配一般ior的范围1-1.8.而对于cleacoat,则使用固定的roi1.5(代表聚酯酰胺的材质),然后使用clearcoatgloss(0-0.25))这个参数去整体调节clearcoat这一层的颜色强度,而不是单独调specular。这些参数调整主要是出于要让artist能够调出合理的真实材质。
注意θd是光线同half向量的夹角。
G
基本上使用GGX walter的做法,但是这个G从前面的观察中在smoothness的边缘会过亮,所以这里在算g的时候会remap这个roughness,把它改到0.5-1之间,
对于clearcoat则使用一个固定的roughness 0.25计算。
2.2 UE4中的应用
UE的材质设计者先参考了Disney的模型。
UE中材质参数的设计原则:
- 高效 支持多光源
- 参数越少越好
- 可同时支持不同的光源,包括ibl
- 使用美术可理解的参数,而不是pbr里原本的物理参数
- 单pass
- 参数线性, 因为需要支持多层材质,而最终只希望ps执行一次光照模型 就涉及到所有参数支持线性插值, 希望使用混合了的参数去做shading和shading后混合的结果尽量贴近
- 无需使用者理解绝缘体,金属体这些物理性质,同时也难以创建物理不存在的材质
- 因为deffered shading对lightingmodel的数量有限制, base shading model应该覆盖99%以上的世界上的材质
- 材质参数统一以便混合他们
- 可以一定程度支持非真实感渲染的需要
shading model
Diffuse(次表面反射)
因为disney模型里面复杂的微表面diffuse看上去效果和lamber差的不多,且难以用在ibl和sh上,因此就采用最简单的lamber模型
, CDiff就是DHR,或者albedo(0-1)。
Specular(fresnel反射)
采用的微表面模型,对于D,使用同disney一样。
对于G,使用的不是标准GGX里面的smith shadow function G2,而是使用的更简单的schlick模型的G2,但是k=α/2,这样是为了能够同GGX匹配(在alpha=1的时候schlick模型同smith模型是相同的, 在0-1内也是很接近的)。但是他们借鉴了disney模型将粗糙度在平方前映射到(rough +1)/2的做法,来修正ggx同真实材质在曲线尾部的差异(在ibl则不用)。
Schlick模型的G2公式是:
对于F项,则稍微修改了schlick的frensel公式,使用soherical Gaussian 估计 ,据称差异是不显著的。
IBL
预先生成每个粗糙度下球面的ibl贴图。因为IBL的计算是个半球面积分,需要用到重要度采样去计算这个积分问题。
Material Model
采用了disney材质参数的简化版;
Basecolor:albedo,半球反射比。
Metallic:diffuse 和specular的过渡。
RoughNess:粗糙度。
Cavity:这个很特殊,它用于计算细节阴影(法线贴图产生的)。Disney有个specular,代表F0(其实disney是表示整体specular的缩放),在这里设计者怕美术对这个名词产生迷惑,另外测试了对于metal大部分的F0产生的效果没有太大差异,因此它的F0从这个cavity算出,另外对于nonmetal这个F0被设置成0.04。
至于subsurface clearcoat sheen则采用单独的模型。
Material Layering
这是ue的meterial editor的主要设计驱动。
Lighting Model
点光源的距离衰减公式是
Arelight
没有arealight 美术会倾向将粗糙度调高,因为低粗糙度导致反射能量弱,高光刺,这都是缺少光源导致。采用的TubeLight来模拟。
以上就是对PBR的精度模型和在ue4,disney中应用的总结,没有一种模型是可以用在所有项目中的,也没有哪个是绝对物理的,还是要根据自己项目的实际情况,权衡效率和性能,权衡艺术化和真实物理merl100后确定自己的PBR使用,关键在于理出自己的material model(暴露什么样的参数给美术条件,参数之间怎么混合), shading model(brdf的每一部分选用什么公式,分解到具体的次表面反射,fresnel,ndf和G),light model(支持哪些光源类型,方向分布和距离衰减公式分别是什么)这三大model。
关于腾讯游戏学院专家团
如果你的游戏也富有想法充满创意,如果你的团队现在也遇到了一些开发瓶颈,那么欢迎你来联系我们。腾讯游戏学院聚集了腾讯及行业内策划、美术、程序等领域的游戏专家,我们将为全世界的创意游戏团队提供专业的技术指导和游戏调优建议,解决团队在开发过程中遇到的一系列问题。
申请专家资源请前往:
https://gwb.tencent.com/cn/tutor