如何将OpenGL绘图分离为类

How to separate OpenGL drawing into classes

本文关键字:分离 绘图 OpenGL      更新时间:2023-10-16

假设我只想画一个简单的OpenGL三角形。我知道我可以在主文件中画一个三角形,在那里我所有的OpenGL东西都是通过沿着的线来设置的

glBegin( GL_TRIANGLES );
    glVertex3f( 0.0f, 1.0f, 0.0f );
    glVertex3f( -1.0f,-1.0f, 0.0f );
    glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();

但是,与其在我的主文件中有那么多混乱,我想通过使用一个名为"triangle"的类和一个"draw"函数来绘制一个三角形,所以我的代码看起来像这样:

Triangle TheTriangle;
TheTriangle.draw();

简言之,如何使用OpenGL图形创建一个类,这些图形可以通过使用函数绘制?

通常的方式如下:

TriangleArray tri;
tri.push_back(...);
tri.prepare();
while(1) {
  clear();
  tri.draw();
  swapbuffers();
}

但通常同一个类应该处理对象数组,而不仅仅是一个对象。所以TriangleArray是一个很好的类名。prepare()用于设置纹理或顶点数组。(注意:如果你的世界是由多维数据集构建的,你会创建CubeArray。)

正如一些人所说,OpenGL在面向对象编程方面做得不好,但这并不意味着它不能做到。为了更具理论性,简单地说,你可以有一个"网格"容器,在其中你循环通过的每一帧都会渲染到屏幕上。Render类可以被认为是状态的管理器,以及各种场景模块的容器。事实上,大多数系统都比这复杂得多,并且实现了诸如场景图之类的结构。

若要开始,请尝试创建一个网格类和一个对象类(可能指向要绘制的网格)添加添加功能以添加和删除容器中的对象。每一帧,循环通过它并渲染每个三角形(或任何其他你想要的),你就有了一个非常简单的OO体系结构。这将是让你开始的一种方式。

用OOP包装功能性很强的体系结构是很正常的,但你已经习惯了,如果做得正确,它可以使你的代码更易于维护和扩展。话虽如此,我给出的例子非常简单,所以这里有一个架构,一旦你了解了它,你可能会想要探索它。

以下链接提供了一些关于场景图究竟是什么的有用信息:第6章介绍了场景图

这是一个非常强大的体系结构,它将允许您以非常复杂和高效的方式(如果您利用这些优势的话)对场景进行分区和排序。还有很多其他技术,但我发现这是游戏开发者最强大的技术。这完全取决于你想要创建的应用程序类型。尽管如此,我还是不建议制作一个完全面向对象的渲染器。根据您的应用程序,OO场景图可能就足够了。不管怎样,祝你好运!

您只需将OpenGL代码放入Triangle::draw()函数:

void Triangle::draw() {
    glBegin( GL_TRIANGLES );
        glVertex3f( 0.0f, 1.0f, 0.0f );
        glVertex3f( -1.0f,-1.0f, 0.0f );
        glVertex3f( 1.0f,-1.0f, 0.0f);
    glEnd();
}

当然,这假设您已经在Triangle类中正确地声明了draw()方法,并且您已经初始化了OpenGL环境。

OpenGL并没有很好地映射到OOP范式中。实现面向对象的渲染系统是完全可能的,但OpenGL API及其许多较低级别的概念非常困难,无法转换到类中。

有关详细信息,请参阅类似问题的答案:https://stackoverflow.com/a/12091766/524368