是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?



我想知道我是否可以在内存中保存当前视口的位图,然后在下一个绘制周期中简单地将该内存绘制到视口?

我在屏幕的256x256区域绘制了许多数据点作为2D散点图,理论上我可以每帧重新渲染整个图,但在我的情况下,这将要求我存储大量数据点(50K-100K),其中大多数数据点将是冗余的,因为256x256框只有~65K像素。

所以,而不是重新绘制和渲染整个场景在时间t,我想在t-1拍摄场景的快照,先画出来,然后我可以在上面画更新。

这可能吗?如果是的话,我该怎么做呢?我已经看了很多关于如何做到这一点的线索,但我还没有找到任何有意义的东西。

你所能做的就是将场景渲染成纹理,然后在绘制附加点之前先绘制该纹理(使用纹理全屏四边形)。使用fbo,你可以直接渲染成纹理,而不需要任何数据副本。如果不支持这些,你可以使用glCopyTex(Sub)Image2D将当前帧缓冲区(当然是在绘制之后)复制到纹理中。

如果你在渲染纹理时没有清除framebuffer,它已经包含了前一帧的数据,你只需要渲染额外的点。然后你所需要做的就是绘制纹理来显示它。所以你可以这样做:

  1. 使用FBO将时间t的额外点渲染到纹理中(已经包含时间t-1的数据)
  2. 通过渲染纹理全屏四边形到display framebuffer显示纹理
  3. t = t+1 ->步骤1

你甚至可以使用framebuffer_blit扩展(这是自OpenGL 3.0以来的核心,我认为)将FBO数据复制到屏幕framebuffer上,这甚至可能比绘制纹理四边形更快。

如果没有fbo,它将是这样的(需要数据副本):

  1. 将包含时间t-1的纹理渲染到display framebuffer
  2. 在纹理上渲染额外的时间点
  3. 捕获帧缓冲区到纹理(使用glCopyTexSubImage2D)为下一个循环
  4. t = t+1 ->步骤1

你可以渲染重的部分纹理。然后在渲染场景时,渲染纹理,并在顶部变化的东西。

最新更新