在 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
) 当前绑定已“保存”,您可以继续对新缓冲区(以及纹理)进行编码。
我看到示例代码,其中在单个渲染过程中将不同的缓冲区放在同一个 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
) 当前绑定已“保存”,您可以继续对新缓冲区(以及纹理)进行编码。