作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 Metal 的新手,我能够在屏幕上实现一个简单的简单场景 Quad 旋转,但我想导出 1 分钟的视频/帧,而不必实时进行。所以想想用户只是打开应用程序并点击“导出按钮”,cpu/gpu 全速输出 Quad 旋转的 1 分钟视频/帧而不预览它。
我知道如何使用 AVFoundation 将帧转换为视频,但不知道如何在不实时进行的情况下将我的 3d 场景转换为帧。
谁能告诉我在哪里看?
非常感谢!
最佳答案
我调整了我的答案 here和 Apple Metal 游戏模板来创建 this sample ,它演示了如何直接从 Metal 渲染的一系列帧中录制视频文件。
由于 Metal 中的所有渲染都绘制到纹理,因此调整普通 Metal 代码使其适合离线渲染到电影文件中并不难。回顾一下核心录制过程:
AVAssetWriter
.video
类型的 AVAssetWriterInput
,以便您可以编写视频帧AVAssetWriterInputPixelBufferAdaptor
,这样您就可以将 CVPixelBuffer
作为帧附加到视频中至于驱动录制,由于您没有从 MTKView
或 CADisplayLink
获得委托(delegate)回调,因此您需要自己完成。基本模式如下所示:
for t in stride(from: 0, through: duration, by: frameDelta) {
draw(in: renderBuffer, depthTexture: depthBuffer, time: t) { (texture) in
recorder.writeFrame(forTexture: texture, time: t)
}
}
如果您的渲染和记录代码是异步和线程安全的,您可以将其放在后台队列中以保持您的界面响应。如果您的渲染需要很长时间,您还可以抛出一个进度回调来更新您的 UI。
请注意,由于您不是实时运行的,因此您需要确保任何动画都考虑到当前帧时间(或帧之间的时间步长),以便在播放时以正确的速率运行。在我的示例中,我通过让立方体的旋转直接取决于帧的呈现时间来实现这一点。
关于swift - 如何在 Metal 中离线渲染/导出帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52789844/
我是一名优秀的程序员,十分优秀!