【Graphics】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/

【声明】全文系个人理解,不保证完全符合原文,有可能仅提及到个人关注部分,仅供参考,如需要更多的了解,建议尽量去看原文。
【Graphics】Arbitrarily Layered Micro-Facet Surfaces(任意分层的微平面表面)
注:引用图片出自原文。

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)所有从更低层反射回来的光在向上过程中会再次被吸收,并且可能发生全反射。因此在递归返回期间就需要相应地处理来自较低层的方向样本。
【Graphics】Arbitrarily Layered Micro-Facet Surfaces(任意分层的微平面表面)
第二个问题也需要一个递归的过程:
1)最上层的BRDF fr1f_{r_1}是根据两个给定的任意入射方向ωi\omega_iωo\omega_o计算的,可以得到反射部分。除此之外,对于下一层,产生两个折射方向。
2)任何折射到下一层T12T_{12}的能量,都在这两个折射方向上,并会被介质吸收一部分能量aa
3)假定这两个折射方向在下一层fr2f_{r_2}仍然只相交于一点,从步骤1开始重复该过程,直到遇到不发生折射的不透明层。
4)在从递归返回时,各个BRDF会被更上一层的菲涅尔透射系数衰减T21T_{21},并累加到总BRDF上。
【Graphics】Arbitrarily Layered Micro-Facet Surfaces(任意分层的微平面表面)
可以用公式概括为:
fr=fr1(θi,θr)+T12fr2(θi,θr)atf_r = f_{r_1}(\theta_i, \theta_r) + T_{12} · f_{r_2}(\theta_{i'}, \theta_{r'})·a·t
其中
a=eαd(1θi+1θr)a = e^{-\alpha·d·(\frac{1}{\theta_{i'}} + \frac{1}{\theta_{r'}})}
其中常数α\alpha是材料对相关波长的吸收系数,d指介质厚度,以及
t=(1G)+T21Gt = (1-G)+T_{21}·G
注意,菲涅尔反射已经包含在fr1(θi,θr)f_{r_1}(\theta_i, \theta_r)中。
(Tips:这部分个人也是不太明白,推测这里的t应该是所谓的补偿函数,G是指几何遮挡函数么?作者文中并没有详细说明)

3.2 全反射

考虑全反射的情况,与整体BRDF相同,为分层BRDF添加一个TIR近似会带来两个不同的问题:
1)在BRDF采样过程中,当光线从更低层向上投射时,需要考虑全反射情况;
2)在为任意输入和输出方向计算整体BRDF,需要考虑全反射情况。

对于两个问题,作者的解决思路分别为:
1)在更低层生成的采样方向如果收到TIR的影响,将会被剔除。这会导致能量损失,因此需要添加一个补偿项。(这个补偿项应该怎么补偿?)
2)对于一个给定的入射方向,很容易确定是由在较低介质中的哪条反射方向会导致这条出射方向。然后通过菲涅尔透射系数衰减能量,并再次添加补偿项。

4 作者结果

【Graphics】Arbitrarily Layered Micro-Facet Surfaces(任意分层的微平面表面)

5 更多

这部分不是原文的内容,是个人在网上找的一些相关资料,仅供参考。
Rendering Layered Materials-Ivo’s Graphics Blog :里面有些较为详细的说明。