用于在fbo中呈现以在许多QOpenGLWidget

时间:2016-11-25 15:57:27

标签: c++ opengl qt5

我想在许多QOpenGLWidget中显示一个具有不同视点的场景,这些场景位于同一个窗口中(用QSplitter架构分隔)。 重要的是我想在GPU上只存储一次我的场景数据(几何和纹理)。 但是,每个QOpenGLWidget都有自己的QOpenGLContext。

我的想法是创建一个独立的上下文,将场景渲染成FrameBufferObject(而不是QFrameBufferObject),并在相关的QOpenGLWidget中使用结果纹理。

从技术上讲,我的方法是创建一个新的QOpenGLContext和一个QOffscreenSurface。 但是当我想使用由我的QOpenGLContext给出的结果QOpenGLFunctions时,即使我检查了我创建的QOpenGlContext是否有效,它仍然会出现分段错误。

以更一般的方式,我很难理解QOpenGLContext的作用,表面(在我的情况下是QOffscreenSurface)和makeCurrent函数。

我的要求是了解执行此操作的好方法以及为什么会出现分段错误。

1 个答案:

答案 0 :(得分:0)

我回答了我的问题。

事实上,我已经将我的第一个初始化QOpenGLWidget的上下文用作全局上下文,以避免创建新的上下文。

棘手的部分是每次需要时使全局上下文变为当前(在GPU上添加数据或使用fbo)。

paintGL步骤很简单: - 使全局上下文保持最新状态。 - 开始fbo录制。 - 渲染场景。 - 停止fbo录制。 - 使QOpenGLWidget上下文成为当前。 - 在屏幕上渲染fbo结果。

我使用gDEBugger检查了我的记忆,我的所有记忆都在全局范围内(并且只存储一次)。