-很抱歉,冗长的帖子,但是我更喜欢这样做,因为“细节中有魔鬼”。 :)

我正在从头开始编写路径跟踪器,它对于完美扩散的(朗伯型)表面非常有效(即,熔炉测试(至少在视觉上表明)它是节能的,并且已渲染图像与使用Mitsuba渲染器生成的图像参数相同)。现在,我正在实现对原始Cook-Torrance微面模型的镜面反射项的支持,以渲染一些金属表面。但是,似乎该BRDF反射的能量多于所接收的能量。参见以下示例图像:



上图:Mitsuba参考(假定是正确的)图:直接光采样,重要半球采样,最大路径长度的路径跟踪= 5,32分层spp,盒式滤波器,表面粗糙度= 0.2,RGB。 ,最大路径长度= 5,4096个分层spp,盒式滤波器,表面粗糙度= 0.2,RGB。尽管在渲染设置方面存在一些差异,但是很明显,渲染的图像将不会收敛到之前显示的参考。

我倾向于认为这不是实现问题,而是有关问题在渲染方程框架内正确使用Cook-Torrance模型。下面,我解释了我如何评估镜面反射BRDF,我想知道我是否做得正确,否则,为什么。

在深入了解细节之前,请注意渲染器非常简单:1)仅实现暴力天真的路径跟踪算法-没有直接的光采样,没有双向路径跟踪,没有MLT; 2)在交点以上的半球上所有采样都是均匀的-根本没有重要性采样,对于扩散表面也没有采样; 3)射线路径的最大固定长度为5-没有俄罗斯轮盘; 4)辐射/反射率是通过RGB元组告知的-没有光谱渲染。

库克·托伦斯微面模型

现在我将尝试构建实现该模型所遵循的路径高光BRDF评估表达式。一切都始于渲染方程式
$$
L_o(\ textbf {p},\ mathbf {w_o})= L_e + \ int _ {\ Omega} L_i(\ textbf {p},\ mathbf { w_i})fr(\ mathbf {w_o},\ mathbf {w_i})\ cos \ theta d \ omega
$$
其中$ \ textbf {p} $是表面的交点, $ \ mathbf {w_o} $是观察矢量,$ \ mathbf {w_i} $是光矢量,$ L_o $是沿$ \ mathbf {w_o} $的传出辐射,$ L_i $是在$ \上的辐射入射沿$ \ mathbf {w_i} $和$ \ cos \ theta = \ mathbf {n} \ cdot \ mathbf {w_i} $的textbf {p} $。上面的积分(即反射项)渲染方程的近似值)可以使用以下蒙特卡洛估计器进行近似计算:
$$
\ frac {1} {N} \ sum_ {k = 1} ^ {N} \ frac {L_i(\ textbf {p},\ mathbf {w_k})fr(\ mathbf {w_k},w_o)\ cos \ theta} {p(\ mathbf {w_k})}
$$
其中$ p $是描述采样向量$ \ mathbf {w_k} $分布的概率密度函数(PDF)。对于实际渲染,必须指定BRDF和PDF。对于Cook-Torrance模型的镜面反射项,我使用以下BRDF
$$
$$
其中
D = \ frac {1} {m ^ 2(\ mathbf {n} \ cdot \ mathbf {h})^ 4} \ exp \ left({\ frac {(\ mathbf {n} \ cdot \ mathbf {h} )^ 2-1-1} {m ^ 2(\ mathbf {n} \ cdot \ mathbf {h})^ 2}} \ right)
$$
$$
F = c_ {spec} +(1-c_ {spec})(1-\ mathbf {w_i} \ cdot \ mathbf {h})^ 5
$$
$$
G = \ min \ left(1,\ frac {2(\ mathbf {n} \ cdot \ mathbf {h})(\ mathbf {n} \ cdot \ mathbf {w_o})} {\ mathbf {w_o} \ cdot \ mathbf {h }},\ frac {2(\ mathbf {n} \ cdot \ mathbf {h})(\ mathbf {n} \ cdot \ mathbf {w_i})} {\ mathbf {w_o} \ cdot \ mathbf {h}} \ right)
$$
在上述等式中,$ \ mathbf {h} = \ frac {\ mathbf {w_o} + \ mathbf {w_i}} {| \ mathbf {w_o} + \ mathbf {w_i} |} $和$ c_ {spec} $是镜面颜色。除$ F $外,所有方程式均从原始论文中提取。 $ F $也称为Schlick逼近,是对实际菲涅耳项的有效且不太准确的逼近。

在渲染平滑镜面曲面时必须使用重要性采样。但是,我仅对相当粗糙的表面($ m \约0.2 $)建模,因此,我决定保持一段时间均匀采样(以更长的渲染时间为代价)。在这种情况下,PDF为
$$
p(\ mathbf {w_k})= \ frac {1} {2 \ pi}
$$
通过替换制服PDF和Cook-Torrance BRDF放入Monte Carlo估计器(注意$ \ mathbf {w_i} $被随机变量$ \ mathbf {w_k} $代替),我得到
$$
\ frac {1} {N} \ sum_ {k = 1} ^ {N} \ frac {L_i(\ textbf {p},\ mathbf {w_k})\ left(\ frac {DFG} {\ pi(\ mathbf { n} \ cdot \ mathbf {w_k})(\ mathbf {n} \ cdot \ mathbf {w_o})} \ right)\ cos \ theta} {\ left(\ frac {1} {2 \ pi} \ right) }
$$
现在我们可以取消$ \ pi $并删除求和,因为我们从交点仅发射一条随机射线。我们最后得到
$$
2 L_i(\ textbf {p},\ mathbf {w_k})\ left(\ frac {DFG} {(\ mathbf {n} \ cdot \ mathbf {w_k })(\ mathbf {n} \ cdot \ mathbf {w_o})} \ right)\ cos \ theta
$$
由于$ \ cos \ theta = \ mathbf {n} \ cdot \ mathbf {w_k} $,我们可以进一步简化它
$$
2 L_i(\ textbf {p},\ mathbf {w_k} )\ left(\ frac {DFG} {\ mathbf {n} \ cdot \ mathbf {w_o}} \ right)
$$

