我有一个朴素的漫反射/发射材料路径跟踪器实现(针孔相机),并且看到它需要花费每个像素大量的样本才能进行收敛(例如可能需要数百万个),并且想知道“朴素”路径跟踪器是否正常?

每个像素有10,000个样本:


这是使用余弦加权半球样本作为比较的10,000spp图像:


我对每个像素执行以下操作:


将光线投射到该像素的场景中(从近平面开始,朝相机的方向移动)像素在近平面上的位置。)
当物体被击中时,我会计算法线定义的半球中的均匀随机方向并继续。
在每个级别上,我都返回发射+(2 * (正常,bounceRayDir)* ColorFromBounceRay * DiffuseColor / pi)
如果反弹的射线没有击中任何东西,我会返回黑色。
我正在使用3个浮点颜色通道,其中重点是每个颜色通道的最终输出uint8中0-1对应于0-255。
我最多允许5次跳动。

对像素的所有样本求平均后,我这样做要将其从HDR转换为LDR:


对于每个颜色通道,我都要进行伽玛校正:channel = powf(channel,1.0f /2.2f)
然后我将通道相乘值乘以255,将其从0-255钳位,然后将其转换为uint8以获取最终的像素颜色。它包括用于位图标题的windows.h,但没有非标准标题,也没有库依赖项:
https://gist.github.com/anonymous/0dc9f7f5abf15f8fdb9aa84ecfcf67d5

评论

对于漫反射器,WebGL路径跟踪演示也不是非常快速地收敛。因此,至少您不是唯一拥有这种属性的人。

#1 楼

如果没有显式的光采样,我希望收敛非常慢。

在终止之前碰巧碰到光源的任何路径都是无用的(贡献为零)。由于您的光源很小,因此绝大多数路径都不会照到它。向跟踪器中添加一些统计信息以查看有多少路径返回零与非零比较有趣。我猜您会发现类似其中的99–99.9%都是零,因此,在跟踪的每100至1000条路径中,您只会得到一个有用的样本。与例如更合理天光,几乎每条路径都有望被击中。

评论


$ \ begingroup $
什么是显光采样和天光? computergraphics.stackexchange.com/questions/8596/…
$ \ endgroup $
– zwcloud
19-2-15在10:08



#2 楼

是的,这是可以预期的。您的两个图像之间的差异是使用和不使用重要性采样之间的差异。

第一个图像显示的噪点明显多于第二个图像。这是因为代码不是通过使用余弦加权将半球样本偏向法线,而是在半球上均匀采样,然后将反射光更少地反射给更接近垂直于法线的光线。请注意,由于这使用了点积,因此这也是余弦加权:

$$ A \ cdot B = \ | A \ | \\ | B \ | \ cos {\ theta} $$

只是权重每个射线的贡献,而不是加权每个方向的射线数量。

第二个图像的噪点较少,因为它不会在附近浪费很多样本-对图像的贡献很小的垂直射线。如果有足够的样本,图像仍将收敛到相同的结果-第二个图像中采用的方法会更快地到达那里。

两种情况下的效果是相同的:



方法1:将权重应用于每条射线的反射光量,导致许多射线的贡献很小。

方法2:每条射线

长期总和是相同的,但是方法1涉及许多光线而贡献可忽略不计


请注意,即使速度加快,对于较小的场景,收敛仍然很慢,明亮的灯光,或者场景的某些部分只能通过狭窄的路径进入。通常,在任何场景中,只有狭窄角度范围的区域可以贡献大部分光线。

评论


$ \ begingroup $
+1,向我简单介绍了重要性采样。
$ \ endgroup $
– PeteUK
16年11月16日在9:37