有没有办法让单个光线与8个三角形的SIMD包相交,这样我就不必使用存储或随机播放或任何此类慢速指令?我的主要问题是交叉点的最后部分,我发现包中的8个三角形中哪一个最接近光线;我存储然后获得最小t值,基本上是水平分钟。
而且,这种模式是否正确?我正在使用具有单光线遍历的8路BVH,如" Stackless Multi-BVH Traversal中描述的CPU,MIC和GPU光线跟踪"我在其上面添加了单个光线到三角形交叉点的纸张。将ray-bundle与单三角形相结合,再加上二进制BVH会更合适吗?
谢谢。
答案 0 :(得分:1)
光束的困难在于如何获得高光线的一致性。
对于主光线,它不是太糟糕,因为相邻像素将产生高度相干的光线。对于阴影射线,它会有点复杂,但可以使用点光源或相对较小的区域光。
任何其他次要光线都会成为一种痛苦。如果你随机选择光线,那么它们很容易都会击中不同的三角形,这意味着你最终会做相同的单光线交叉,但是会有SIMD开销。从我所看到的使用SIMD光线束尚未表现出良好的承诺,即使重新安排光束以试图达到良好的一致性。
如果你想尝试一下,可以看一篇可能的文章是“用于实时光线追踪的大型光谱包”。他们使用光线包查看光线跟踪,并对其他光线包技术有一些参考。
答案 1 :(得分:0)
您基本上必须执行此水平缩减,例如使用一个_mm256_min_ps
,一个_mm_min_ps
,最后两个_mm_min_ss
,并使用一些随机播放将结果放入正确的通道。这比使用8次shuffle 8 _mm_min_ss
更好。
另一个选项是保持包含8个t
参数的寄存器,并仅在遍历循环结束时进行缩减。但这意味着失去精确剔除BVH节点的能力。因此我建议采用第一种方法。