因此,当射线击中镜面,反射率由Cook-Torrance BRDF描述。这似乎反映出比收到的能量还要多的能量。
我几乎可以肯定它(或者在推导过程中)有问题,但是我无法发现它。

有趣的是,如果将上面的表达式乘以$ \ frac {1} {\ pi} $,我得到的结果看起来是正确的。但是,我拒绝这样做,因为我无法在数学上证明其合理性。谢谢!

更新

正如@wolle在下面指出的那样,本文提出了一种更适合路径跟踪的新公式,其中正态分布函数(NDF)$ D $包括$ \ frac {1} {\ pi} $因子,BRDF $ fr $包括$ \ frac {1} {4} $因子。因此,
$$
D_ {new} = \ frac {1} {\ pi m ^ 2(\ mathbf {n} \ cdot \ mathbf {h})^ 4} \ exp \ left({ \ frac {(\\ mathbf {n} \ cdot \ mathbf {h})^ 2-1-1 {m ^ 2(\ mathbf {n} \ cdot \ mathbf {h})^ 2}} \ right)
$$

$$
fr_ {new}(\ mathbf {w_i},\ mathbf {w_o})= \ frac {DFG} {4(\ mathbf {n} \ cdot \ mathbf {w_i})(\ mathbf {n} \ cdot \ mathbf {w_o})}
$$
在将上述方程式包含到渲染方程式中后,我最终得出了/> $$
\ frac {\ pi} {2} L_i(\ textbf {p},\ mathbf {w_k})\ left(\ frac {D_ {new} FG} {\ mathbf {n} \ cdot \ mathbf {w_o}} \ right)
$$
效果很好!
PS:现在的问题是更好地了解$ D $和$ fr $的新公式如何提供帮助保持节能方面...但这是另一个主题。

UPDATE 2

正如PeteUK指出的那样,我问题原始文本中提出的菲涅耳公式的作者被错误地归咎于库克和托伦斯。上面使用的菲涅耳公式实际上称为Schlick近似值,并以Christophe Schlick命名。问题的原始文本已作相应修改。

评论

不知道您是否仍在访问此站点,但我对您的菲涅耳方程有疑问,并已在此处发布

#1 楼

根据本文,您$ f_r $中的$ \ frac {1} {\ pi} $应该是$ \ frac {1} {4} $:
$$
f_r = \ frac { DFG} {4(n \ cdot w_i)(n \ cdot w_o)},
$$$
,所以最终会得到
$$
\ frac {\ pi} {2} L_i(p,w_k)\ left(\ frac {DFG} {n \ cdot w_o} \ right)。
$$

评论


$ \ begingroup $
我已经看到了Cook-Torrance BRDF的另一种表示形式,其中方程式乘以$ \ frac {1} {4} $而不是$ \ frac {1} {\ pi} $。但是,最后,这种修改的效果很小,因为我们将最终方程式中的2替换为1.57($ = \ frac {\ pi} {2} $)。我在这里做了测试(以防万一...),确实问题仍然存在。
$ \ endgroup $
– Capagot
16 Dec 16'在16:40

$ \ begingroup $
@Capagot有时将$ 1 / \ pi $的因数结合到光源强度中(按照惯例),而将其排除在BRDF之外;另请参阅此问题。但这在实时渲染中比在路径跟踪中更为常见。您还说您的Lambertian测试与Mitsuba完美匹配,因此似乎这不是问题所在……仍然值得研究。
$ \ endgroup $
–内森·里德(Nathan Reed)
16 Dec 16'在18:26

$ \ begingroup $
@Capagot我认为您在分布函数$ D $中缺少$ \ frac {1} {\ pi} $。我链接到的论文在Beckmann分布中包括该因子,您可以使用,因此在$ f_r $中有$ \ frac {1} {4} $,在$ D $中有$ \ frac {1} {\ pi} $做到这一点。
$ \ endgroup $
–狼le
16 Dec 16'在21:21

$ \ begingroup $
@NathanReed我已经阅读了有关将$ \ pi $嵌入颜色的文章。但是,由于您提到的原因,我确信这不是问题。
$ \ endgroup $
– Capagot
16 Dec 16 '22:00

$ \ begingroup $
@wolle正是!实际上,我已经快速浏览了您提到的论文,但是我没有注意到!我刚刚更改了实现,以将$ D $中的$ \ frac {1} {\ pi} $和$ fr $中的$ \ frac {1} {4} $都考虑在内,现在所有内容都像一个符咒!我将包括对问题的更新以及答案!谢谢!
$ \ endgroup $
– Capagot
16 Dec 16 '22:00

#2 楼

我将其发布给任何想知道$ \ frac {1} {\ pi} $和$ \ frac {1} {4} $之间的混淆的人。

术语$ \ frac { 1} {\ pi} $是原始Cook-Torrance参考中的错误。

实际上,整个项$ \ frac {1} {4(n \ cdot \ omega_i)} $来自从反射立体角到法线立体角的雅可比变换。

根据大多数论文,$ \ frac {1} {4} $术语最早出现在[Torrance,67]中。

有关该术语的详细说明,请检查[Nayar,91],附录D。这是同一张纸上的图片:


$$

此外,Joe Stam也同意Nayar在[Stam 01,一种照明模型中粗糙表面界定的蒙皮层],附录B。