objective-c - 在单个 MTLRenderCommandEncoder 中使用多个渲染管道:如何同步 MTLBuffer?
问题描述
中心问题
我在一个渲染命令编码器中有两条渲染管道。第一个管道写入第二个管道中使用的缓冲区。这似乎不起作用,我希望它是一个同步问题。当我为每个渲染管道使用一个单独的渲染命令编码器时,我得到了想要的结果。这可以通过一个渲染命令编码器来解决,还是我需要两个单独的编码器来同步缓冲区?
这是更具体的情况:
第一个管道是非光栅化管道,仅运行顶点着色器以输出到MTLBuffer
存储MTLDrawPrimitivesIndirectArguments
以用于drawPrimitives
调用第二个管道,如下所示:
// renderCommandEncoder is MTLRenderCommandEncoder
// firstPipelineState and secondPipelineState are two different MTLRenderPipelineState
// indirectArgumentsBuffer is a MTLBuffer containing MTLDrawPrimitivesIndirectArguments
// numberOfVertices is number of vertices suited for first pipeline
// first pipeline
renderCommandEncoder.setRenderPipelineState(firstPipelineState)
renderCommandEncoder.setVertexBuffer(indirectArgumentsBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: numberOfVertices)
// second pipeline
renderCommandEncoder.setRenderPipelineState(secondPipelineState)
renderCommandEncoder.setVertexBuffer(secondPipelineBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, indirectBuffer: indirectArgumentsBuffer, indirectBufferOffset: 0)
renderCommandEncoder.endEncoding()
在发出对第二个管道的调用时,如何确保indirectArgumentsBuffer
第一个管道已写入 ,该drawPrimitives
管道使用并需要 的内容indirectArgumentsBuffer
?
解决方案
我相信您需要使用单独的编码器。在这个(有些过时的)关于函数 writes 的文档中,只有原子操作会同步绘制调用之间共享的缓冲区。
推荐阅读
- javascript - 使用 array.length 创建新的不和谐嵌入字段
- c# - Unity 程序网格生成
- node.js - Nodejs - 错误使用承诺
- android - 指示 gradle 使用本地文件
- mysql - 如何解决 MySQL 错误:#1064 在这种情况下?
- javascript - 从 cookie 加载网格后,dhtmlx 网格无法正常工作,然后执行隐藏/显示列
- google-fabric - 是否有显示器可以让我们看到第一次崩溃和最后一次崩溃的确切时间?
- php - 如何使用条件决策树为每个最终答案抓取 AngularJS 站点数据?
- html - 如何动态地将 true 或 false 分配给单选按钮“已选中”属性?
- swift - 更改 SCNText 中某些单词的颜色