MTKView在不清除先前内容的情况下更新帧缓冲区

时间:2019-03-30 20:17:59

标签: swift buffer metal render-to-texture metalkit

我正在研究一个绘画程序,该程序通过MTKView绘制交互式笔画。如果我将renderPassDescriptor loadAction设置为“ clear”:

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

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

如果将loadAction设置为“ load”:

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

帧缓冲区像疯了似的闪烁着,并显示了我刚刚绘制的内容的斑驳痕迹。我现在了解到,闪烁可能是由MTKView的默认默认三重缓冲引起的。因此,每次我写入currentDrawable时,我都可能会写入3个循环缓冲区之一。如果我错了,请纠正我。

我的问题是,我需要做些什么来画出清晰的笔触而又不像现在那样闪烁帧缓冲区?换句话说,是否有一种方法可以使主缓冲区更新为commandEncoder的最新内容?

1 个答案:

答案 0 :(得分:1)

您可以使用自己的纹理作为渲染过程的颜色附件。您不必使用drawable的纹理。这样,您可以使用.load操作,而不会出现垃圾或怪异的闪烁等现象。您将完全控制要渲染到的纹理及其内容。

渲染到该纹理以进行渲染传递后,您需要将该颜色调成可绘制对象的纹理以进行显示。

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