我一直在关注网上的scratchapixel射线追踪教程,这些教程非常擅长于解释一切背后的理论以及如何实现它。但是,我到达了要实现“区域照明”的地步,但是我对如何做到这一点一无所知。该网站上的教程尚未上传(尽管有一个占位符链接以及其他链接)。

关于实现的在线资源不多,所以这使我进入了这里。有人可以解释一下如何使用射线追踪而不是点光源来实现区域光源吗?



评论

只是检查...这是正确的光线跟踪,而不是路径跟踪?

我的意思是说路径跟踪将更改标题。

#1 楼

我将为这个问题提供简单/天真/蛮力的答案,它确实有效,并且给出了准确的结果。

但是有更好的答案,可以使渲染速度更快,收敛次数更少。 ,但使用更高级的数学。我希望其他人能提供类似的答案。

简单的答案是:
区域光只是具有发射值的几何形状。

很幸运,在路径跟踪中添加对发射值的支持非常容易。

您知道,朝向像素的光量就是离开表面的光线量,该光线会从该像素向下照射相交。

递归计算,方法是看有多少光到达该点,将BRDF积分,乘以余弦和所有爵士乐。

仅添加了发光照明达到这个结果。因此,无论您现在拥有的是表面的“出射光”,只需为其添加表面的发光颜色即可。 (您也可以选择执行类似于纹理贴图的操作,并根据对象的不同而改变发射值,可能基于纹理)。

就这么简单,很简单。

在下面的渲染方程式中,$ L_e(\ omega_o)$表示发射项(e代表发射项),方程的其余部分是在半球上积分的光。您可以看到,您只是将发射的发射光添加到从点($ L_o(\ omega_o)$)作为出射光返回的结果中,以应用该发射光。

$ L_o(\ omega_o) = L_e(\ omega_o)+ \ int _ {\ Omega} {f(\ omega_i,\ omega_o)L_i(\ omega_i)(\ omega_i \ cdot n)\ mathrm {d} \ omega_i} $

您可以在此链接上阅读有关带区域灯的简单路径跟踪器的更多信息,该注释器还注释了C ++源代码。

http://blog.demofox.org/2016/09/21/path跟踪开始使用扩散和发射/



评论


$ \ begingroup $
很好的回答这确实澄清了一切,尽管我不讨论话题,您是否会知道关于如何实现景深的任何有用资源?
$ \ endgroup $
– Arjan Singh
16年3月3日在6:08

$ \ begingroup $
对不起,但我也很感兴趣。问另一个问题IMO!
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16 Dec 3'在6:09

$ \ begingroup $
但是,如何计算光线跟踪中使用的光线方向以首先计算直接照明?我什至需要这么做吗?我在这里有点困惑。
$ \ endgroup $
– Arjan Singh
17年5月28日在12:53

$ \ begingroup $
您不需要这样做,不。您只需要在半球中发射随机光线,其中一些会击中光线,而有些则不会。有一些技巧可以更直接地对光线进行拍摄,同时还能考虑您随机选择光线的可能性(使图像看起来相同),但这不是必需的,不是。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
17年5月28日在14:20

$ \ begingroup $
我仍然很困惑(对不起),但这不是仅适用于间接照明而不是直接照明吗?您可以在答案中添加一些代码来说明这一点吗?我在GitHub上的博客文章中查看了路径跟踪器的来源,但我不明白发生了什么。
$ \ endgroup $
– Arjan Singh
17年5月28日在14:31