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

标签 c++ opengl bitmap

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

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

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

这可能吗?如果是这样,我该怎么做,我已经四处寻找有关如何执行此操作的线索,但我一直无法找到任何有意义的东西。

最佳答案

您可以做的是将场景渲染成纹理,然后在绘制其他点之前先绘制该纹理(使用带纹理的全屏四边形)。使用 FBOs您可以直接渲染到纹理中而无需任何数据拷贝。如果不支持这些,您可以使用 glCopyTex(Sub)Image2D 将当前帧缓冲区(当然是在绘制之后)复制到纹理中。 .

如果渲染到纹理中时不清除帧缓冲区,则它已经包含前一帧的数据,您只需要渲染额外的点即可。然后你需要做的就是绘制纹理来显示它。所以你会做类似的事情:

  1. 使用 FBO 将时间 t 的附加点渲染到纹理(已经包含时间 t-1 的数据)中
  2. 通过将带纹理的全屏四边形渲染到显示帧缓冲区中来显示纹理
  3. t = t+1 -> 步骤 1。

您甚至可以使用 framebuffer_blit extension (我认为这是 OpenGL 3.0 以来的核心)将 FBO 数据复制到屏幕帧缓冲区,这甚至可能比绘制带纹理的四边形更快。

如果没有 FBO,它会是这样的(需要数据拷贝):

  1. 将包含时间 t-1 数据的纹理渲染到显示帧缓冲区中
  2. 在纹理顶部渲染时间 t 的附加点
  3. 将帧缓冲区捕获到纹理中(使用 glCopyTexSubImage2D)用于下一个循环
  4. t = t+1 -> 步骤 1

关于c++ - 是否可以保存当前视口(viewport),然后在下一个绘制周期中在 OpenGL 和 C++ 中重新绘制保存的视口(viewport)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7727588/

相关文章:

Android 将 View 转换为位图

android - Canvas 上的位图对于任何带有移动对象的游戏来说都是一个坏主意

c++ - 从链表末尾移除 0

c++ - 基于 256 位 key 对矩阵进行加扰的方法有哪些?

c++ - std 替代 boost::this_thread_interruption_point

opengl - 什么是 OpenGL 中的阴影采样器以及它们的可能用途?

opengl - 分析图形着色器

c++ - Armadillo C++ expmat 堆栈

c++ - Qt QQuickFramebufferObject OpenGL渲染侵入其他物体场景为红色

c# - 如何确定滚动条的正确最大值 c# .NET(Windows 是怎么做到的?)