6

MTKView のコンテンツを UIImage にキャプチャすると、結果の画像は次のように質的に異なって見えます。

同じのMTKViewとUIImageView

UIImage を生成するために使用するコードは次のとおりです。

let kciOptions = [kCIContextWorkingColorSpace: CGColorSpace(name: CGColorSpace.sRGB)!,
                         kCIContextOutputPremultiplied: true,
                         kCIContextUseSoftwareRenderer: false] as [String : Any]
let lastDrawableDisplayed = self.currentDrawable! // needed to hold the last drawable presented to screen
drawingUIView.image = UIImage(ciImage: CIImage(mtlTexture: lastDrawableDisplayed.texture, options: kciOptions)!)

ciImage の向き (.directional(CGImagePropertyOrientation.downMirrored)) を変更していないため、上の画像に示すように、結果の画像は上下逆になります。2 つのイメージ キャプチャの色の違いを指摘できるように、ミラーリングされた向きはそのままにします。

kciOptions パラメーターをどのように変更しても (たとえば、色空間をグレースケールに変更しても)、結果の UIImage に変更は見られません。MTKViewで描いているものをUIImageに正確にキャプチャする方法について誰か提案がありますか? どんな提案でも大歓迎です。

以下は、関連する可能性のある私の MTKView 設定です。

let renderPipelineDescriptor = MTLRenderPipelineDescriptor()
renderPipelineDescriptor.vertexFunction = vertexProgram
renderPipelineDescriptor.sampleCount = self.sampleCount
renderPipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormat.bgra8Unorm
renderPipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
renderPipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
renderPipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha         renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha            renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha              renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
self.isOpaque = false // makes MTKView bg transparent
4

3 に答える 3