如何正确索引到 DXR 中的索引缓冲区

问题描述 投票:0回答:1

我正在使用 DXR 开发一个简单的光线追踪应用程序。我对多个几何体使用单个顶点和索引缓冲区,并且加速结构完美地处理了这个问题。一切工作正常,在投射主光线以创建一些真正基本的阴影后,我可以得到简单的“阴影”光线投射。对于下一步,我尝试访问顶点缓冲区中的法线,但我真的不知道如何实际索引到最近的命中着色器中的顶点。

我的相关着色器绑定是:

  1. t0 时的加速结构
  2. t1 处的索引缓冲区
  3. t2 处的顶点缓冲区
  4. t3 时的实例缓冲区

这三个缓冲区都是StructuredBuffer。

我已经尝试过:

  1. 使用 InstanceID(),例如index = index_b[InstanceID()],这当然不起作用,因为这是实例缓冲区的索引。
  2. 使用 PrimitiveIndex(),规范中称其为三角形索引。这提供了数据,但这是错误的,我不知道它到底在哪里访问索引缓冲区。
  3. 通过实例缓冲区传递网格的索引偏移量,例如索引=index_b[PrimitiveIndex() + inst.index_offset]
  4. 将 PrimitiveIndex() 乘以 3,并将其用作索引缓冲区的基本索引。这是最接近正确的,因为它实际上提供了来自索引缓冲区的数据,但索引时法线都是不正确的。

这些都不起作用,我确信这是因为我严重误解了各种自动生成的 id。我确信我需要某种组合:该网格从什么索引偏移开始,我在该网格中处于什么三角形,以及两个额外的索引,以便用重心插入法线。

此外,也许在 DXR 中使用单个顶点和索引缓冲区并不明智?如果没有,我真的不知道如何绑定不同的 vbs 和 ibs 以在光线追踪着色器中访问。

我尝试使用 RenderDoc 来查看我的缓冲区是什么样子,但遗憾的是不支持 DXR。我也尝试过 NVIDIANsight,但实际上我似乎无法看到绑定缓冲区中包含的数据是什么,就像在 RenderDoc 中一样。

graphics raytracing directx-12
1个回答
0
投票

果然,发帖后我稍微明白了一点。

结合我的尝试 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 字节通道上对齐。 (这实际上是最终杀死抵消的原因。)

© www.soinside.com 2019 - 2024. All rights reserved.