MTKView 更新帧缓冲区而不清除以前的内容

Posted

技术标签:

【中文标题】MTKView 更新帧缓冲区而不清除以前的内容【英文标题】:MTKView updating frame buffer without clearing previous contents 【发布时间】:2019-08-21 10:50:21 【问题描述】:

我正在开发一个绘画程序,通过 MTKView 绘制交互式笔触。如果我将 renderPassDescriptor loadAction 设置为“清除”:

renderPassDescriptor?.colorAttachments[0].loadAction = .clear

正如预期的那样,帧缓冲区显示renderCommandEncoder?.drawPrimitives 的最新内容,在这种情况下是笔触的前沿。

如果我将 loadAction 设置为“加载”:

renderPassDescriptor?.colorAttachments[0].loadAction = .load 

帧缓冲区疯狂地闪烁,并显示出我刚刚绘制的不完整的轨迹。我现在明白闪烁可能是由 MTKView 默认的三重缓冲引起的。因此,每次我写入 currentDrawable 时,我很可能会写入 3 个循环缓冲区之一。如果我错了,请纠正我。

我的问题是,我需要做什么才能绘制干净的笔触而不像现在这样闪烁帧缓冲区?换句话说,有没有办法让主缓冲区使用 commandEncoder 的最新内容进行更新?

【问题讨论】:

【参考方案1】:

您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制对象的纹理。这样,您可以使用.load 操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您可以完全控制要渲染到的纹理及其内容。

在渲染到该纹理以进行渲染通道后,您需要将其 blit 到可绘制对象的纹理以进行显示。

这里的主要问题是您不会享受双缓冲或三缓冲的好处。您将失去一定的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么多性能,因为这是交互式的,只需要跟上人类的速度即可。

【讨论】:

以上是关于MTKView 更新帧缓冲区而不清除以前的内容的主要内容,如果未能解决你的问题,请参考以下文章

在 DS 上结合 3D 和帧缓冲模式

[Unity Shader学习笔记] Unity缓冲区

[Unity Shader学习笔记] Unity缓冲区

将 Metal MTKView 实时捕获为电影?

WebGL:在带有深度模板纹理附件的帧缓冲区上未清除颜色

删除/清除以前的缓冲区/流视频 mpmovieplayer iphone