Plu*_*man 5 buffer render-to-texture swift metal metalkit
我正在开发一个绘画程序,通过 MTKView 绘制交互式笔画。如果我将 renderPassDescriptor loadAction 设置为“clear”:
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,帧缓冲区显示 的最新内容renderCommandEncoder?.drawPrimitives,在本例中是笔触的前缘。
如果我将 loadAction 设置为“加载”:
renderPassDescriptor?.colorAttachments[0].loadAction = .load
Run Code Online (Sandbox Code Playgroud)
帧缓冲区疯狂地闪烁,并显示出我刚刚绘制的斑驳痕迹。我现在明白闪烁可能是由 MTKView 的默认三重缓冲造成的。因此,每次写入 currentDrawable 时,我可能会写入 3 个循环缓冲区之一。如果我错了,请纠正我。
我的问题是,我需要做什么才能绘制干净的笔触而不像现在那样帧缓冲区闪烁?换句话说,有没有办法让主缓冲区使用 commandEncoder 的最新内容进行更新?
您可以使用自己的纹理作为渲染通道的颜色附件。您不必使用可绘制的纹理。这样,您就可以使用该.load操作而不会出现垃圾或奇怪的闪烁或其他任何情况。您将完全控制要渲染的纹理及其内容。
在渲染通道渲染到该纹理后,您需要将其传输到可绘制的纹理以进行显示。
这里的主要并发症是您将无法享受双缓冲或三缓冲的好处。您将损失一定的性能,因为所有内容都必须同步到该纹理的状态。不过,我怀疑您不需要那么高的性能,因为这是交互式的,只需跟上人类的速度即可。
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |