〜M
#1 楼
这个问题与这个问题有些相关。正如艾伦(Alan)所说的那样,遵循穿过每一层的实际光路可以得到更精确的物理结果。我的答案将基于我已阅读并部分实现的Andrea Weidlich和Alexander Wilkie(“任意分层的微型面”)的论文。在本文中,作者假设两层之间的距离小于微分面积元素的半径。此假设简化了实现,因为我们不必为每个图层分别计算交点,实际上我们假设图层上的所有交点都是同一点。
根据本文,有两个问题必须解决以产生多层材料。第一个是正确采样层,第二个是找到通过沿采样路径找到的多个BSDF的组合生成的结果BSDF。
更新:实际上,我采用了另一种方法来实现对此分层模型的评估。虽然我一直认为将相交点沿图层视为同一点,但是我对采样和最终的BRDF进行了不同的计算:对于采样,我使用了普通的光线追踪,但是通过了图层(使用俄语轮盘(在这种情况下,可以在反射/折射之间进行选择);为了进行最终的BRDF评估,我只将遍历的每个BRDF乘以光线路径(根据入射光线的余弦对入射辐射进行加权)。
采样
在此第一阶段,我们将确定穿过层的实际光路。当光线从密度较小的介质中移动时,例如空气进入较稠密的介质,例如玻璃,其能量的一部分被反射,其余部分被透射。您可以找到通过菲涅耳反射率方程式反射的能量。因此,例如,如果给定电介质的菲涅耳反射率为0.3,则我们知道30%的能量被反射,而70%的能量将被透射:
当光线从密度较高的介质移动到密度较小的介质时,菲涅耳反射率所描述的原理相同。但是,在这种特定情况下,如果入射光线的角度大于临界角,也可能会发生全内反射(也称为TIR)。在TIR的情况下,100%的能量会反射回材料中:
当光照射到导体或扩散表面时,它将始终被反射(与BRDF的类型有关的反射方向)。在多层材料中,最终的光路将是所有这些可能性的总和。因此,在使用三层材料的情况下,假设第一层和第二层是电介质,第三层是扩散的,例如,我们可能会遇到以下光路(实际上是一棵树):
我们可以使用递归并根据相应入射点处的实际反射率/透射率加权每个光路来模拟这种类型的交互。在这种情况下,与使用递归有关的一个问题是射线的数量随递归的深度而增加,从而将计算工作集中在单独可能几乎对最终结果无贡献的射线上。另一方面,这些单独光线在深递归级别上的合计结果可能很重要,因此不应丢弃。在这种情况下,我们可以使用俄罗斯轮盘赌(RR)来避免分支,并在不损失能量的情况下实现概率性的最终光路,但代价是差异较大(噪声较大)。在这种情况下,菲涅耳反射率或TIR的结果将用于随机选择要遵循的路径。例如:
可以看出,TIR或菲涅耳反射率可能会使某些射线在层之间无限期地反射。据我所知,Mitsuba将塑料实现为两层材料,并且针对这种特殊情况使用封闭形式的解决方案,这种解决方案说明了层之间无穷无尽的光弹反弹次数。但是,Mitsuba还允许创建具有任意层数的多层材料,在这种情况下,由于在一般情况下似乎不存在封闭形式的解决方案,因此会产生最大内部反弹次数。副作用是,在渲染过程中可能会损失一些能量,使材质看起来比最终的颜色更暗。
在我当前的多层材料实现中,我允许任意数量的内部反射,但以更长的渲染时间为代价(嗯……实际上,我只实现了两层。一层是电介质,一层是扩散:)。
另一个选择是混合分支和RR。例如,初始光线(较低的深层次)可能会对最终图像产生实质性贡献。因此,一个人可能选择仅在第一个或两个交集处分支,之后仅使用RR。例如,这是Smallpt所采用的方法。
关于多层材料的一个有趣的观点是,可以根据每一层的相应BRDF / BTDF对各个反射/透射光线进行重要性采样。
评估最终的BSDF
考虑使用RR计算的以下光路:
我们可以评估多层BSDF反射的总辐射量$ L_r $,将每一层视为一个单独的对象,并应用在普通路径跟踪中使用的相同方法(即,离开一层的辐射量将是下一层的入射辐射量)。因此,最终的估算器可以由每个单独的蒙特卡洛估算器的乘积来表示:
$$ L_r = \ left(\ frac {fr_1 \ cos \ theta_1} {pdf_1} \ left(\ frac { fr_2 \ cos \ theta_2} {pdf_2} \ left(\ frac {fr_3 \ cos \ theta_3} {pdf_3} \ left(\ frac {fr_2 \ cos \ theta_4} {pdf_2} \ left(\ frac {L_i fr_1 \ cos \ theta_5} {pdf_1} \ right)\ right)\ right)\ right)\ right)$$
由于估计项的所有项都相乘,因此我们可以通过计算最终的BSDF和$ pdf $并排除$ L_i $项:
$$ fr = fr_1 \ cdot fr_2 \ cdot fr_3 \ cdot fr_2 \ cdot fr_1 $$
$$ pdf = pdf_1 \ cdot pdf_2 \ cdot pdf_3 \ cdot pdf_2 \ cdot pdf_1 $$
$$ \ cos \ theta = \ cos \ theta_1 \ cdot \ cos \ theta_2 \ cdot \ cos \ theta_3 \ cdot \ cos \ theta_2 \ cdot \ cos \ theta_1 $$
$$ L_r = \ left(\ frac {fr \ cos \ theta} {pdf} \ right)L_i $$
Andrea Weidlich和Alexander Wilkie的论文也考虑了吸收,即,根据每个透射层的吸收系数及其厚度,每条光线可能会衰减。我尚未在吸收器中包含吸收率,但是吸收率仅由一个标量值表示,它将根据比尔定律进行评估。
替代方法
Mitsuba渲染器基于“以傅立叶为基础的反射函数列表”对多层材料使用替代表示。我尚未对此进行深入研究,但可能会引起关注:Wenzel Jacob等人的“用于渲染分层材料的综合框架”。本文还有一个扩展版本。
#2 楼
从物理角度考虑它,似乎它可以像漫反射/镜面反射计算的一般版本一样工作。您将从最顶层开始并使用菲涅耳等来计算百分比反射与透射的光。然后,您可以使用随机数来确定要对样本执行哪些操作。
在反射的情况下,您将对最顶层的镜面波瓣进行反射,从表面反射并移动上。
在传输的情况下,您将移至第二层。
在这一层,您将再次计算反映与传输的机会百分比
在反射的情况下,您将使用第二层的镜面波瓣,进行反射并继续前进。
在透射的情况下,您需要d移至内层。对于最内层,您将再次弄清楚是否需要反射或透射。
对于反射,请使用此内层的镜面波瓣。
要进行透射,您需要进行漫射计算,或者您的最内层表面想要对透射光进行任何其他操作(子表面散射,折射等)。
我不确定每一层是否应该自己做折射以及技术通常,您应该在各层之间稍微移动射线以获得更逼真的效果。
但是,基本上来说,如果您的球体上有3层,它应该表现得好像您有3个不同的球体相互嵌套,每个球体都有一个单层处理透射与反射。
与具有三个单独的对象相比,具有分层的材料只是一种更紧凑的方式来表示这就是您想要的。
评论
$ \ begingroup $
我想问(希望您还记得本文)您是否确定要为每一层添加余弦项?据我了解,我们仅在顶层计算渲染方程。我们向下走以确定最终的出站方向并确定BRDF。我想念什么吗?
$ \ endgroup $
–穆斯塔法·伊斯克(MustafaIşık)
18-09-23在11:31
$ \ begingroup $
@MustafaIşık是的,在本文中,他们没有将余弦项添加到最终的BRDF中。实际上,我采用的方法与本文中提出的方法有所不同(我将在回答中包括该方法)。在本文中,他们提出了从分层BRDF中定义唯一BRDF的定义。我发现推导过程有些混乱:1)我不明白为什么它们要加上单个BRDF(我认为应该将它们相乘);
$ \ endgroup $
– Capagot
18/09/25在15:26
$ \ begingroup $
@MustafaIşık2)正如您所指出的,余弦项没有乘积(我认为您必须这样做,因为我们仅考虑入射在微分区域上的能量)。 3)他们不发展表达式$ t =(1-G)+T21⋅G$; 4)我不知道他们是否在BRDF中稀释了余弦项; 5)另外,TIR可能会导致能量损失。由于这些原因,我决定使用Russian-Roulette跟踪每条射线以决定折射或反射,但要花费比最终获得的更长的渲染时间。
$ \ endgroup $
– Capagot
18/09/25在15:28
$ \ begingroup $
本文看起来很简单,但并不是因为并非每个术语或策略都足够清楚地解释了确切的实现方法。不过,它很有影响力。您的论文更像是论文所避免的模拟,但是更加准确。
$ \ endgroup $
–穆斯塔法·伊斯克(MustafaIşık)
18/09/25在18:52