在 Metal 中,您可以在传递期间重用缓冲区参数 table 索引吗?

In Metal, can you reuse buffer argument table indexes during a pass?

我看到示例代码,其中在单个渲染过程中将不同的缓冲区放在同一个 index 中。像这样:

renderEncoder.setVertexBuffer(firstBuffer, offset: 0, index: 0)
renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vcount1)

renderEncoder.setVertexBuffer(secondBuffer, offset: 0, index: 0)
renderEncoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: vcount2)

index参数是“缓冲区参数table”的索引,它有32个条目,所以合法值为0到31。

但我还看到文档说,在 GPU 完成给定渲染通道的工作之前,您不能更改缓冲区的内容。

那么,上面的代码是否合法并且不会出现任何时序问题?

如果是这样,我想这意味着 32 的限制是对单个绘制调用中可以使用的缓冲区数量的限制,而不是对单个通道中可以使用的缓冲区数量的限制,也就是 MTLCommandBuffer .正确吗?

您无法更改缓冲区本身的内容,即 MTLBuffer 对象。您可以更改的是绑定了哪些缓冲区。当你调用 setVertexBuffer 时,命令编码器会记住你绑定的缓冲区,直到你绑定 nil 或另一个缓冲区,并且每次你发出绘制命令(如 drawPrimitives,或调度命令(如dispatchThreadgroups) 当前绑定已“保存”,您可以继续对新缓冲区(以及纹理)进行编码。