基于物理着色

来源:互联网 发布:淘宝助理5.5版本下载 编辑:程序博客网 时间:2024/05/22 16:54

基础

BRDF一般描述了两个物理现象,表面反射和表面散射。每个现象行为都是不一样的,所以BRDFs有分离的因子,其中描述反射的叫做镜面因子,描述散射的叫做漫反射因子
BRDF一般都是对表面以上的光照方向和视线方向定义的,所以要保证(nl)(n·l)(nv)(n·v)的非负。这一点在着色的时候必须注意。
BRDF有两种解读。一种是给定入射方向和光照,BRDF给出所有相关的反射和散射分布。第二种是给定视线方向,BRDF对每个入射方向都给出所有相关的出射方向。
BRDF是一个光谱量,所以理论上应该和波长有关,但是在实践中一般不会考虑这么复杂。我们一般考虑RGB BRDF去调制RGB光照颜色就好了。这也就是说BRDF是一个 spectral-valued function。这样一来我们的渲染方程一般可以写成这样了就:

Lo(v)=Ωf(l,v)Li(l)(n,l)dωiLo(v)=∫Ωf(l,v)⨂Li(l)(n,l)dωi

中间那个代表调制,也就是逐项相乘,最后返回向量。
BRDF必须有三个性质:

  • 物理可信
  • 双向(Reciprocity):f(l,v)=f(v,l)f(l,v)=f(v,l)
  • 能量守恒:any l,Ωf(l,v)(n,v)dωo1any l,∫Ωf(l,v)(n,v)dωo≤1

只有具有这三个性质才能谈得上基于物理。牢记这三条性质,在后面我们评估一个brdf的时候总是要考虑他们所有。

grazing angles:切线角,顶点在球边缘,一个边与球相切的角。

另外,我们使用基于物理的模型的时候,必须要考虑一些因素,这些因素包括:

  • 高效
  • 艺术家友好:参数直觉化,参数尽量少
  • 健壮,可信

首先是高效,无论offline还是realtime,高效都是相当重要的,realtime的高效是必须要求,而offline的高效可以显著的节约成本提升生产率。
艺术家友好意味着参数化这些模型,每个模型都要有足够的控制参数暴露给艺术家,调节这些参数就可以调节出不同的材质。Disney就在他们的模型中提供了一大堆参数,分别用于控制不同的材质呈现,有的甚至是很细节的东西。具体的参数作用可以参考[4].下面给了一张图,方便直观的看看这些参数的作用。

后面的健壮对于产品来说是必须的,可信则是我们引入PBS的首要需求。


当然,不同的具体需求肯定有不同的具体要求,下面列的是UE4和Disney的要求,一个做实时一个做离线,都可参考一下。

Disney

  1. Intuitive rather than physical parameters should be used.
  2. There should be as few parameters as possible.
  3. Parameters should be zero to one over their plausible range.
  4. Parameters should be allowed to be pushed beyond their plausible range where it makes sense.
  5. All combinations of parameters should be as robust and plausible as possible.

UE4

  • Real-Time Performance
    First and foremost, it needs to be efficient to use with many lights visible at a time.

  • Reduced Complexity
    •There should be as few parameters as possible. A large array of parameters either results in decision paralysis, trial and error, or interconnected properties that require many values to be changed for a single intended effect.
    • We need to be able to use image-based lighting and analytic light sources interchangeably, so parameters must behave consistently across all light types.

  • Intuitive Interface
    • We prefer simple-to-understand values, as opposed to physical ones such as index of refraction.

  • Perceptually Linear
    • We wish to support layering through masks, but we can only afford to shade once per pixel. This means that parameter-blended shading must match blending of the shaded results as closely as possible.

  • Easy to Master
    • We would like to avoid the need for technical understanding of dielectrics and conductors, as well as minimize the effort required to create basic physically plausible materials.

  • Robust
    • It should be difficult to mistakenly create physically implausible materials.
    • All combinations of parameters should be as robust and plausible as possible.

  • Expressive
    • Deferred shading limits the number of shading models we can have, so our base shading model needs to be descriptive enough to cover 99% of the materials that occur in the real world.
    • All layerable materials need to share the same set of parameters in order to blend between them.

  • Flexible
    • Other projects and licensees may not share the same goal of photorealism, so it needs to be flexible enough to enable non-photorealistic rendering.


下面将会介绍几个反射模型,然后重点讲述微表面模型其中包含了各大厂商实施PBS的经验。


Lambertian漫反射

Lambertian反射就是我们所说的完全漫反射。这是理想模型,但是对于粗糙材质的模拟很不错,例如纸张,消光涂料。
Lambertian表面与出射角度和入射角度均无关,根据反射辐射度公式:

Lo(p,ωo)=Ωifr(p,ωi,ωo)Li(p,ωi)cosθidωiLo(p,ωo)=∫Ωifr(p,ωi,ωo)Li(p,ωi)cosθidωi

只有在brdf与两个ωω无关的时候才会出现这一情形。所以把他提出来,定义为fr,d(p)fr,d(p)得到:
Lr,d=fr,d(p)Ei(p)Lr,d=fr,d(p)Ei(p)

