相关疑难解决方法(0)

在单个 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()
Run Code Online (Sandbox Code Playgroud)

indirectArgumentsBuffer在发出drawPrimitives对第二个管道的调用时,如何确保第一个管道已写入 ,该管道使用并需要 的内容indirectArgumentsBuffer

objective-c swift metal

5
推荐指数
1
解决办法
289
查看次数

我可以在一个 MTLRenderCommandEncoder 中使用多个 MTLRenderPipelineStates 吗?

我目前正在为游戏制作简单的用户界面,并绘制我需要使用 2 个管道状态的每个按钮(每个按钮使用相同的顶点着色器)。一个使用静态颜色片段着色器为边框绘制线条条,一个使用波纹渐变绘制按钮内部。我想知道我是否需要两个不同的渲染命令编码器,每个管道一个,或者我是否可以执行以下操作:

let encoder = command.makeRenderCommandEncoder(descriptor: renderPassDesc)
encoder.setRenderPipelineState(stateWithStaticFragmentShader)
// encode some buffers and draw line-strips
encoder.setRenderPipelineState(stateWithGradientFragmentShader)
// encode some buffers and draw button background
encoder.endEncoding()
Run Code Online (Sandbox Code Playgroud)

swift metal

4
推荐指数
1
解决办法
561
查看次数

标签 统计

metal ×2

swift ×2

objective-c ×1