Hier ist mein Code zum Konvertieren einer Textur in PNG-Daten:
Code: Select all
func textureToImage(texture: MTLTexture) -> Data {
let kciOptions: [CIImageOption:Any] = [.colorSpace: CGColorSpaceCreateDeviceRGB()]
let ciImage = CIImage(mtlTexture: texture, options: kciOptions)!
let transform = CGAffineTransform.identity
.scaledBy(x: 1, y: -1)
.translatedBy(x: 0, y: ciImage.extent.height)
let transformed = ciImage.transformed(by: transform)
return UIImage(ciImage: transformed).pngData()!
}
Code: Select all
let texture: MTLTexture = ...
texture.width // => 800
let image = textureToImage(texture)
image.size.width // => 800
let data = image.pngData()!
let reloadedImage = UIImage(data: data)!
reloadedImage.size.width // => 1600
Code: Select all
func load(_ image: UIImage) -> MTLTexture {
// The image is twice the texture resolution so we have to scale it down
let scaled = scale(image: image, scale: 0.5)
let options: [MTKTextureLoader.Option: Any] = [
.SRGB: false,
.generateMipmaps: true,
.textureUsage: MTLTextureUsage.unknown.rawValue
]
let loader = MTKTextureLoader(device: Renderer.device)
let texture = try! loader.newTexture(cgImage: scaled, options: options)
return texture.makeTextureView(pixelFormat: .bgra8Unorm)!
}
func scale(image: UIImage, scale: Float) -> CGImage {
let scale = CGFloat(scale)
let newWidth = image.size.width * scale
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!.cgImage!
}
Mobile version