考虑辐射度与入射辐射度的关系:

Ei(p)=ΩiLi(p,ωi)cosθidωiEi(p)=∫ΩiLi(p,ωi)cosθidωi

如此我们得到了反射辐射度,如果我们求得brdf,并且积分出Ei(p)Ei(p)就可以求得反射方向的辐射度了。

下面来算brdf,使用反射率公式,带入对上半球积分得到

ρ(p)=dΦo/dΦi=Lr,d(p)π/Ei(p)=fr,d(p)πρ(p)=dΦo/dΦi=Lr,d(p)π/Ei(p)=fr,d(p)π

故:
fr,d(p)=ρd(p)/πfr,d(p)=ρd(p)/π

在漫反射中,我们的brdf仅仅是一个和p相关的系数(这个p用于纹理),所以我们可以设定这个数,根据上面说的颜色调制原理,我们将这个设置为一个RGB以便用来表示材质颜色并且调制反射颜色,设为cdcd,同时加上一个漫反射系数kdkd.

所以Lambert brdf就是

fr,d=kdcd/πfr,d=kdcd/π

在实时渲染中,我们处于一些设计上的方便原因丢弃了ππ,这个因子的作用在于能量守恒。于是,我们就能很清楚的得到下面索要说的lambertian表面的反射公式了。

漫反射强度 = 漫反射颜色* 逐灯光求和(光照强度 * (n·l))

第一项是没有考虑能量守恒的brdf,逐灯光求和表示积分,后面的就是入射辐射度乘以cos因子(至于这个cos因子更加详尽的解释在后面)。

辐射能用Q度量,Q的单位是焦耳,每个光子携带能量为,Q=hcλQ=hcλ
辐射通量Φ=dQdtΦ=dQdt是指单位时间内通过表面的能量,单位是瓦。
入射辐射度是到达物体表面的辐射通量密度E=dΦdAE=dΦdA,单位W/m2W/m2
辐射强度是每个单位立体角的密度通量I=dΦdωI=dΦdω
辐射度单位立体角,单位投影面积上的通量,

L=d2ΦcosθdAdωL=d2ΦcosθdAdω

反射率
反射率是反射通量和入射通量的比例系数。对于立体ΩiΩi,微分表面上的入射辐射度通量计算如下:
dΦi=dAΩiLi(p,ωi)cosθidωidΦi=dA∫ΩiLi(p,ωi)cosθidωi

对于出射则有:
dΦo=dAΩoLo(p,ωo)cosθodωodΦo=dA∫ΩoLo(p,ωo)cosθodωo

上式可以带入反射公式。然后两式相比得到反射率
ρ(p,Ωi,Ωo)=dΦo/dΦi=ΩoΩifr(p,ωi,ωo)Li(p,ωi)cosθicosθodωidωoΩiLi(p,ωi)cosθidωiρ(p,Ωi,Ωo)=dΦo/dΦi=∫Ωo∫Ωifr(p,ωi,ωo)Li(p,ωi)cosθicosθodωidωo∫ΩiLi(p,ωi)cosθidωi

该式子是反射率通用表达式,对立体角,BRDF,p点上方的半球入射辐射度分布以及反射维度都没有限制。
我们对上半球积分,满足结果小于1 ,从而满足能量守恒。


微表面模型

微表面只是一个高光项,显然还需要一个散射项,散射项将在后面提到。

在正式分析之前,要介绍两个有用的工具,在后面可能会用到:

  • BRDF Explorer
    一个有用的BRDF可视化工具,github.com/wdas/brdf。
    可以查看BRDF的形状,也可以使用采样的IBL对自定义模型着色查看BRDF效果,还可以查看点光源效果,最关键的是还有image slices,支持多个brdf叠加,对于分析brdf绝对是神器。另外,所有的brdf都采用glsl编写,本身也是开源软件!

    下面是一个自带的ashikhman shirley的brdf slice

  • Images slices

    这个东西很好使,横轴代表half-vector与法线的夹角θhθh,纵轴代表l和v夹角的一半θdθd

    要速记这个只要这么想就好了:
    首先,想象有一个球面,最亮的点在球的最顶端(这样的假设是为了保证half-vector始终铅直),则横轴(θhθh)代表eye与light相对位置不变(保持hv方向不变),在球面上移动着色点,使得hv与法线的夹角θhθh变化;纵轴(θdθd)代表球面上着色点不变,移动eye和light以变化θdθd的角度。
    我们前面保证了half-vector的铅直,那么l围绕half-vector的旋转就好想象了,就是绕着世界y轴旋转即可,这可以很容易地解释下图。(图下面的数字是l围绕half-vector的方位角)

    但是,必须严重注意,上面假想的一个球体并不是几何上的球体,只是为了分布法线而想象出来的一个形状,他的出射值是brdf而不是辐射度!所以lambertian brdf的slice是一张纯色,因为cos因子是渲染方程的一部分而不是brdf!
    具体看slice的内容,有四个区域,高光和菲涅尔峰值就不说了,主要看grazing retro-reflection。这个区域代表在切线角附近的逆反射。

  • The “MERL 100”
    这是一张表,上面记录了100种各向同性材质的BRDF Slices,都是实验测量出来的。
    并且可以免费获取,http://www.merl.com/brdf,一般会用于模拟一种新的brdf模型。


