【问题标题】:Changing the blend mode in Metal在 Metal 中更改混合模式
【发布时间】:2020-11-28 03:00:33
【问题描述】:

在 Metal 中更改混合功能是否需要设置一个全新的 MTLRenderPipelineState?

我假设是,因为 MTLRenderPipelineState 是不可变的,所以我不能更改它的描述符,例如描述符的 sourceRGBBlendFactor 属性。但我想确认一下,因为这听起来有点低效,无法生成大型对象来更改单个参数。

编辑: 我正在考虑一个案例,我正在绘制一个带有一系列网格的顶点缓冲区并多次调用 -drawPrimitives:。每个网格可以使用不同的混合模式,但都使用相同的顶点和片段着色器。在 OpenGL 中,我可以在绘图调用之间切换 glBlendFunc()。在 Metal 中,我需要设置一个带有多个状态值的完全独立的 MTLRenderPipelineState。

【问题讨论】:

  • 这个答案可能会给你更多信息。 stackoverflow.com/a/51414629/409315
  • 是的,我之前看到过这个答案,但它一般是关于设置混合模式,而不是经常切换它。到目前为止,我只使用两个几乎相同的 MTLRenderPipelineState 实例来执行相同的着色。它们之间的唯一区别是应用的混合模式。

标签: objective-c metal


【解决方案1】:

Metal 中的某些对象被设计为瞬态且极其轻量级,而其他对象则更昂贵并且可以持续很长时间,甚至可能在应用程序的整个生命周期内持续存在。

命令缓冲区和命令编码器对象是瞬态的,专为一次性使用而设计。它们的分配和释放成本非常低,因此它们的创建方法返回自动释放的对象。

MTLRenderPipelineState 不是暂时的

在 Metal 中更改混合功能是否需要设置一个全新的 MTLRenderPipelineState?

是的,您必须为每个混合配置创建一个全新的 MTLRenderPipelineState 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多