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

时间:2011-10-11 14:23:28

标签: c++ opengl bitmap

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

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

因此,我不想在t时重绘和渲染整个场景,而是想在t-1拍摄场景的快照并首先绘制,然后我可以在此基础上绘制更新。< / p>

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

2 个答案:

答案 0 :(得分:5)

您可以做的是将场景渲染为纹理,然后在绘制其他点之前首先绘制此纹理(使用纹理全屏四边形)。使用FBOs,您可以直接渲染到没有任何数据副本的纹理中。如果不支持这些,您可以使用glCopyTex(Sub)Image2D将当前帧缓冲区(当然,在绘制之后)复制到纹理中。

如果在渲染到纹理时没有清除帧缓冲区,它已经包含前一帧的数据,您只需要渲染其他点。然后你需要做的就是绘制纹理。所以你会做类似的事情:

  1. 使用FBO为时间t渲染额外的点到纹理(已包含时间t-1的数据)
  2. 通过将纹理化全屏四边形渲染到显示帧缓冲区来显示纹理
  3. t = t + 1 - &gt;第1步。
  4. 您甚至可以使用framebuffer_blit extension(我认为这是自OpenGL 3.0以来的核心)将FBO数据复制到屏幕帧缓冲区,这甚至可能比绘制纹理四边形更快。

    没有FBO就会出现这样的情况(需要数据拷贝):

    1. 将包含时间t-1数据的纹理渲染到显示帧缓冲区
    2. 在纹理顶部为时间t渲染额外的点
    3. 将帧缓冲区捕获到纹理中(使用glCopyTexSubImage2D)进行下一循环
    4. t = t + 1 - &gt;第1步

答案 1 :(得分:2)

你可以render to texture重要部分。然后在渲染场景时,渲染该纹理,最重要的是改变一切。