面向对象的编程和OpenGL

时间:2011-07-10 13:56:54

标签: c++ opengl graphics glut

我想将OpenGL用作我项目的图形。但我真的想以一种好的风格做到这一点。如何为每个类声明一个成员函数“draw()”以在OpenGL显示函数中调用它?

例如,我想要这样的事情:

class Triangle
{
    public:
        void draw()
        {
           glBegin(GL_TRIANGLES);
              ...
           glEnd();
        }
};

4 个答案:

答案 0 :(得分:2)

嗯,这也取决于你有多少时间和需要。不过,你的方法并不坏,有点过时了。现代OpenGL使用着色器,但我想这不属于你的(学校?)项目。为了这个目的,对于初学者来说,你的方法应该完全没问题

除了着色器,如果你想进一步发展,你也可以朝着使用更通用的polygon对象的方向前进,只需存储一个顶点列表并将其与一个单独的'Renderer'类相结合。能够渲染由三角形组成的多边形。代码如下所示:

renderer.draw(triangle);

当然,多边形可以有一些额外的属性,如颜色,纹理,透明度等。您还可以拥有一些更具体的多边形类,如TriangleStripTriangleFan等。然后,您需要做的就是在OpenGL draw()中编写一个通用Renderer方法,该方法将能够设置所有状态并将顶点推送到渲染管道。

答案 1 :(得分:1)

当我在攻读博士学位时,我写了一个模拟器来做你想做的事。请记住,即使您的代码看起来像面向对象,OpenGL引擎仍然会按顺序呈现内容。此外,矩阵algrebra的顺序性质,在OpenGL的引擎盖下,有时与逻辑思考的顺序不同(我何时翻译,何时绘制,何时旋转等等?)。

过去记得LOGO吗?它有一只乌龟,它是一支笔,你移动了乌龟,它会绘制线条。如果笔下来,它会画,如果笔是向上的,它没有。这就是我在这个项目上工作时的心态。我会在一个熟悉的坐标(0,0,0)处启动“乌龟”,并使用数学来翻译它(将它移动到我想要绘制的对象的中心),然后调用draw()方法你我试图根据“乌龟”的相对坐标系来绘制我的形状,而不是绝对的(0,0,0)。然后我会移动,乌龟,画画等。希望有帮助...

答案 2 :(得分:1)

不,它不会像这样工作。问题是GLUT显示功能正好是一个功能。因此,如果您想绘制一堆三角形,您仍然只能将其中一个draw()函数注册为GLUT显示函数。 (此外,指向C ++中的成员函数的指针也是一个难题。)

如上所述,请转到专用的Renderer类。该类将了解应用程序中的所有可绘制对象。

class Renderer {
   std::list<Drawable> _objects;

   public:
      drawAllObjects() {
         // iterate through _objects and call the respective draw() functions
      }
};

您的GLUT显示函数将是一个静态函数,在(全局或非全局)渲染器对象上调用drawAllObjects()。

答案 3 :(得分:0)

啊,好老的立即模式OpenGL。 :)这个例程看起来不错。

我可能会将'draw'方法设为虚拟,但是继承自'Drawable'基类型,它指定了这些类的方法。