gpt4 book ai didi

swift - 如何在 Metal 中离线渲染/导出帧?

转载 作者:搜寻专家 更新时间:2023-11-01 06:27:11 25 4
gpt4 key购买 nike

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

我知道如何使用 AVFoundation 将帧转换为视频,但不知道如何在不实时进行的情况下将我的 3d 场景转换为帧。

谁能告诉我在哪里看?

非常感谢!

最佳答案

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

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

  • 创建一个以您选择的 URL 为目标的 AVAssetWriter
  • 创建 .video 类型的 AVAssetWriterInput,以便您可以编写视频帧
  • 在输入周围包裹一个 AVAssetWriterInputPixelBufferAdaptor,这样您就可以将 CVPixelBuffer 作为帧附加到视频中
  • 开始记录后,将每一帧的像素从渲染的帧纹理复制到从适配器的像素缓冲池中获取的像素缓冲区中。
  • 完成后,将输入标记为已完成并完成写入 Assets 作者。

至于驱动录制,由于您没有从 MTKViewCADisplayLink 获得委托(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com