金属 alpha 混合不起作用

J.D*_*Doe 4 graphics objective-c ios metal

无论出于何种原因,我都遇到了金属中 alpha 混合的问题。我正在绘制 MTKView,对于我创建的每个管道,我执行以下操作:

descriptor.colorAttachments[0].blendingEnabled = YES;
descriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd;
descriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperationAdd;
descriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
descriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorSourceAlpha;
descriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
descriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
Run Code Online (Sandbox Code Playgroud)

但是,无论出于何种原因,这都不会导致 alpha 测试发生。您甚至可以检查帧调试器,您将看到 alpha 为 0 的顶点被绘制为黑色而不是透明。

我的一个想法是,某些几何体最终位于完全相同的 z 平面上,因此如果 alpha 混合在同一 z 平面上不起作用,则可能会导致问题。但我不认为那是一回事。

为什么 alpha 混合不起作用?

我希望像透明玻璃一样混合。这样想。

在此处输入图片说明

Mat*_*ias 9

Alpha 混合是一种依赖顺序的透明度技术。这意味着(半)透明对象不能像(更昂贵的)与顺序无关的透明技术那样以任意顺序呈现。

  1. 确保您的透明 2D 对象(例如圆形、矩形等)具有不同的深度值。(这样你可以自己定义绘制顺序。否则绘制顺序取决于排序算法的实现和排序前的初始排序。)
  2. 根据深度值从后到前对这些 2D 对象进行排序
  3. 使用 alpha 混合从后到前绘制 2D 对象(画家算法)。(当然,您的 2D 对象需要 alpha 值 < 1 才能真正看到一些混合。)

您的 alpha 混合的混合状态是正确的:

// The blend formula is defined as:
// (source.rgb * sourceRGBBlendFactor  )   rgbBlendOperation (destination.rgb * destinationRGBBlendFactor  ) 
// (source.a   * sourceAlphaBlendFactor) alphaBlendOperation (destination.a   * destinationAlphaBlendFactor)
// <=>
// (source.rgba * source.a) + (destination.rgba * (1-source.a))

descriptor.colorAttachments[0].blendingEnabled             = YES;
descriptor.colorAttachments[0].rgbBlendOperation           = MTLBlendOperationAdd;
descriptor.colorAttachments[0].alphaBlendOperation         = MTLBlendOperationAdd;
descriptor.colorAttachments[0].sourceRGBBlendFactor        = MTLBlendFactorSourceAlpha;
descriptor.colorAttachments[0].sourceAlphaBlendFactor      = MTLBlendFactorSourceAlpha;
descriptor.colorAttachments[0].destinationRGBBlendFactor   = MTLBlendFactorOneMinusSourceAlpha;
descriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
Run Code Online (Sandbox Code Playgroud)

  • 在 swift 中,这给出: &lt;&lt; Descriptor.colorAttachments[0].isBlendingEnabled = true Descriptor.colorAttachments[0].rgbBlendOperation = .add; 描述符.colorAttachments[0].alphaBlendOperation = .add; 描述符.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha; 描述符.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha; 描述符.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha; 描述符.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha; &gt;&gt; (2认同)