【问题标题】:Can I use multiple MTLRenderPipelineStates in one MTLRenderCommandEncoder?我可以在一个 MTLRenderCommandEncoder 中使用多个 MTLRenderPipelineStates 吗?
【发布时间】:2017-05-07 02:37:30
【问题描述】:

我目前正在为游戏制作简单的 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()

【问题讨论】:

  • 您是否再次为 2 个管道状态设置相同的纹理,如下所示? [renderEncoder setFragmentTexture:_mtlTexture atIndex:0];
  • @elmass 对不起,我不能告诉你。我在 Metal 中做过一些事情,但那是一年多以前的事了,从那以后我就把它从脑海里冲了出来。

标签: swift metal


【解决方案1】:

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

【讨论】:

  • 谢谢,我是这么想的,但我不确定。
  • 嗨,我正在做同样的事情。但是,我只观察第二个片段着色器的输出。你知道为什么吗?
  • Ken,为了改变顶点缓冲区和纹理,是否一遍又一遍地设置相同的管道状态,还有 snapshot 渲染编码器吗?
  • @trojanfoe 我不确定您所说的“渲染编码器快照”是什么意思。
  • 您在另一个 SO 答案中提到,在渲染编码器中设置管道状态将快照以前的状态,允许绑定新缓冲区等。我想知道是否设置 same管道状态会以同样的方式运行吗?
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 2012-07-25
  • 2023-04-03
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多