Metal MTLTexture ersetzt halbtransparente Bereiche durch Schwarz, wenn Alpha-Werte ungleich 1 oder 0 sind.
Während dem Benutzen Apples Textur-Importerei einem weißen Kreis mit weichen Kanten, der beim Rendern in Software (mit einem transparenten Hintergrund) oder in Photoshop (als PNG gespeichert) gezeichnet wurde, werden die semitransparenten Farben durch Schwarz ersetzt, wenn sie in Metal importiert werde
Below ist ein Screenshot aus dem Metal-Debugger von Xcode. Sie können die Textur sehen, bevor sie an Shader gesendet wird.
Bild befindet sich hier (ich bin nicht hoch genug eingestuft, um einzubetten)
In Xcode, Finder und in einer UIImageView hat die Quelltextur keinen Ring. Aber irgendwo entlang des UIImage -> CGContex -> MTLTexture-Prozesses (ich denke speziell an den MTLTexture-Teil) sind die transparenten Abschnitte abgedunkelt.
Ich habe in den letzten Tagen meinen Kopf gegen die Wand geschlagen und alles verändert, was ich konnte, aber ich kann es nicht herausfinden.
Um transparent zu sein (ha), hier ist mein persönlicher Importcode
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
}
}
Aber ich glaube nicht, dass das das Problem ist (da es sich um eine Kopie von Apple in Swift handelt und ich stattdessen ihre verwendet habe, ohne Unterschiede).
Alle Leads wären super hilfreich.