如何在Metal中离线渲染/导出框架?

时间:2018-10-13 05:32:56

标签: swift 3d avfoundation metal

我是Metal的新手,我能够实现一个简单的简单场景Quad在屏幕上旋转,但是我想导出1分钟的视频/帧而不必实时进行。 因此,请考虑一下用户,只要打开应用程序并点击“导出按钮”,cpu / gpu就会全速输出Quad旋转的1分钟视频/帧,而无需预览。

我知道如何使用AVFoundation将帧转换为视频,但不实时地将3d场景转换为帧。

有人可以指出我去哪里看吗?

非常感谢您!

1 个答案:

答案 0 :(得分:3)

我修改了答案here和Apple Metal游戏模板以创建this sample,该模板演示了如何直接从Metal渲染的一系列帧中录制视频文件。

由于Metal中的所有渲染均绘制为纹理,因此适应普通的Metal代码并不难,因此适合离线渲染到电影文件中。回顾核心录制过程:

  • 创建一个以您选择的URL为目标的AVAssetWriter
  • 创建类型为AVAssetWriterInput的{​​{1}},以便您可以编写视频帧
  • 在输入周围环绕.video,以便您可以将AVAssetWriterInputPixelBufferAdaptor作为帧添加到视频中
  • 开始记录后,每帧,将渲染帧纹理中的像素复制到从适配器的像素缓冲池中获得的像素缓冲区中。
  • 完成后,将输入标记为完成,然后完成向资产写入器的写入。

关于驱动录音,由于您没有从CVPixelBufferMTKView获得委托回调,因此您需要自己做。基本模式如下:

CADisplayLink

如果呈现和记录代码是异步的并且是线程安全的,则可以将其放在后台队列中以保持界面响应。如果渲染需要很长时间,您还可以引发进度回调以更新UI。

请注意,由于您不是实时运行,因此需要确保任何动画都考虑到当前的帧时间(或帧之间的时间步长),以便在回放时一切正常。在我的示例中,我只是通过使多维数据集的旋转直接取决于帧的显示时间来实现此目的。