在特定上下文中创建资源
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.
}
我有一个使用 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.
}