簡體   English   中英

金屬Alpha混合不起作用

[英]Metal alpha blending is not working

無論出於何種原因,我在金屬中混合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混合不起作用?

我希望將它們混合在一起,就像它們是透明玻璃一樣。 這樣想。

在此處輸入圖片說明

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM