我想在许多QOpenGLWidget中显示一个具有不同视点的场景,这些场景位于同一个窗口中(用QSplitter架构分隔)。 重要的是我想在GPU上只存储一次我的场景数据(几何和纹理)。 但是,每个QOpenGLWidget都有自己的QOpenGLContext。
我的想法是创建一个独立的上下文,将场景渲染成FrameBufferObject(而不是QFrameBufferObject),并在相关的QOpenGLWidget中使用结果纹理。
从技术上讲,我的方法是创建一个新的QOpenGLContext和一个QOffscreenSurface。 但是当我想使用由我的QOpenGLContext给出的结果QOpenGLFunctions时,即使我检查了我创建的QOpenGlContext是否有效,它仍然会出现分段错误。
以更一般的方式,我很难理解QOpenGLContext的作用,表面(在我的情况下是QOffscreenSurface)和makeCurrent函数。
我的要求是了解执行此操作的好方法以及为什么会出现分段错误。
答案 0 :(得分:0)
我回答了我的问题。
事实上,我已经将我的第一个初始化QOpenGLWidget的上下文用作全局上下文,以避免创建新的上下文。
棘手的部分是每次需要时使全局上下文变为当前(在GPU上添加数据或使用fbo)。
paintGL步骤很简单: - 使全局上下文保持最新状态。 - 开始fbo录制。 - 渲染场景。 - 停止fbo录制。 - 使QOpenGLWidget上下文成为当前。 - 在屏幕上渲染fbo结果。
我使用gDEBugger检查了我的记忆,我的所有记忆都在全局范围内(并且只存储一次)。