metal - 在 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
. 正确的?
解决方案
您不能更改缓冲区本身的内容,即MTLBuffer
对象。您可以更改的是绑定了哪些缓冲区。当您调用 时setVertexBuffer
,命令编码器会记住您在那里绑定的缓冲区,直到您绑定nil
或另一个缓冲区,并且每次您发出绘图命令(如drawPrimitives
,或调度命令(如dispatchThreadgroups
)时,当前绑定都被“保存”,您可以继续进行编码新的缓冲区(以及纹理)。
推荐阅读
- salesforce - Salesforce:尽管同一对象的条件相同,但查询会产生不同的记录计数
- java - 将倒数计时器值传递给下一个活动
- php - Woocommerce - 向可变产品添加新属性值
- python - 如何在 Moderngl EGL 后端添加深度缓冲区?
- angular - 无法更新 Angular CLI
- sql - Python3:无法使用从 SQL 表中获取的数据写入文本文件
- java - Android app crashes when using Notification with JobScheduler
- reactjs - history.push("/") 和之间有什么区别
- python - 如何将元组列表的列表转换为一个np数组,其中每个元素都是python中的一个元组
- php - 无法使用终端在 Mac 的本地主机上安装 Contao CMS