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

标签 swift metal

我目前正在为游戏制作简单的 UI,并且要绘制每个按钮,我需要使用 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()

最佳答案

是的,您可以在一个渲染命令编码器中使用多个管线状态。这正是 setRenderPipelineState() 方法存在的原因,而不是将管道状态作为渲染过程描述符的一部分的原因。渲染 channel 描述符中的属性仅在创建渲染命令编码器时读取,并且在该编码器的生命周期内无法更改。在编码器上可独立设置的任何内容都可以在其生命周期内更改。

关于swift - 我可以在一个 MTLRenderCommandEncoder 中使用多个 MTLRenderPipelineStates 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827284/

相关文章:

ios - 无法使用 Xcode 8 编译的 Metal 函数

ios - Metal :我需要多个RenderPipelines才能具有多个着色器吗?

ios - 组合多个MTKView/CAMetalLayer显示

swift - 为什么我启用了 Metal API 但我的 Coreml 自定义层仍在 CPU 上运行

iOS Metal : Jaggies Anit-aliasing

ios - 在 Swift 中检测到碰撞时更改图像

ios - tableView.reloadData() 不调用 cellForRowAtindexPath()

ios - 可以让声音变快吗?

ios - 在 SwiftUI 中创建新父级时 subview 不会重置

ios - 导航 Controller 委托(delegate)方法没有得到调用