如何将OpenGL绘图分成类

时间:2013-07-12 21:13:18

标签: c++ opengl

说我想画一个简单的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形状的类?

4 个答案:

答案 0 :(得分:4)

通常的方式如下:

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

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

答案 1 :(得分:2)

就像少数人所说的那样,OpenGL在面向对象编程方面并不顺利,但这并不意味着它无法完成。为了更具理论性,简单地说,你可以拥有一个“网格”容器,你可以在其中循环每一帧并将每个帧渲染到屏幕上。 Render类可以被认为是状态的管理者,以及各种场景模块的容器。实际上,大多数系统都比这复杂得多,并且实现了诸如场景图之类的结构。

首先,尝试创建一个网格类和一个对象类(可能指向要绘制的网格)添加从容器中添加和删除对象的功能。每一帧,循环遍历它并渲染每个三角形(或任何你想要的任何东西),你就有了一个非常简单的OO架构。这将是一个让你入门的方法。

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

以下链接提供了有关场景图的确切内容的一些有用信息:Chapter 6 covers the scene graph

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

答案 2 :(得分:0)

您可以将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();
}

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

答案 3 :(得分:0)

OpenGL并没有真正映射到OOP范例。实现面向对象的渲染系统是完全可能的,但OpenGL API及其许多较低级别的概念非常困难,不可能投射到类中。

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