在特定上下文中创建资源

Create Resources on Specific Context

我有一个使用 QOpenGLWidget 渲染内容的 Qt OpenGL 应用程序。在另一个 class(我们称之为 Resources)中,我想为这个小部件创建 OpenGL 资源,如 VBO、VAO、着色器程序等。此创建方法不是由 QOpenGLWidget 调用,而是由外部调用者调用。

出于某种原因,我的应用程序中存在两个 OpenGL 上下文(一个可能用于 GUI 内容,另一个用于 QOpenGLWidget)。因此,当调用资源创建方法时,我无法确定正确的上下文是否处于活动状态。所以当我打电话给

QOpenGLVertexArrayObject vao;
vao.create();

在资源 class 中,我无法确定此 VAO 是在正确的上下文中创建的。资源 class 无权访问小部件。因此,context.makeCurrent()不能调用(因为我不知道表面)。

是否有直接的方法来指定应在其上创建资源的上下文?将表面存储在资源文件中(连同上下文)似乎很不整洁。

显然,无法在特定上下文中创建资源。我使用以下结构解决了这个问题:

我创建了一个接口OpenGLContextProvider,很简单:

class OpenGLContextProvider
{
public:
    virtual void MakeOpenGLContextCurrent() = 0;
};

OpenGL 小部件实现此接口:

class GLView : public QOpenGLWidget, public OpenGLContextProvider
{
    //...
};
void GLView::MakeOpenGLContextCurrent()
{
    makeCurrent();
}

因此,OpenGLContextProvider(即 OpenGL 小部件)被注入到 Resource 对象的构造函数中。在需要上下文之前,它会调用相应的方法:

void Resources::LoadSomeData()
{
    //Load data...

    //Create OpenGL resources
    ctx->MakeOpenGLContextCurrent(); //ctx is of type OpenGLContextProvider*
    vao.create(); //is now on the correct context
    //etc.
}