一束SIMD打包的三角形与光线相交(光线追踪)

4
有没有一种方法可以将单个射线与8个三角形的SIMD-pack相交,以便我不必使用存储或洗牌或任何这样的缓慢指令? 我的主要问题是相交的最后一部分,在那里我找到8个三角形中最接近射线的三角形; 我正在存储然后获取最小t值,基本上是水平min。
此外,这个模式是否正确? 我正在使用描述在“CPU,MIC和GPU光线追踪的无堆栈多BVH遍历”论文中的8路BVH进行单射线遍历,其上面我添加了单射线到三角形束的相交。 射线束与单三角形相交,再加上二进制BVH,是否更合适?
谢谢。

1
那个水平最小值可以通过一些洗牌和垂直最小值来实现,有点烦人但不太难。如果您发布当前代码,我可以看看是否可以进行编辑。 - harold
@哈罗德,问题是我正在尝试避免洗牌和存储,因为我读到它们非常慢。 - user2199797
它们比不做慢,但是除了uint16之外,没有水平最小值的指令,所以选择不多。 - harold
2个回答

1
使用光线束的困难在于如何获得高光线相干性。对于主光线,由于相邻像素会生成高度相干的光线,所以情况不太糟糕。对于阴影光线,使用点光源或相对较小的区域光源可以解决一些复杂问题。任何其他次要光线都变得难以处理。如果您随机选择光线,则它们很容易全部命中不同的三角形,这意味着您最终会执行等效的单个光线交叉,并且还需要 SIMD 开销。从我所看到的来看,即使重新排列光线束以实现良好的相干性,使用 SIMD 光线束也未显示出良好的前景。如果您确实想尝试,可以看一下 “Large Ray Packets for Real Time Whitted Ray Tracing” 这篇论文。他们使用光线数据包进行光线追踪,并引用了其他光线数据包技术的参考资料。

再读一遍问题:这不是关于一束光线,而是一条光线与8个三角形的比较。而不是相反。完成8个交点后,您需要知道哪一个最接近。 - Bram

0

你需要进行水平压缩,例如使用一个_mm256_min_ps、一个_mm_min_ps和最终两个_mm_min_ss,并使用一些洗牌操作将结果放入正确的通道中。这比使用8个_mm_min_ss和8个洗牌操作要好。

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


如果您只需要找到ps向量的最小元素,请参见我的答案https://dev59.com/g2w05IYBdhLWcg3w11Qk,但将add替换为min。 问题和任何一个答案都没有解释数据实际上是如何组织成向量的,因此对于我们这些了解SIMD但不了解此特定问题的人来说,这并不清楚。(理想情况下,有人会编辑问题,至少提供一个链接来解释您拥有8个三角形的位置/方式)。 - Peter Cordes
是的,那正是我所建议的。感谢提供链接。通常三角形数据以Embree中的SoA形式存储。由于问题明确要求在交点结束时计算水平最小值(以获取所有8个三角形的最小相交时间),因此我们假设三角形已经加载和相交,因此_triangles_的内存布局并不重要。 - madmann91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接