与一组SIMD包装三角形的光线交叉(光线追踪)

时间:2015-03-04 08:21:08

标签: algorithm simd raytracing

有没有办法让单个光线与8个三角形的SIMD包相交,这样我就不必使用存储或随机播放或任何此类慢速指令?我的主要问题是交叉点的最后部分,我发现包中的8个三角形中哪一个最接近光线;我存储然后获得最小t值,基本上是水平分钟。

而且,这种模式是否正确?我正在使用具有单光线遍历的8路BVH,如" Stackless Multi-BVH Traversal中描述的CPU,MIC和GPU光线跟踪"我在其上面添加了单个光线到三角形交叉点的纸张。将ray-bundle与单三角形相结合,再加上二进制BVH会更合适吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

光束的困难在于如何获得高光线的一致性。

对于主光线,它不是太糟糕,因为相邻像素将产生高度相干的光线。对于阴影射线,它会有点复杂,但可以使用点光源或相对较小的区域光。

任何其他次要光线都会成为一种痛苦。如果你随机选择光线,那么它们很容易都会击中不同的三角形,这意味着你最终会做相同的单光线交叉,但是会有SIMD开销。从我所看到的使用SIMD光线束尚未表现出良好的承诺,即使重新安排光束以试图达到良好的一致性。

如果你想尝试一下,可以看一篇可能的文章是“用于实时光线追踪的大型光谱包”。他们使用光线包查看光线跟踪,并对其他光线包技术有一些参考。

答案 1 :(得分:0)

您基本上必须执行此水平缩减,例如使用一个_mm256_min_ps,一个_mm_min_ps,最后两个_mm_min_ss,并使用一些随机播放将结果放入正确的通道。这比使用8次shuffle 8 _mm_min_ss更好。

另一个选项是保持包含8个t参数的寄存器,并仅在遍历循环结束时进行缩减。但这意味着失去精确剔除BVH节点的能力。因此我建议采用第一种方法。