在未加载上下文的情况下在对象构造函数中使用 OpenGL 函数
Using OpenGL functions in object constructor without context loaded
我在初始化上下文之前创建对象时遇到问题。我的代码看起来像这样:
..
Vertex vertices[] = { ... } // declaration of object Vertices
Mesh mesh(vertices, sizeof(vertices)/sizeof(vertices[0]));
..
..
void onDisplay()
{
..
mesh.Draw();
..
}
void init() { .. }
int main(int argc, char** argv)
{
..
glutDisplayFunc(onDisplay);
..
}
正如我在 OpenGL site 上所读到的,问题是在初始化上下文之前创建了一个对象(由于构造函数中的代码)。如果我将 "mesh" 和 "vertices" 放在 "void init()" 中,那将解决问题,但我无法在 "void onDisplay" 中使用方法 "mesh.Draw()" - 因为object mesh 不是全局的,它只在 init() 中声明。
在 OpenGL 网站上他们讲述了如何解决这个问题,但我真的不明白我应该怎么做。
OpenGL 站点的解决方案如下:
- 不要使用 constructors/destructors 到 initialize/destroy OpenGL 对象。相反,为这些目的使用这些 classes 的成员函数。这违反了 RAII 原则,因此这不是最佳做法。
- 如果尚未创建上下文,让您的 OpenGL 对象构造函数抛出异常。这需要在您的上下文创建功能中添加一个内容,该功能会在上下文已创建并处于活动状态时告知您的代码。
- 创建一个拥有所有其他 OpenGL 相关对象的 class。此 class 还应负责在其构造函数中创建上下文。
不推荐解决方案 1,解决方案 2 对我没有帮助(至少我认为没有帮助)而且我不知道如何制定解决方案 3
在保护 GL 上下文后,将 vertices
和 mesh
更改为(智能)指针并在 main()
中构造对象。
如果您不想更改现有代码(.
到 ->
用于成员访问),您可以调用它们 verticesPtr
和 meshPtr
并创建本地在您引用它们的函数顶部引用 (Mesh& mesh = *meshPtr;
)。
我在初始化上下文之前创建对象时遇到问题。我的代码看起来像这样:
..
Vertex vertices[] = { ... } // declaration of object Vertices
Mesh mesh(vertices, sizeof(vertices)/sizeof(vertices[0]));
..
..
void onDisplay()
{
..
mesh.Draw();
..
}
void init() { .. }
int main(int argc, char** argv)
{
..
glutDisplayFunc(onDisplay);
..
}
正如我在 OpenGL site 上所读到的,问题是在初始化上下文之前创建了一个对象(由于构造函数中的代码)。如果我将 "mesh" 和 "vertices" 放在 "void init()" 中,那将解决问题,但我无法在 "void onDisplay" 中使用方法 "mesh.Draw()" - 因为object mesh 不是全局的,它只在 init() 中声明。
在 OpenGL 网站上他们讲述了如何解决这个问题,但我真的不明白我应该怎么做。
OpenGL 站点的解决方案如下:
- 不要使用 constructors/destructors 到 initialize/destroy OpenGL 对象。相反,为这些目的使用这些 classes 的成员函数。这违反了 RAII 原则,因此这不是最佳做法。
- 如果尚未创建上下文,让您的 OpenGL 对象构造函数抛出异常。这需要在您的上下文创建功能中添加一个内容,该功能会在上下文已创建并处于活动状态时告知您的代码。
- 创建一个拥有所有其他 OpenGL 相关对象的 class。此 class 还应负责在其构造函数中创建上下文。
不推荐解决方案 1,解决方案 2 对我没有帮助(至少我认为没有帮助)而且我不知道如何制定解决方案 3
在保护 GL 上下文后,将 vertices
和 mesh
更改为(智能)指针并在 main()
中构造对象。
如果您不想更改现有代码(.
到 ->
用于成员访问),您可以调用它们 verticesPtr
和 meshPtr
并创建本地在您引用它们的函数顶部引用 (Mesh& mesh = *meshPtr;
)。