反射系数(高光因子)

多数已与物理反射因子的基础都是微表面理论。用于非光学光滑平面。这个理论假设表面是由很多微小的表面组合的,而每个为表面都是光学平滑的。注意:一个光学光滑的表面只会将光分到两个方向,反射方向和折射方向。
每个微表面都根据平面法线把光反射到一个单一的方向。
在计算的时候,肯定会给定一个光照方向l和一个视线方向v,则half-vector:h=normalize(v+l)h=normalize(v+l) 
显然对于微平面来说只有m=hm=h 的时候,才会有出射。这里,必须要注意,只有慢这个条件的表面才会出射,也就是那些项才会生效。
但是并不是这样就一定出射,有一些微表面可能会被其他的微表面阻挡。可能是从l方向阻挡了入射(这称为shadowing),也有可能是从v方向阻挡了出射(这称为masking),或者lv全部阻挡了。
对于shadowing,虽然阻挡但是有可能通过多个表面反射依然可见一部分,但是微表面理论认为那全部不可见。当然对于粗糙的金属表面,这可能会出现问题。
所以微表面模型有两大假设

  1. 微表面光学平滑
  2. 没有交叉多反射

综上,微表面BRDF形式如下(只是一个高光模型):

fμfacet(l,v)=F(l,h)G(l,v,h)D(h)4(nl)(nv)fμfacet(l,v)=F(l,h)G(l,v,h)D(h)4(n·l)(n·v)

其中F是菲涅尔反射项,G是几何项,也就是没有被shadowing和masking的比例,D则是微表面法线分布函数,用于给出m=hm=h的密度(所以是h的函数)。最后,分母是一个矫正因子,它是微表面模型的推导结果。

菲涅尔反射
光线在光滑介质之间传递时,再交界面会发生菲涅尔现象。光学部分就不说了,直观的解释一下,当垂直看水面的时候,看到的大部分是折射,当看向远处的水面时,则看到的更多是反射,这就是菲涅尔现象。

菲涅尔方程,主要用来描述光线在不同介质间传递时反射与折射量之间的相互关系。
方程中包含了两个分量,一个是反射分量,一个是投射分量,两者相加等于1。

很多没有说是微表面的模型也可以转化为微表面模型——转化为一个D法线分布项,一个F菲涅尔项,以及其他的综合为一个G几何(shadowing & masking)项。唯一的差别就是那个分母,修整这个的方法是在确定DF之后,强制乘以一个包含分母4(nl)(nv)4(n·l)(n·v)的G,然后除下来即可。


微表面公式的一种推导
来自Microfacet Models for Refraction through Rough Surface。
在原文中还考虑了BTDF,这里我们只说BRDF。
宏表面BSDF积分
要得到宏表面的BSDF可以对微表面的可见部分进行积分。因为两个都是按照投射面积来算的所以要加个矫正因子来转换,为了保证双向性就加了两个。

fS(i,o,n)=|imin|fms(i,o,m)|omon|G(i.o.m)D(m)dωmfS(i,o,n)=∫|i·mi·n|fsm(i,o,m)|o·mo·n|G(i.o.m)D(m)dωm

然后我们需要其中因子的表达式,有了表达式就能积分了。
微表面BRDF推导
设微表面的brdf形式如下:
fms=ρδωo(s,o)|om|fsm=ρδωo(s,o)|o·m|

上面分母是个delta函数,学过数字信号处理的应该都知道,这个函数用于过滤值,如果s=o他是一个有限制,否则他就等于0.积分形式为:
Ωg(o)δωo(s,o)dωo∫Ωg(o)δωo(s,o)dωo

他的值,如果s在积分域,就等于g(s)g(s),否则就是0,注意最后的积分变量要统一。
其中g()g()是任意函数。
上面的积分和宏表面的积分,积分自变量是不一样的,一个是法线,一个是出射方向,所以如果想把上面的delta函数带入到BSDF积分还必须换元。使用雅各比矩阵换元法(见高数书)把出射积分转换成法线积分,变换后变成:
fms=ρδωm(s,o)|om|||ωhvωo||fsm=ρδωm(s,o)|o·m|||∂ωhv∂ωo||

注意delta函数右下角的系数,已经从ωoωo转换到了ωmωm,现在可以直接带入到宏表面的BSDF积分了。
理想反射下对应的雅各比行列式为(具体推导参考原文):
||ωhvωo||=14|ohv|||∂ωhv∂ωo||=14|o·hv|

前面说了对于理想反射的微表面,hv=m,反射因子使用菲涅尔项,所以最终的brdf是:
fmr(i,o,m)=F(i,m)δωm(hv,m)4|ihv|2frm(i,o,m)=F(i,m)δωm(hv,m)4|i·hv|2

上面式子使用了下述事实:
(ohv)=(ihv)(o·hv)=(i·hv)

