我目前正在尝试实现Monte Carlo路径跟踪器。我已经进行了一些研究,似乎一种常见的材料处理方法是使用分层模型。像这样:



当光入射到表面时,菲涅耳告诉我们第一层反射了多少光,第二层反射了多少,

所以我做了类似但更简单的事情:只有一层镜面反射层和一层漫反射面。还没有透光率。到目前为止,我对弥散使用了一个简单的余弦加权brdf,对我的高光使用了Cook-Torrance微面模型。

现在是最困难的部分:一旦光线射到表面上,我该怎么办?
通常,我会选择与表面材料相对应的brdf,对入射光方向进行采样,评估brdf,然后除以正确的概率分布函数。

但是,这里的表面撞击实际上对应于多种材料。天真的处理方法是为每个图层命中采样一次。但这显然是造成巨大性能损失的根源,这使我的道路实际上变成了一棵树。

是否有更好的解决方案?

评论

您是否可以不“蒙地卡罗”材料层?例如。根据其反射率对各层进行加权,然后根据其反射率随机选择一个。更深的层将需要基于其上方所有层的吸收之和进行一些衰减。

PaulHK这就是我在路径跟踪器中所做的工作,即俄罗斯轮盘赌在各层之间的每个接口,因此,根本没有分支。不幸的是,我的实现尚未完成,因此我没有有关实际性能的信息。我的实现基于Andrea Weidlich和Alexander Wilkie撰写的论文“任意分层的微面表面”,该文档似乎比Wenzel Jakob的框架(在Stefan的答案中指出)更受限制。产生非常好的结果,并且易于实现。

#1 楼

Wenzel Jakob等人在SIGGRAPH 2014上展示了分层材料的框架。第6.2节介绍了重要性采样。如果您更喜欢代码而不是方程式,则可以在Mitsuba渲染器中实现该方法。

评论


$ \ begingroup $
请注意,Jakob等人的方法。依赖于以某些专门的傅立叶基础表示法来呈现列表化BSDF数据。有关详细信息,另请参阅相应的技术报告。最新的PBRT第三版中也提供了开源实现。可以使用Python中的layerlab生成BSDF文件。
$ \ endgroup $
– tizian
17年1月29日,0:07