私はiOS 11、XCode 9、Metal 2で作業しています。ピクセル形式がbgra8Unorm
のMTLTexture
です。bgra8Unorm iOS-Metalテクスチャをrgba8Unormテクスチャに変換するには?
金属層のためのピクセルフォーマットはbgra8Unorm、bgra8Unorm_srgb、rgba16Float、BGRA10_XR、又はbgra10_XR_sRGBなければならない:pixelFormat documentationにかかるので、私は、このピクセルのフォーマットを変更することはできません。
他のピクセル形式は私のアプリケーションには適していません。
テクスチャからUIImage
を作成します。
getBytes(_:bytesPerRow:bytesPerImage:from:mipmapLevel:slice:)
私は
UIImage
得るためにこれらのバイトを処理しています:私は、テクスチャ(
doc)からのピクセルバイトを抽出することによってそうすることができる午前
func getUIImageForRGBAData(data: Data) -> UIImage? {
let d = (data as NSData)
let width = GlobalConfiguration.textureWidth
let height = GlobalConfiguration.textureHeight
let rowBytes = width * 4
let size = rowBytes * height
let pointer = malloc(size)
memcpy(pointer, d.bytes, d.length)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: pointer, width: width, height: height, bitsPerComponent: 8, bytesPerRow: rowBytes, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
let imgRef = context.makeImage()
let image = UIImage(cgImage: imgRef!)
return image
}
をしかし、CGContextは画素であることを前提としていrgba8形式のものです。たとえば、最終的なUIImageでは赤いテクスチャピクセルが青色になります。このプロセスでpixelFormatを変更して適切な色を得る方法はありますか?
Accelerate frameworkメソッドをチェックしましたか? https://developer.apple.com/documentation/accelerate/vimage/conversion – Adamsor
Metalレイヤー以外のテクスチャを使用することは許可されています。その制限があるからといって、異なるフォーマットのテクスチャに描画できないわけではありません。描画可能なテクスチャへの描画と並行して、または順番に(テクスチャを最初に描画し、そのテクスチャを描画可能なテクスチャに描画して) 。 –
ヒントのおかげで、それを試してみましょう! – 1awuesterose