最终把所有的东西全部带入宏表面的BSDF方程,得到了微表面的公式:
fμfacet(l,v)=F(l,h)G(l,v,h)D(h)4(nl)(nv)fμfacet(l,v)=F(l,h)G(l,v,h)D(h)4(n·l)(n·v)

最后想要积分出最后结果,还要确定FGD,这个在后面正文介绍。


菲涅尔项F

菲涅尔反射因子用于计算光学平滑表面的反射系数。它的值取决于两个因素:

  • 入射角(l和n的夹角)
  • 材质的折射率

对于不同的可见波普,菲涅尔折射率可能不一样,所以菲涅尔反射也是一个光谱量。在我们这里就是RGB。因为我们只关注那些m=h时候的微表面,所以菲涅尔反射的入射角总是l和h的夹角。
菲涅尔原公式实在太长了,在这里就不打了,随便翻本物理书就有。
在这里并没有使用复杂的菲涅尔方程来计算,公式本身复杂,参数也不直观方便。
然而却可以通过观察现实世界中简单行为来概括一下参数。


观察上图,可以看出从0~45度之间,反射量基本没变,45~75之间变化比较显著,到了75以上,就狂飙到1。所以,我们选择F(0°)F(0°)作为材质镜面反射的特征值。
这个特征值也是(0~1之间的)RGB值,也可以选择反射光的颜色,因此我们把这个值作为表面的高光颜色,记做cspeccspec
Schlick[2]给出了一个足够简单且精确的近似:

FSchlick(cspec,l,n)=cspec+(1cspec)(1(l,n))5FSchlick(cspec,l,n)=cspec+(1−cspec)(1−(l,n))5

对于激活的微表面n必然使用h替代:
FSchlick(cspec,l,h)=cspec+(1cspec)(1(l,h))5FSchlick(cspec,l,h)=cspec+(1−cspec)(1−(l,h))5

对于cspeccspec的选择,可以参考下表,它给出了线性空间和gamma空间的对应值。如果你不了解gama,请参考后面的引用。


(When inspecting Table 1, several things stand out. One is that metals have significantly higher values of F(0 ◦ ) than non-metals. Iron is a very dark metal, and it reflects more than 50% of incoming light at 0 ◦ . Recall that metals have no sub-surface reflectance; a bright specular color and no diffuse color is the distinguishing visual characteristic of metals. On the other hand diamond, one of the brightest non-metals, reflects only 17% of incoming light at 0 ◦ ; most non-metals reflect significantly less than that. Very few materials have values in the “no mans land” between 20% and 40%; these are typically semiconductors and other exotic materials which are unlikely to appear in productionshading situations. The same is true for values lower than 2% (the F(0 ◦ ) value of water). In fact, ruling out metals, gemstones, and crystals, pretty much any material you are likely to see outside a laboratory will have a narrow range of F(0 ◦ ) values—between 2% and 5%.)
虚幻4使用了Schlick近似来作为基于物理着色公式的菲涅尔项,但是做了一点修改。他们使用了球形高斯近似来替代(1(l,h))5(1−(l,h))5[3][4]

FSchlick(cspec,l,h)=cspec+(1cspec)2(5.55473(vh)6.98316)(vh)FSchlick(cspec,l,h)=cspec+(1−cspec)2(−5.55473(v·h)−6.98316)(v·h)

法线分布项D

对于大多数表面来说,微表面的法线都不是均匀分布的。微表面模型中,微表面的法线对于表面法线呈现高斯分布。D不分布在0~1而是只要非负即可。同时,D也不是光谱值,而是一个标量值。
D用于通过评估h来帮助决定m=h的分数。正因如此,D的参数是h。
D一般标记为D(m)D(m),m是微表面法线,D就是m法线表面的总强度。
给定一个位于m的无穷小立体角dωmdωm和一个无穷小宏面积dAdAD(m)dωmdAD(m)dωmdA就是对应法线在dωmdωm中的微表面的面积。D就是一个密度函数,单位是:1/球面度。(乘以球面度得到一个强度,强度乘以面积,单位为面积。)
一个可信的D必须满足下列性质:

  • D非负
  • 所有微表面的面积大于等于宏表面面积
  • 所有微表面的朝一个方向的投影面积等于宏表面在该方向的投影面积(有的投影会相互重叠)
    (vn)=D(m)(vm)dωm(v·n)=∫D(m)(v·m)dωm
    如果v=n,这个值为1.

在外观上,D决定了材质尺寸,亮度以及高光形状。有很多个不同的法线分布函数,他们或多或少形状都和高斯分布差不多,但是添加了一些粗糙度或者其他的方差参数(各向异性材质或许有两个方差参数).当表面粗糙度下降时,微表面法线m将会更多的聚集在宏表面法线n的周围,这时D的值将会变的很大(特别是完美镜面在m=n的时候,这个值将会变成无穷大)。

Disney的人关注了金属的高光,他们举出铬作为测量例子,指出在平滑高度抛光的铬上,只有很小宽度的高光峰值,然后又圆宽于峰值的高光拖尾。这些特性是传统的Beckmann、Blinn Phong以及高斯分布都没有的,并且指出GGX有这种特性但是却没有铬一样的高光泛光,而且对于某些材质拖尾还不够长。

