【问题标题】:Using OpenGL functions in object constructor without context loaded在对象构造函数中使用 OpenGL 函数而不加载上下文
【发布时间】:2015-04-09 17:27:48
【问题描述】:

我在初始化上下文之前创建对象时遇到问题。我的代码如下所示:

..
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 上所读到的,问题是在初始化上下文之前创建了一个对象(因为构造函数中的代码)。如果我将“网格”和“顶点”放在“void init()”中,那将解决问题,但我不能在“void onDisplay”中使用方法“mesh.Draw()” - 因为对象网格不是全局的,它只在 init() 中声明。

在 OpenGL 网站上,他们讲述了如何解决此问题,但我真的不明白我应该做什么。

OpenGL 网站的解决方案如下:

  • 不要使用构造函数/析构函数来初始化/销毁 OpenGL 对象。相反,为这些目的使用这些类的成员函数。这违反了 RAII 原则,因此这不是最好的做法。
  • 如果尚未创建上下文,让您的 OpenGL 对象构造函数抛出异常。这需要在上下文创建功能中添加一个功能,以便在上下文创建并处于活动状态时告诉您的代码。
  • 创建一个拥有所有其他 OpenGL 相关对象的类。此类还应负责在其构造函数中创建上下文。

不推荐解决方案 1,解决方案 2 对我没有帮助(至少我认为不会)而且我不知道如何制作解决方案 3

【问题讨论】:

  • “但是我真的不明白我应该怎么做。”你特别不明白什么?
  • 我不理解解决方案 3。我认为解决方案 2 对我没有帮助,并且不推荐解决方案 1。
  • “我不明白解决方案 3。” 这些解决方案实际上是什么? Please edit your question 并展示建议的解决方案,以及您特别缺少的内容。指向场外资源的链接可能不会被您的问题的读者(比如我)关注。另外,如果您要精确链接(您是说这个特定的chapter 吗?)。
  • 更新了我的问题。我在谈论章节The Object Oriented Language Problem
  • 据我了解,第三种解决方案建议创建一种工厂类,负责初始化上下文,并分发需要初始化的任何其他类实例。

标签: c++ opengl glut freeglut


【解决方案1】:

在保护 GL 上下文后,将 verticesmesh 更改为(智能)指针并在 main() 中构造对象。

如果您不想更改现有代码(.-> 以获取成员访问权限),您可以调用它们 verticesPtrmeshPtr 并在顶部创建本地引用 (Mesh& mesh = *meshPtr;)您引用它们的函数。

【讨论】:

  • 所以我试图自己解决这个问题,遗憾的是没有运气。我对 C++ 真的很陌生,所以我不太了解指针以及如何使用它们。您的意思是我应该将meshvertices 的声明更改为指针:Vertex* verticesPtr[];Mesh* meshPtr; 但是我该如何在main() 中构造它们?
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多