Альфа-смешение металлов не работает - PullRequest
0 голосов
/ 27 августа 2018

По какой-то причине у меня проблемы с альфа-смешиванием в металле. Я рисую в 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;

Однако по какой-либо причине это не вызывает альфа-тестирования. Вы можете даже включить отладчик фреймов, и вы увидите вершины с альфа 0, которые отображаются черным, а не прозрачным.

Одна мысль, которая у меня возникла, заключается в том, что некоторая геометрия оказывается в одной и той же плоскости z, поэтому, если альфа-смешение не работает в той же плоскости z, что может вызвать проблему. Но я не думаю, что это вещь.

Почему альфа-смешивание не работает?

Я надеюсь смешать, как будто это прозрачное стекло. Думай так.

enter image description here

1 Ответ

0 голосов
/ 27 августа 2018

Альфа-смешение является зависимой от порядка техникой прозрачности.Это означает, что (полупрозрачные) объекты не могут отображаться в произвольном порядке, как в случае (более дорогих) методов прозрачности, не зависящих от порядка.

  1. Убедитесь, что ваши прозрачные 2D-объекты (например,круг, прямоугольник и т. д.) имеют различные значения глубины. (Таким образом, вы можете определить порядок прорисовки самостоятельно. В противном случае порядок прорисовки зависит от реализации алгоритма сортировки и исходного порядка перед сортировкой.)
  2. Сортировка эти 2D-объекты основаны на значении их глубины сзади-вперед.
  3. Нарисуйте 2D-объекты сзади-вперед ( алгоритм художника ), используя альфа-смешение. (Конечно, вашим 2D-объектам нужно альфа-значение <1, чтобы увидеть некоторое смешивание.) </em>

Ваше состояние смешивания для альфа-смешивания правильное:

// 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;
...