在[1]中,作者提到了三种D——Beckmann、Phong、GGX。
其中Beckmann基于微表面的高斯粗糙假设,多用于光学文献中;Phong则是一个多用于图形学文献中的纯经验模型,但是如果选择的参数宽度合适,他很像Beckamnn分布;GGX则是[1]中介绍的一种新的分布。在这里,我们将介绍GGX分布(DG),后面的引用介绍了Beckmann和Phong。

GGX[1]

GGX是一个D模型,等价于Trowbridge-Reitz模型.
他在[1]中提出,有一个宽度因子αgαg

D(m)=α2gχ+(m.n)πcos4θm(α2g+tan2θm)2D(m)=αg2χ+(m.n)πcos4θm(αg2+tan2θm)2

对应的G1G1是(至于什么是G1G1可以参考后面的引用):
G1(v,m)=χ+(v.mv.n)21+1+α2gtan2θvG1(v,m)=χ+(v.mv.n)21+1+αg2tan2θv

GGX相比Beckmann和Phong有更强的拖尾也因此趋于有更多的阴影(下图)。


对应的采样(参考引用内容)为:

θm=arctan(αgξ11ξ1)θm=arctan(αgξ11−ξ1)

ϕm=2πξ2ϕm=2πξ2

GGX
Trowbridge and Reitz 1975 [31] derived a new microfacet distribution based on average surface
irregularity of curved microsurfaces derived from an ellipsoid of revolution. They fit their model
to measured data for rough glass and compared their results with Gaussian, Beckmann, Sirohi,
and Berry distributions.

阴影遮蔽项G

这也被称为”几何项“。G表示一个微平面会被被l和v都可见的概率。微表面模型中,m被h取代。G的值在0~1之间,G也有很多不同的函数。G不会引入新的参数到BRDF,但有时候会使用D的参数。很多情形下,shadowing-masking项部分抵消了(nl)(nv)(n·l)(n·v)分母,所以可以使用max(nl,nv)max(n·l,n·v)来替代那一项。
G项对于能量守恒很重要,下图很好说明了这个问题:

红色部分代表被激活的微表面,绿色代表宏表面,左边是在视线方向上的投影。下左图代表所有微表面没有masking的结果,显然是不对的,破坏了能量守恒性质。而且当我们近乎垂直看表面的时候,会忽略掉masking的小股哟导致BRDF成百上千倍地反射接收到的能量。而右边则加入masking之后,就合理了。
一般来说,G不怎么会影响brdf的形状,除了非常粗糙的表面或者grazing角附近。
同样,G也有必须遵守的性质:

  • 0~1之间
  • 双向性
  • G(i,o,m)=0G(i,o,m)=0
    if(im)(in)0or(om)(on)0if(i·m)(i·n)≤0or(o·m)(o·n)≤0

最后,D*G给出了对应法线m的微表面可见面积。

在[1]中,作者提到——G决定于D以及微表面的细节,所以不大可能有精确方案。然后指出了Cook & Torrance的G,虽然保证了各种D的能量守恒,但是一阶导数不连续,并且很多特征都与真实表面不符,所以选择了Smith G到出自高斯表面,并被拓展到了适合任意D。但是据说某些情形下积分结果没有简单的闭合解。
Smith G由两个单向G组成:

G(i,o,m)=G1(i,m)G1(o,m)G(i,o,m)=G1(i,m)G1(o,m)

G1G1自D导出,具体可以参考[1]的附录A。
Smith最开始推导了两种G公式,一种需要知道微表面发现,一种只需要知道平均法线,后者更多用在文献里面,在微表面模型中由于知道微表面的法线,所以使用前者。
[1]作者最后给出了所有的D以及附带的G1G1还有对应的采样方程(通过两个均匀分布的随机变量([0,1)之间)生成微表面法线【可以参考概率随机数生成中的逆分布法】)。生成法线m的概率方程如下:
pm(m)=D(m)|m.n|pm(m)=D(m)|m.n|

χ+(a)χ+(a)函数如果a>0就是1,否则就是0。

Beckmann分布DG

αbαb是宽度参数。

D(m)=χ+(m.n)πα2bcos4θmetan2θmα2bD(m)=χ+(m.n)παb2cos4θme−tan2θmαb2

G1(v,m)=χ+(v.mv.n)21+erf(a)+1aπea2,with,a=(αbtanθv)1G1(v,m)=χ+(v.mv.n)21+erf(a)+1aπe−a2,with,a=(αbtanθv)−1

G1G1中第一个项强制v在宏表面和微表面的同侧。erf(x)=2πx0ex2dxerf(x)=2π∫0xe−x2dx是误差函数(error function),这个函数的计算是昂贵的,所以Schlick提出了一个近似,但是是给基于不同的G的。为了适应[1]中的G,作者提供了一个Smith G1的近似,相对误差在0.35%以下。
G1(v,m)χ+(v.mv.n)3.535a+2.181a21+2.276a+2.577a2where,a<1.6G1(v,m)≈χ+(v.mv.n)3.535a+2.181a21+2.276a+2.577a2where,a<1.6

