MTLBlitCommandEncoder в AVCaptureSession не показывает изображение должным образом.Нужно ли использовать функцию шейдера дисплея? - PullRequest
0 голосов
/ 05 февраля 2019

При рисовании изображений в MKTView, MTLBlitCommandEncoder звучит неплохо, так как мы можем просто скопировать текстуру в currentDrawable из MKTView.Код намного короче MTLComputeCommandEncoder/MTLRenderCommandEncoder, который запрашивает pipelineState и descriptor.

Однако мой код ниже не показывает изображение должным образом, для (я полагаю) разных размеров входной текстуры и выходной.Какие-либо советы или предложения по использованию MTLBlitCommandEncoder в таком случае?Или мне нужно использовать функцию шейдера, как мы видим ниже в post / git?

Отображение изображения JPEG с использованием MTKView

https://github.com/navoshta/MetalRenderCamera

func draw(in view: MTKView) {
  guard let drawable = view.currentDrawable else {return}
  guard let commandBuffer = commandQueue.makeCommandBuffer() else {fatalError()}
  guard let blitEncoder = commandBuffer.makeBlitCommandEncoder() else{fatalError()}
  guard let texture = self.texture else {fatalError()}
  let targetW = min(texture.width, drawable.texture.width)
  //720, 1125 in my case
  let targetH = min(texture.height, drawable.texture.height)
  //1280, 2436

  blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), sourceSize: MTLSizeMake(targetW, targetH, texture.depth), to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0))
  blitEncoder.endEncoding()
  commandBuffer.present(drawable)
  commandBuffer.commit()
  commandBuffer.waitUntilCompleted()
}

Заранее большое спасибо за помощь.

...