首页 > 解决方案 > 复制金属帧缓冲纹理以供阅读

问题描述

我正在尝试截取 MetalKit 视图 (MTKView) 的屏幕截图,如答案Take a snapshot of current screen with Metal in swift但它要求 MTKView 将 framebufferOnly 设置为 false,这会根据 Apple 禁用一些优化。

有没有办法复制 MTKView 纹理(例如 view.currentDrawable.texture)以便我可以读取像素?我不需要经常截图,所以禁用程序运行的整个生命周期的优化将是一种耻辱。

我尝试使用 MTLTexture.newTextureViewWithPixelFormat 和 blit 缓冲区,但我仍然得到相同的异常,即帧缓冲区仅是真的。

标签: swiftmacoscocoametalmetalkit

解决方案


当请求截屏时,您可以切换framebufferOnly,执行一个渲染通道,然后将其切换回来。

或者,您可以针对您自己规范的纹理执行一次渲染传递,将其blit 到可绘制的纹理(以免在视觉上丢帧),然后保存您自己的纹理的内容。


推荐阅读