首页 > 解决方案 > 在 Metal 中,您可以在传递期间重用缓冲区参数表索引吗?

问题描述

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参数是“缓冲区参数表”的索引,该表有 32 个条目,因此合法值为 0 到 31。

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

那么,上述代码是否合法且不易出现任何时间问题?

如果是这样,我想这意味着 32 的限制是限制您可以在一次绘制调用中使用多少个缓冲区,而不是一次可以使用多少个缓冲区,也就是MTLCommandBuffer. 正确的?

标签: metal

解决方案


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


推荐阅读