G1(v,m)χ+(v.mv.n)where,otherwiseG1(v,m)≈χ+(v.mv.n)where,otherwise

(27)
对于采样方程D(m)|m.n|D(m)|m.n|的m采样是:
θm=arctanα2blog(1ξ1)θm=arctan−αb2log(1−ξ1)

Φm=2πξ2Φm=2πξ2

Phong分布DG

αpαp是高光因子。

D(m)=χ+(m,n)αp+22π(cosθm)αpD(m)=χ+(m,n)αp+22π(cosθm)αp

如果我们设置αp=2α2b2αp=2αb−2−2Phong和Beckmann会非常相似(下图),“这解释了为什么一个经验模型也会如此长寿”作者如是说。但是Phong的Smith G1积分没有闭合解。[1]的作者根据两者的相似性推荐G1方程(27)使用a=0.5αp+1/tanθva=0.5αp+1/tanθv来作为Phong的G1.

最后此文给出了采样,但是本文暂时不涉及这些内容,以后会转么写文介绍的。

模型的选择

D和G函数都是可以独立选择和组合的,一但选定了这些函数,再加上参数就可以形成一个完整的BRDF了。同时微表面模型具有紧凑的参数,一般只是由一个cspeccspec一个粗糙度标量(各向异性材质有两个粗糙度)组成。各种模型将会在以后慢慢补上。


表面散射(漫反射因子)

有几种的漫反射模型可供选择,前面已经介绍了Lambertian模型,这是用的最多的漫反射brdf模型,即:

fr,d=kdcd/πfr,d=kdcd/π

对于表面散射,Lambertian模型假设光散射的足够多,以至于完全失去了方向性,所以漫反射直接变成了一个常数。然而从The “MERL 100”中可以发现很少有材质表现出这样的样子的。

Disney的文中提到有的漫反射模型包含一个菲涅尔因子(1F(θl))(1F(θd))(1−F(θl))(1−F(θd)),这里根据菲涅尔折射定律并且要满足brdf双向性质,所以要算两次折射,一次进表面一次出表面。直观的理解为交换出射和入射光线后得到相同的值。具体物理的东西参考菲涅尔折射定律和 Helmholtz reciprocity.

然后,Disney那群人丧心病狂地指出了一个规律,一个brdf如果他的高光峰值越高(越光滑),那么边缘一般都趋于一个阴影区域;如果一个brdf越粗糙,那么他的边缘将会出现一个亮区。
前者其实很好解释,如果在光的同侧观察,在边缘附近时,光滑表面的菲涅尔反射将会反射很多能量到另外一侧,根据能量守恒所以看到的颜色就会很暗。
但是漫反射模型却一般都不会考虑粗糙表面的菲涅尔反射,而是直接忽略菲涅尔反射,就算要加也是假设光滑表面,所以这时按照光滑表面的菲涅尔反射给漫反射表面添加菲涅尔因子反而会使他边缘更暗。

Oren Nayar漫反射

Generalization of Lambert's reflectance Model

所以考虑Oren Nayar模型,Lambertian表面太过完美,以至于某些东西无法正确渲染。比如泥土,月球,某些布料,这些材质在half-vector偏离法线比较大的时候会表现出逆反射。考虑一下晚上车灯照着泥土的情形,车灯和视点在同侧,而泥土的法向指向天上,这时候hv的角度和法向的角度偏大,而且l和v的张角也不大,这就映射到了brdf的逆反射区。所以这时候看到的泥土会非常的亮。再如月亮的边缘很亮包括上面Disney的人提到的现象都是一个道理。
Oren Nayar模型认为一个像素包含了大量不同方向的微平面,而单个微平面就是Lambertian,但是合起来就不是了。这些微表面将会更多地反射背向光源的光线,程度将由表面的粗糙程度来决定。使用一个高斯分布就可以建模,标准差代表粗糙度,越大,越粗糙。

Oren Nayar有如下几个假设:

  • 物体的表面是由一些微小得对称的V形结构组成;微表面之间有相互反射
  • 每个V表面的宽度要远远小于其长度
  • 每个微表面的面积要远远大于光线的波长(这点很容易满足)
  • 每个Pixel要能够覆盖足够多的微表面
  • 每个微表面具有Lambert漫射属性

公式如下:

Io=D(NL)(A+Bsin(α)tan(β)max(0,cosC))IiIo=D(N·L)(A+Bsin(α)tan(β)max(0,cosC))Ii

A=10.5ρ2ρ2+0.33A=1−0.5ρ2ρ2+0.33

B=0.45ρ2ρ2+0.09B=0.45ρ2ρ2+0.09

α=max(acos(NL),acos(NV))α=max(acos(N·L),acos(N·V))

β=min(acos(NL,acos(NV)))β=min(acos(N·L,acos(N·V)))

CC是L和V之间的方位差角(水平平面内那个角)
ρρ是标准差。

Disney的漫反射公式

