При рисовании изображений в 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()
}
Заранее большое спасибо за помощь.