在 Metal 中更改混合模式

Changing the blend mode in Metal

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

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

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

Metal 中的一些对象被设计为短暂且极其轻量级,而其他对象则更昂贵并且可以持续很长时间,也许是应用程序的整个生命周期。

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

MTLRenderPipelineState 不是短暂的

Does changing the blend function in Metal needs setting a whole new MTLRenderPipelineState?

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