Металлическая MTLTexture заменяет полупрозрачные области черным, когда значения альфа не равны 1 или 0
При использованииИмпортер текстур Appleили мой собственный, белый круг с мягкими краями, нарисованный программным обеспечением (с прозрачным bg) или в Photoshop (сохраненный как PNG) при визуализации, будет иметь полупрозрачные цвета, замененные черным при переносе в Metal.
Ниже приведен скриншот из Metal отладчика XCode, вы можете увидеть текстуру перед отправкой в шейдеры.
Изображение расположено здесь (я недостаточно высоко ранжирован для вставки)
В Xcode, finder и при помещении в UIImageView исходная текстура не имеет кольца. Но где-то вдоль процесса UIImage -> CGContex -> MTLTexture (я имею в виду, в частности, часть MTLTexture) прозрачные разделы затемнены.
Я бился головой о стену, меняя все, что мог, последние пару дней, но не могу понять.
Чтобы быть прозрачным (ха), вот мой личный код импорта
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, и я использовал их без различий).
Любые выводы будут очень полезны.