然而上面说的都是废话,Disney的人嫌Oren Nayar是从粗糙漫反射模型推导出来的,忽略了菲涅尔和次表面效果,表现上逆反射峰值不如测量数据的strong,而且漫反射区域太过平坦;而Hanrahan-Krueger则通过次表面散射导出假定平面光滑。真实的材质表现在两者之间。所以他们使用了自己发明的经验BRDF。
这个模型支持逆反射,忽略了菲涅尔因子的折射率假设没有入射光损失。这样就可以直接指定入射光的颜色了。
对于菲涅尔项,他们用了Schlick,整个公式如下:

fd=baseColorπ(1+(FD901)(1cosθl)5)(1+(FD901)(1cosθv)5)fd=baseColorπ(1+(FD90−1)(1−cosθl)5)(1+(FD90−1)(1−cosθv)5)

where
FD90=0.5+2roughnesscos2θdFD90=0.5+2∗roughness∗cos2θd

这里FD90FD90是l与n成90度入射时候的反射特征值,θdθd是l和v夹角的一半,θlθlθvθv就是他们与法线的夹角了,roughness是粗糙度(0~1),baseColor是表面颜色。另外,公式折腾两次菲涅尔的原因在前面引用也已经说过了,入射表面一次,出射表面一次。
仔细看一下这个公式就会发现的确有意思,FD90FD90这个项不仅直接控制了逆反射还同时控制了高光和菲涅尔。如果其他条件不变,粗糙度高,这个值就会变高,最后导致菲涅尔项变大;反之也然。其中最后一个cos项控制了slice的纵轴,因为逆反射本来就和纵轴有关,而横轴则被菲涅尔项控制。

UE4的漫反射

虚幻4的notes表示他们尝试了Disney的模型,如下图:


在这个粗糙球体上,右边边缘除了亮一点以外确实看不出太大差别(在球的同一位置取色,圆环上半部分是Burley),所以,在UE4追求效率,折中了视觉效果,依然选择了Lambertian。


故事

这部分讲述其他厂商和PBS的故事。

tri-ACE(《北欧女神》《永恒终结》)

tri-ACE毕竟大厂,年年都有讲座。
http://research.tri-ace.com/。
下面挑几篇我仔细琢磨过的说说,有的资料是日文写的,确实看不懂。

2010年

Physically Based Shading Models in Film and Game Production:Practical Implementation at tri-Ace

首先是他们用做对比的传统模型:

Lo=Rd(NL)+RsF(f0)(NL)(NH)nGLo=Rd(N·L)+RsF(f0)(N·L)(N·H)nG

其中RdRd漫反射颜色,RsRs高光颜色,N/L/HN/L/H分别是法线,光,hv。F(f0)F(f0)是菲涅尔函数,nn是高光幂(反映粗糙度)。G是几何attenuation因子(稀疏)。其中一些因子一般都存在纹理中。
菲涅尔项依然是Schlick菲涅尔近似公式,具体形式写烂了不写了,前面有。
在这里:
f0=(1n1+n)2f0=(1−n1+n)2

这里的n是折射率。
对于绝缘体,在1.3~1.7之间,取1.5,结果在0.04,菲涅尔项为0.04,在垂直法线方向是1.0.相差25倍。这对于艺术家来说不直观,他们一般会把f0f0设置为0.3-0.5,这会导致法向高光太强,然后艺术家又回去调节,结果又导致边缘太暗。然后,他们以此为引子,引申出基于物理着色的好处。
然后他们提出自己搞了个基于Blinn-Phong的模型:
Lo=Rdπ(1Fdiff(f0))+n+24π(22n2)Fspec(f0)(NH)nmax(NL,NE)Lo=Rdπ(1−Fdiff(f0))+n+24π(2−2−n2)Fspec(f0)(N·H)nmax(N·L,N·E)

两个菲涅尔项依然是Schlick,只是最后的cos换了一下,漫反射是n·l,高光是v·hv。(其实前面的n·l其实已经出事了,它已经违反了双向定律。因为交换l、v之后,得不到相同的值。)
考察一下这个公式的性质2、3,可以看到能量守恒是基本满足的,因为高光项前面的那个式子是一个归一化因子,也就是用来能量守恒的。文中说他们高光项使用的Neumann-Neumann BRDF[6],守恒因子计算的方法就是前面说的,先把归一化因子隐含在brdf里面,算出brdf后,把它提出来:
frspec=(NH)nmax(NE,NL)frspec=(N·H)nmax(N·E,N·L)

然后和着cos因子积分列能量守恒的积分不等式:
cΩ(NH)n(NL)max(NE,NL)dω1c·∫Ω(NH)n(NL)max(NE,NL)dω≤1

c就是守恒因子。然后假设最大反射出现在L=N的时候,不等式就简化了,然后根据不等式性质把分母去掉,得到
cΩ(NH)ndω1c·∫Ω(NH)ndω≤1

最后对上半球面积分,得到了结果:
c=n+24π(22n2)c=n+24π(2−2−n2)

然后对这个结果的导数线性逼近,得到一个简单的函数:
0.0397436n+0.08568320.0397436n+0.0856832
文中指出这个函数和原函数在0~1000内的差距都能忽略不计。
最后一切都是浮云,他们觉得漫反射项的Schlick太昂贵了,而且反正都违背了双向性了,索性直接在简化一下算了,所以最终他们用到游戏中的模型变成了下面这样:
Lo=Rdπ(1f0)+(0.0397436n+0.0856832)Fspec(f0)(NH)nmax(NL,NE)Lo=Rdπ(1−f0)+(0.0397436n+0.0856832)Fspec(f0)(N·H)nmax(N·L,N·E)

