这将是我下一个光线跟踪项目中的一个重要设计决策。
我们知道;有效载荷";结构用于将数据从最近命中的着色器传递到raygen着色器。对于递归PBRT系统,基本上,我在这里有两个选项:
- 使用它来存储命中点的射线表面交互信息(无论是BRDF还是BSDF(
- 使用它来存储要跟踪的下一条光线的信息
第一个选项非常直观。射线与表面相互作用有一个普遍的表示形式。最接近的着色器将该信息返回给raygen着色器,并且在raygen着色器中对该信息进行统一处理,以修改集成的颜色并生成下一条光线。这种设计的一个问题是,在PBRT系统中,BSDF表示可能很大且复杂。对于VKRay/DXR,我们希望有效载荷尽可能小。
第二个选项将光线曲面交互的评估留给最接近命中的着色器。每个最近命中的着色器都可以有自己的光线曲面交互表示,这可能非常简单(取决于几何体表示(。在这种情况下,Payload会存储评估结果,例如要跟踪的下一条光线的信息。一个可能的问题是,最接近命中的着色器是执行流中的分叉部分,它们的效率会低于raygen着色器吗?
你更喜欢哪一个,为什么?
简单的答案是,这取决于它将取决于您运行的硬件,值得尝试。我们可以说,方法1肯定会有更少的内存占用,可能会有更好的光线收集和更好的缓存,但由于有效负载大小的增加,也可能有更高的带宽。方法1的另一个优点是不受递归深度的限制。
当然,从设计的角度来看,方法2更灵活。添加新材质/对象将涉及添加新着色器而不修改raygen着色器/有效载荷定义。
如果你要采用方法1,那么你可能还想研究使用";射线查询";这将完全绕过对最接近命中着色器的需要。您将使用非常庞大的raygen着色器有效地结束操作。它可能不那么灵活,但应该更快。