如何在 Metal 中将 MTLTexture 转换为 CVMetalTextureRef 或 CMSampleBufferRef?

ste*_*iff 5 metal

我在将 MTLTexture 转换为 CVMetalTextureRef 或 CVPixelBufferRef 时遇到问题,我的代码是这样的:

\n\n
CVPixelBufferLockBaseAddress(_screenPixelBuffer, 0);//\xe5\xbf\x85\xe9\xa1\xbb\xe9\x94\x81\xe5\xae\x9a\xe5\x86\x85\xe5\xad\x98\n\n    id <MTLTexture> outputTexture = drawable.texture;\n\n    MTLRegion region = MTLRegionMake2D(0, 0, drawable.layer.drawableSize.width, drawable.layer.drawableSize.height);\n\n    int bytesPerPixel = 4;\n    int bytesPerRow = bytesPerPixel * drawable.layer.drawableSize.width;\n\n    NSLog(@"drawable.layer.drawableSize.width = %f, drawable.layer.drawableSize.height = %f", drawable.layer.drawableSize.width, drawable.layer.drawableSize.height);\n    NSLog(@"textureType = %lu, width = %lu, height = %lu, depth = %lu, arrayLength = %lu\xef\xbc\x8c mipmapLevelCount = %lu, sampleCount = %lu", outputTexture.textureType, outputTexture.width, outputTexture.height, outputTexture.depth, outputTexture.arrayLength, outputTexture.mipmapLevelCount, outputTexture.sampleCount);\n\n    void *tmpBuffer = CVPixelBufferGetBaseAddress(_screenPixelBuffer);\n\n    [outputTexture getBytes:tmpBuffer bytesPerRow:bytesPerRow fromRegion:region mipmapLevel:0];\n\n\n    [_iv setImage:[self imageFromPixelBuffer:_screenPixelBuffer]];\n\n    CVPixelBufferUnlockBaseAddress(_screenPixelBuffer, 0);//\xe8\xa7\xa3\xe9\x94\x81\xe5\x86\x85\xe5\xad\x98\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是 UIImageview 显示的图像不正确。完整代码在这里

\n