我們正在處理隔行高清視頻。我用於渲染的金屬顏色附件具有一個字段(1920 * 540 RGBA)的尺寸。 當我嘗試將兩個渲染字段複製到具有1920 * 1080 * 4 = 8294400字節大小的相同MTLBuffer時,它僅適用於目標偏移量爲零的情況。如何使用MTLBlitCommandEncoder將隔行視頻字段複製到MTLBuffer中
let commandBuffer = commandQueue.makeCommandBuffer()
let blitEncoder = commandBuffer.makeBlitCommandEncoder()
blitEncoder.copy(from: attachmentTexture,
sourceSlice: 0,
sourceLevel: 0,
sourceOrigin: MTLOriginMake(0, 0, 0),
sourceSize: MTLSizeMake(attachmentTexture.width, attachmentTexture.height, 1),
to: destinationBuffer,
destinationOffset: 1920*4,
destinationBytesPerRow: 1920*4*2,
destinationBytesPerImage: destinationBuffer.length)
blitEncoder.endEncoding()
commandBuffer.commit()
對於目標偏移量爲零的第一個字段,該函數運行良好。目標緩衝區爲每第二行填充。
但是,當我想使用相同的代碼將第二個字段寫入相同的MTLBuffer對象時,只有將destinationOffset設置爲1920 * 4,就像您在上面的代碼中看到的(從緩衝區中的第二行開始),那麼我得到一個說法是這樣的:
- [MTLDebugBlitCommandEncoder validateCopyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:選項:]:677: 失敗的斷言`totalBytesUsed(8302080)必須< = destinationBuffer length。'
totalBytesUsed正好是以字節爲單位的目標緩衝區長度加上偏移量。所以我在這個函數中使用的每個偏移量都會導致這個斷言錯誤。
有人能解釋我如何因爲周圍的其他方法一樣傳入視頻幀創建兩個MTLTexture對象(奇數和偶數場)有類似的參數效果很好正確使用此功能。