我正在使用 DXR 开发一个简单的光线追踪应用程序。我对多个几何体使用单个顶点和索引缓冲区,并且加速结构完美地处理了这个问题。一切工作正常,在投射主光线以创建一些真正基本的阴影后,我可以得到简单的“阴影”光线投射。对于下一步,我尝试访问顶点缓冲区中的法线,但我真的不知道如何实际索引到最近的命中着色器中的顶点。
我的相关着色器绑定是:
这三个缓冲区都是StructuredBuffer。
我已经尝试过:
这些都不起作用,我确信这是因为我严重误解了各种自动生成的 id。我确信我需要某种组合:该网格从什么索引偏移开始,我在该网格中处于什么三角形,以及两个额外的索引,以便用重心插入法线。
此外,也许在 DXR 中使用单个顶点和索引缓冲区并不明智?如果没有,我真的不知道如何绑定不同的 vbs 和 ibs 以在光线追踪着色器中访问。
我尝试使用 RenderDoc 来查看我的缓冲区是什么样子,但遗憾的是不支持 DXR。我也尝试过 NVIDIANsight,但实际上我似乎无法看到绑定缓冲区中包含的数据是什么,就像在 RenderDoc 中一样。
果然,发帖后我稍微明白了一点。
结合我的尝试 3 和 4 可以找到解决方案。考虑以下索引缓冲区:
uint indices[] = {
0,1,2, ---> mesh 0, triangle 0
3,4,5, ---> mesh 1, triangle 0
5,6,3, triangle 1
7,8,9, ---> mesh 2, triangle 0
9,10,7, triangle 1
11,12,13, triangle 2
13,14,11, triangle 3
etc.
}
通过PrimitiveIndex(),我们可以在三角形之间移动。如果我们还可以将缓冲区中网格的索引偏移量与实例一起发送。那么,给定三角形的索引是:
base_index = PrimitiveIndex() * 3 + instance.index_offset
index0 = base_index + 0
index1 = base_index + 1
index2 = base_index + 2
最后,确保顶点缓冲区得到适当填充,以便它们在 8 字节通道上对齐。 (这实际上是最终杀死抵消的原因。)