Металл MTLTexture заменяет полупрозрачные области черным, если значения альфа не равны 1 или 0

При использовании импортера текстуры Apple или моего собственного, белого кругового круга, нарисованного в программном обеспечении (с прозрачным bg) или в Photoshop (сохраненном как PNG), при визуализации будут иметь свои полупрозрачные цвета, замененные на черный, когда их привезет в Metal ,

Ниже показан захват экрана от отладчика Metal Xcode, вы можете увидеть текстуру перед отправкой в ​​шейдеры.

Изображение, расположенное здесь (я недостаточно высоко оценен, чтобы вставлять)

В Xcode, finder, и при вводе в UIImageView исходная текстура не имеет кольца. Но где-то вдоль процесса UIImage -> CGContex -> MTLTexture (я думаю конкретно о части MTLTexture) прозрачные участки затемнены.

Я ударился головой о стену, меняя все, что мог, за последние пару дней, но я не могу понять.

Чтобы быть прозрачным (ha), вот мой личный код импорта

import UIKit import CoreGraphics class MetalTexture { class func imageToTexture(imageNamed: String, device: MTLDevice) -> MTLTexture { let bytesPerPixel = 4 let bitsPerComponent = 8 var image = UIImage(named: imageNamed)! let width = Int(image.size.width) let height = Int(image.size.height) let bounds = CGRectMake(0, 0, CGFloat(width), CGFloat(height)) var rowBytes = width * bytesPerPixel var colorSpace = CGColorSpaceCreateDeviceRGB() let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, rowBytes, colorSpace, CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)) CGContextClearRect(context, bounds) CGContextTranslateCTM(context, CGFloat(width), CGFloat(height)) CGContextScaleCTM(context, -1.0, -1.0) CGContextDrawImage(context, bounds, image.CGImage) var texDescriptor = MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.RGBA8Unorm, width: width, height: height, mipmapped: false) var texture = device.newTextureWithDescriptor(texDescriptor) texture.label = imageNamed var pixelsData = CGBitmapContextGetData(context) var region = MTLRegionMake2D(0, 0, width, height) texture.replaceRegion(region, mipmapLevel: 0, withBytes: pixelsData, bytesPerRow: rowBytes) return texture } } 

Но я не думаю, что это проблема (поскольку это копия Apple в Swift, и я использовал их вместо них без каких-либо различий).

Любые вести вообще будут очень полезны.

Благодаря Джесси я решил посмотреть, как я смешиваю свои альфы, и я понял это. Моя текстура по-прежнему выглядит темнее в отладчике GPU, но в реальном приложении все выглядит правильно. Я внес изменения в свой дескриптор состояния конвейера, который вы можете увидеть ниже.

 pipelineStateDescriptor.colorAttachments[0].blendingEnabled = true pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = .Add pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = .Add pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = .DestinationAlpha pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .DestinationAlpha pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .OneMinusSourceAlpha pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .OneMinusBlendAlpha 

Поскольку вы используете CGContext который настроен на использование цветов, предварительно умноженных на альфа-канал, использование стандартного RGB = src.rgb * src.a + dst.rgb * (1-src.a) приведет к RGB = src.rgb * src.a + dst.rgb * (1-src.a) областям, потому что src.rgb Значения src.rgb предварительно умножаются на src.a Это означает, что вы хотите src.rgb + dst.rgb * (1-src.a) который настроен следующим образом:

 pipeline.colorAttachments[0].isBlendingEnabled = true pipeline.colorAttachments[0].rgbBlendOperation = .add pipeline.colorAttachments[0].alphaBlendOperation = .add pipeline.colorAttachments[0].sourceRGBBlendFactor = .one pipeline.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha pipeline.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha pipeline.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha 

Один из них означает оставить RGB как есть. Причиной для преумноженных цветов является то, что вам нужно только умножать цвета один раз на создание, а не каждый раз, когда вы смешиваете. Ваша конфигурация также достигает этого, но косвенно.

Interesting Posts

Горизонтальная прокрутка Parallax UIScrollView iOS

возможно ли иметь файлы данных с несколькими основными данными в один проект xcode?

Телефонная книга PushPlugin не может получать уведомления ios

iPhone: Локализация значок приложения по-прежнему не поддерживается?

Почему мое приложение для iPhone работает в полноэкранном режиме на iPad

Как я могу получить уведомление, если статус подключения изменился?

tableView.beginUpdates не работает iOS10

Проект Xcode не открывается

Создавайте плитки с больших фотографий (iO PhotoScroller)

Что произойдет, если я загружу новую версию своего приложения в App Store, это только ARMv7?

Ссылка раскадровки в Xcode, где мы должны ее использовать?

Как правильно линеаризовать глубину в OpenGL ES в iOS?

Ошибка EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Ошибка вычисления высоты строки AutoLayout для NSAttributedString

Создание файла IPA в Xcode 5 для проекта, содержащего подпроекты статической библиотеки

Давайте будем гением компьютера.