При рисовании изображений в MKTView
, MTLBlitCommandEncoder
кажется хорошей идеей, так как мы можем просто скопировать текстуру в currentDrawable
из MKTView
. Код намного короче, чем MTLComputeCommandEncoder/MTLRenderCommandEncoder
, которые запрашивают pipelineState
и descriptor
.
Однако мой код ниже не отображает изображение должным образом, для (я думаю) разных размеров входной текстуры и выходной. Любые советы или предложения по использованию MTLBlitCommandEncoder
в таком случае? Или мне нужно использовать функцию шейдера, как мы видим в посте ниже/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()
}
Заранее благодарим за вашу помощь.
texture.pixelFormat
иdrawable.texture.pixelFormat
совпадали. В противном случае методcopy(...)
не сработает. Учитывая, что формат пикселей Core Video — YpCbCr, кажется вероятным, что текстура на самом деле не содержит данных RGB (или BGR), аbgra8Unorm
просто используется, потому что нет ничего лучше. Кроме того, поскольку он плоский, вероятно, есть несколько текстур или, возможно, срезов. Вы можете попробовать изучить текстуру в отладчике кадров графического процессора Xcode. Вам, вероятно, потребуется преобразовать данные тем или иным образом. Шейдер кажется разумным подходом. - person Ken Thomases   schedule 06.02.2019