再后面他们谈到了这个BRDF由于效率原因,这个模型只是用在各向同性材质上,对于各向异性使用了另外的brdf,但是没有具体,其中提到了这篇论文,我还没看:
Fresnel Term Approximation for Metals.
最后他们谈到了环境光,指出传统的环境光会造成无光线到达场景的单调,导致渲染质量大幅度下降,并提出了半球光照、球谐光照等方案,并谈到了与计算环境光到纹理。但是这些内容不在本文讨论内,就不说了,以后会专门写文研究这个的。
最后的最后是他们模型的局限性:

  • 没有漫反射项的双向性也没有粗糙系数控制所以也没有逆反射。
  • 不支持多层次brdf叠加。

2012

Practical Physically Based Shading in Film and Game Production:Beyond a Simple Physically Based Blinn-Phong Model in Real-Time

因为无法直视自己过去的缺陷,所以2012年的notes谈到了他们对自己过去那个模型的改进。
这次主要是针对上次的不足添加了层次brdf和逆反射漫反射brdf。
Slide
Notes
2014

Designing Reflectance Models for New Consoles

2015

2015年多是光效,相机相关的东西,和本篇无关。ppt都在这里

Gama矫正
因为早期晶体管出射电子电压与位置关系不成正比,所以在出射的时候会做一次gama矫正方法就是直接做一个多少次方使得其线性。所以在电子设备中,可能做过这样的矫正,所有的rgb值可能做了一个幂运算,如果把这些图像拿到没有做那个运算的机器上,就必须先把rgb还原再做计算。
在图形学中所有的光照都是建立在线性空间中的,所以如果要把一张图用于着色,就必须把颜色转换到线性空间。一般图像在PS等工具中可能是位于sRGB空间中的,拿到线性空间中就先要做一个反向的幂运算先解码原颜色。

至于幂是多少,这是可以调节的。一般的游戏开始调节gama值就是调节的这个。
另外我在triace的notes上看见,说人眼本身也并不是线性感知的(所以可以感知到HDR),所以从这一点看,Gama矫正也是必须的。
伽马曲线所揭示的一个重要事实就是:当一个像素亮度被转换为8位量化值时,用于较暗部分的数据位要多于用于较亮部分的数据位。这是件好事,因为人眼就是这样工作的(译者注:人眼对较黑时的亮度变动比较敏感)。人眼对于亮度的感知曲线大致是像图8这样。

这相当接近于伽马函数的逆函数。这意味这两个函数会抵消为一个近乎线性的(从像素值到人眼感知度的)响应函数,多么方便。
总之一定要记住一件事,在我们现在的模型中,所有的光照计算都发生在线性空间。


总结

看了那么多例子,现在应该总结一下了。基于物理着色无非是想方设法搞点高效的brdf模型来用,满足三大性质是必须的,当然在某些情形下出于效率等因素的考虑,也可能破坏其中的几个性质。
在Disney的例子中,他们考察评估了真实的测量数据,对比来对比去都是为了满足第一定律——可信。在实时渲染中”可信“无疑是引入基于物理着色的首要目标,然后是效率,在某些情形下,可能会丢弃能量守恒和双向性来满足效率,例如虚幻中Lambertian,triace的漫反射因子等等。所以,其实实际上,虽然有很多现成的基于物理方案,也有很多brdf模型,但是我们引入基于物理着色并没有一种通用方案,都要根据自己的项目需求来考察,从而达到最平衡的要求。
最后不难发现这里我们所列出的所有论文都是几十年前的论文,而这些几十年前的论文也是在最近来被拿出来用在了实时渲染上。所以对于当前的实时渲染领域,离线渲染无疑是巨大的宝库。在未来,除非有完全颠覆的新方法出现,否则一定会有更多的离线方法不断地被应用子在实时渲染中,所以没有离线渲染的基础,在实时上不可能走得远。也是因为如此,笔者放弃了那些花里胡哨的先进RealTime Trick老老实实地从离线慢慢走起。


Bibliography

  • 【1】Microfacet Models for Refraction through Rough Surfaces
  • 【2】Schlick, Christophe, “An Inexpensive BDRF Model for Physically based Rendering,” Computer Graphics Forum, vol. 13, no. 3, Sept. 1994, pp. 149–162. http://dept-info.labri.u-bordeaux.fr/~schlick/ DOC/eur2.html Cited on p. 14
  • 【3】 Lagarde, S´ ebastien, “Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel”,June 2012. http://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/
  • 【4】Real Shading in Unreal Engine 4
  • 【5】Physically Based Shading at Disney
  • 【6】Compact Metallic Reflectance Models
  • 【7】PBRT
  • 【8】http://blog.csdn.net/bugrunner/article/details/7848514
  • 【9】https://interplayoflight.wordpress.com/2013/12/30/readings-on-physically-based-rendering/
0 0
原创粉丝点击