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

时间:2017-05-07 02:37:30

标签: 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()

1 个答案:

答案 0 :(得分:4)

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