Arbitrarily Layered Micro-Facet Surfaces
Arbitrarily Layered Micro-Facet Surfaces(任意分层的微平面表面)
出处:Andrea Weidlich, Alexander Wilkie, In GRAPHITE 2007, pages 171-178. December 2007.
https://www.cg.tuwien.ac.at/research/publications/2007/weidlich_2007_almfs/
【声明】全文系个人理解,不保证完全符合原文,有可能仅提及到个人关注部分,仅供参考,如需要更多的了解,建议尽量去看原文。
注:引用图片出自原文。
1 概述
这篇文章中,作者提出了一种包含多层微平面表面的BDRF模型,这里的多层微平面表面可以简单理解为多层不同的材质(如一层透明的薄膜油层覆盖在金属材质层上)。在实现过程中,对层表面之间的散射做了相应的近似和简化,并考虑了吸收和全反射的情况,除此之外,作者还讨论了采样需要的对应概率分布函数,以及如何灵活地运用。
2 简化
为了在不考虑次表面散射(Sub-Surface Scattering)的情况下使用多层材质,这里考虑了以下四个简化:
- 在水平范围内,任何微平面都被认为要比层厚。(Any micro-facets are considered to be much larger in horizontal extent, than the layers are thick.)(个人理解是假设每一层都很薄)
- 假设通过对较低BRDF层采样产生的所有光线都在原入射点出离开。(All rays that are generated by sampling of lower BRDF layers,are assumed to exit at the original point of incidence.)(也就是对于某一层表面而言,入射点和出射点在同一点)
- 假设为计算整体BRDF所生成的折射方向在下一层界面相交于一点。(Refraction rays that are generated for the computation of the entire BRDF, are assumed to meet at a single point on the next layer interface.)(这一点很有意思,这里的折射方向包括所有光线的折射和视线的折射,我们知道在计算BRDF时,是将光线方向和视线方向是相交于同一点的,这里又假设折射方向在下一层仍然相交于一点,其实是不太符合物理实际的,只能说假设薄膜极薄时,这是一种近似)
- 光线只在层界面处发生散射,在层内不发生散射。(ll light scattering is due to reflection at the boundaries be-tween layers; no scattering occurs within individual layers.)(即用于任何(半)透明层的材质仅衰减通过它的光线,而不会造成任何二次散射)
这四个简化可以让我们忽略全部的次表面散射的计算。
而这些简化带来的一个缺点就是:该模型不支持解决任意厚度的表面层的光照计算,而仅局限于具有足够厚的层来产生吸收影响。每一层必须足够的薄才能保证结果的正确性。
3 分层BRDF模型思路
3.1 模型概述
作者通过解决以下两个问题来介绍分层BRDF模型:
1)必须能够根据BRDF来构造样本(cast samples);
2)必须能够为任意输入和输出方向计算整体BRDF。
通过以下递归过程来解决第一个问题:
1)任何射到层栈(多层材质)中一个界面上的光线都部分被反射,部分被折射。被反射部分的能量可以通过菲涅尔(Fresnel)反射系数来计算(除了最后一层可选,其他层都假设遵守菲涅尔反射)。为反射部分生成适当的采样方向。
2)光线被折射的部分进入材质,其中一部分可能会被吸收,然后其余部分与层栈中下一个界面发生作用。该过程递归地进行1)和2)中的内容。
3)所有从更低层反射回来的光在向上过程中会再次被吸收,并且可能发生全反射。因此在递归返回期间就需要相应地处理来自较低层的方向样本。
第二个问题也需要一个递归的过程:
1)最上层的BRDF
f
r
1
f_{r_1}
fr1是根据两个给定的任意入射方向
ω
i
\omega_i
ωi和
ω
o
\omega_o
ωo计算的,可以得到反射部分。除此之外,对于下一层,产生两个折射方向。
2)任何折射到下一层
T
12
T_{12}
T12的能量,都在这两个折射方向上,并会被介质吸收一部分能量
a
a
a。
3)假定这两个折射方向在下一层
f
r
2
f_{r_2}
fr2仍然只相交于一点,从步骤1开始重复该过程,直到遇到不发生折射的不透明层。
4)在从递归返回时,各个BRDF会被更上一层的菲涅尔透射系数衰减
T
21
T_{21}
T21,并累加到总BRDF上。
可以用公式概括为:
f
r
=
f
r
1
(
θ
i
,
θ
r
)
+
T
12
⋅
f
r
2
(
θ
i
′
,
θ
r
′
)
⋅
a
⋅
t
f_r = f_{r_1}(\theta_i, \theta_r) + T_{12} · f_{r_2}(\theta_{i'}, \theta_{r'})·a·t
fr=fr1(θi,θr)+T12⋅fr2(θi′,θr′)⋅a⋅t
其中
a
=
e
−
α
⋅
d
⋅
(
1
θ
i
′
+
1
θ
r
′
)
a = e^{-\alpha·d·(\frac{1}{\theta_{i'}} + \frac{1}{\theta_{r'}})}
a=e−α⋅d⋅(θi′1+θr′1)
其中常数
α
\alpha
α是材料对相关波长的吸收系数,d指介质厚度,以及
t
=
(
1
−
G
)
+
T
21
⋅
G
t = (1-G)+T_{21}·G
t=(1−G)+T21⋅G
注意,菲涅尔反射已经包含在
f
r
1
(
θ
i
,
θ
r
)
f_{r_1}(\theta_i, \theta_r)
fr1(θi,θr)中。
(Tips:这部分个人也是不太明白,推测这里的t应该是所谓的补偿函数,G是指几何遮挡函数么?作者文中并没有详细说明)
3.2 全反射
考虑全反射的情况,与整体BRDF相同,为分层BRDF添加一个TIR近似会带来两个不同的问题:
1)在BRDF采样过程中,当光线从更低层向上投射时,需要考虑全反射情况;
2)在为任意输入和输出方向计算整体BRDF,需要考虑全反射情况。
对于两个问题,作者的解决思路分别为:
1)在更低层生成的采样方向如果收到TIR的影响,将会被剔除。这会导致能量损失,因此需要添加一个补偿项。(这个补偿项应该怎么补偿?)
2)对于一个给定的入射方向,很容易确定是由在较低介质中的哪条反射方向会导致这条出射方向。然后通过菲涅尔透射系数衰减能量,并再次添加补偿项。
4 作者结果
5 更多
这部分不是原文的内容,是个人在网上找的一些相关资料,仅供参考。
Rendering Layered Materials-Ivo’s Graphics Blog :里面有些较为详细的说明。