复制金属框架缓冲区纹理以进行读取

时间:2018-07-11 18:15:16

标签: swift macos cocoa metal metalkit

我正在尝试像答案Take a snapshot of current screen with Metal in swift中那样拍摄MetalKit视图(MTKView)的屏幕快照,但是它要求MTKView将framebufferOnly设置为false,从而根据Apple禁用某些优化。

有没有一种方法可以复制MTKView纹理(例如view.currentDrawable.texture)以便读取像素?我不需要经常拍摄屏幕截图,因此在程序运行的整个生命周期中禁用优化都是可耻的。

我尝试使用MTLTexture.newTextureViewWithPixelFormat和blit缓冲区,但仍然收到关于帧缓冲区只有true的相同异常。

1 个答案:

答案 0 :(得分:1)

请求截屏时,您可以切换framebufferOnly,进行一次渲染,然后再将其切换回去。

或者,您可以针对自己指定的纹理进行一次渲染遍历,将其调成可绘制对象的纹理(以免视觉上丢下框架),然后保存自己的纹理内容。