在尝试将简单的晕影滤镜应用于 iPhone6 的原始摄像头馈送时,在 Metal 和 Core Image 的帮助下,我发现在 MTKView MTKView 中处理和渲染的帧之间存在很多延迟
我遵循的方法是(MetalViewController.swift):
- 使用
AVCaptureVideoDataOutputSampleBufferDelegate 获取原始相机输出
- 转换
CMSampleBuffer > CVPixelBuffer > CGImage
- 用这个
CGImage 创建一个 MTLTexture 。
点数2 和 3 在名为 fillMTLTextureToStoreTheImageData 的方法内
- 将
CIFilter 应用到从 MTKViewDelegate 中的 MTLTexture 获取的 CIImage
性能完全不是苹果在这个文档中提到的:https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101
我错过了什么吗?
Best Answer-推荐答案 strong>
您的第 2 步太慢了,无法支持实时渲染...而且您似乎遗漏了几个步骤。出于您的目的,您通常会:
设置:
- 创建一个
CVPixelBuffer 池 - 使用 CVPixelBufferPoolCreate
- 使用
CVMetalTextureCacheCreate 创建金属纹理池
对于每一帧:
- 转换
CMSampleBuffer > CVPixelBuffer > CIImage
- 通过过滤器管道传递
CIImage
- 将输出图像渲染到步骤 1 中创建的池中的
CVPixelBuffer
- 使用
CVMetalTextureCacheCreateTextureFromImage 使用过滤后的 CVPixelBuffer 创建金属纹理
如果设置正确,所有这些步骤将确保您的图像数据保留在 GPU 上,而不是从 GPU 传输到 CPU 再返回 GPU 进行显示。
好消息是所有这些都在 Apple https://developer.apple.com/library/archive/samplecode/AVCamPhotoFilter/Introduction/Intro.html#//apple_ref/doc/uid/TP40017556 的 AVCamPhotoFilter 示例代码中进行了演示.尤其参见 RosyCIRenderer 类及其父类(super class) FilterRenderer 。
关于ios - 如何将 Vignette CIFilter 应用于 iOS 中的实时摄像机源?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/53898780/
|