是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?
Is it possible to save the current viewport and then re draw the saved viewport in OpenGL and C++ during the next draw cycle?
我想知道我是否可以在内存中保存当前视口的位图,然后在下一个绘制周期中简单地将该内存绘制到视口?
我在屏幕的256x256区域绘制了许多数据点作为2D散点图,理论上我可以每帧重新渲染整个图,但在我的情况下,这将要求我存储大量数据点(50K-100K),其中大多数数据点将是冗余的,因为256x256框只有~65K像素。
所以,而不是重新绘制和渲染整个场景在时间t
,我想在t-1
拍摄场景的快照,先画出来,然后我可以在上面画更新。
这可能吗?如果是的话,我该怎么做呢?我已经看了很多关于如何做到这一点的线索,但我还没有找到任何有意义的东西。
你所能做的就是将场景渲染成纹理,然后在绘制附加点之前先绘制该纹理(使用纹理全屏四边形)。使用fbo,你可以直接渲染成纹理,而不需要任何数据副本。如果不支持这些,你可以使用glCopyTex(Sub)Image2D
将当前帧缓冲区(当然是在绘制之后)复制到纹理中。
如果你在渲染纹理时没有清除framebuffer,它已经包含了前一帧的数据,你只需要渲染额外的点。然后你所需要做的就是绘制纹理来显示它。所以你可以这样做:
- 使用FBO将时间t的额外点渲染到纹理中(已经包含时间t-1的数据)
- 通过渲染纹理全屏四边形到display framebuffer显示纹理
- t = t+1 ->步骤1
你甚至可以使用framebuffer_blit扩展(这是自OpenGL 3.0以来的核心,我认为)将FBO数据复制到屏幕framebuffer上,这甚至可能比绘制纹理四边形更快。
如果没有fbo,它将是这样的(需要数据副本):
- 将包含时间t-1的纹理渲染到display framebuffer
- 在纹理上渲染额外的时间点
- 捕获帧缓冲区到纹理(使用
glCopyTexSubImage2D
)为下一个循环 - t = t+1 ->步骤1
你可以渲染重的部分纹理。然后在渲染场景时,渲染纹理,并在顶部变化的东西。
相关文章:
- C++win32 API创建多个类似视口的窗口
- 使用C++在Qt3D中创建多个视口时出现问题
- 创建具有两个视口的Qt3D C++场景,其中显示适当的不同网格
- 尝试在虚幻引擎中通过C++添加视口时出错"No instance of overloaded function CreateWidget"
- 无法添加视口虚幻C
- C++ GLUT 使对象在视口外消失
- 如何在单独的视口和默认的framebuffer中使用framebuffer
- 在 C++.NET 中使用 OpenGL 并在视口上绘画
- VTK 定位摄像机以用对象填充视口
- 在 opengl 中视口的一角绘制世界坐标系
- 如何在 SDL2.0 OpenGL 中调整视口大小
- 在显示之前获取 QScrollArea 视口的大小
- 视口内的 OpenGL 视口
- MRPT:可以从视口获取图像
- OpenGL 'reshape()'函数视口边框背景
- OpenGL:多个重叠视口闪烁
- 如何为视口应用程序重新采样图像的子区域
- Opengl和DirectX视口和渲染目标
- 从视口坐标转换为[-1,1]^2顶点[ENGGL]
- 是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?