1

假设我只想绘制一个简单的 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

4 回答 4

4

通常的方法如下:

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

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

于 2013-07-12T22:20:25.703 回答
2

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

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

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

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

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

于 2013-07-13T02:13:41.350 回答
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 环境。

于 2013-07-12T22:26:22.037 回答
0

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

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

于 2013-07-13T00:19:38.760 回答