gpt4 book ai didi

ios - Metal alpha 混合不起作用

转载 作者:行者123 更新时间:2023-12-02 01:53:40 26 4
gpt4 key购买 nike

无论出于何种原因,我在 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;

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

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

为什么 Alpha 混合不起作用?

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

enter image description here

最佳答案

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;

关于ios - Metal alpha 混合不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com