C++ 如何将OpenGL图形划分为类

C++ 如何将OpenGL图形划分为类,c++,opengl,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(); 但是,我不想在主文件中有那么多杂乱的内容,而是想通过使用名为“trian

假设我只想画一个简单的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()用于设置纹理或顶点阵列。(注意:如果您的世界是由多维数据集构建的,您将创建CuberRay。)

通常的方法如下:

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

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

您可以将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代码放在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和它的许多低级概念很难,甚至不可能转换到类中


有关详细信息,请参见对类似问题的回答:

OpenGL并没有很好地映射到OOP范例中。实现一个面向对象的渲染系统是完全可能的,但是OpenGL API和它的许多低级概念很难,甚至不可能转换到类中


有关详细信息,请参见对类似问题的回答:

正如一些人所说,OpenGL不适合面向对象编程,但这并不意味着它无法实现。简单地说,理论上来说,你可以有一个“网格”容器,其中的每一帧你都循环通过并渲染到屏幕上。渲染类可以看作是状态的管理器,以及各种场景模块的容器。实际上,大多数系统都比这复杂得多,并实现场景图等结构

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

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

以下链接提供了有关场景图的一些有用信息:


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

正如一些人所说,OpenGL不适合面向对象编程,但这并不意味着它不能实现。简单地说,理论上来说,你可以有一个“网格”容器,其中的每一帧你都循环通过并渲染到屏幕上。渲染类可以看作是状态的管理器,以及各种场景模块的容器。实际上,大多数系统都比这复杂得多,并实现场景图等结构

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

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

以下链接提供了有关场景图的一些有用信息:


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

那是老式的OpenGL。为什么不使用最新的基于着色器的API?我刚刚开始使用OpenGL。。。我不知道基于着色器的API是什么。你能解释一下吗?谢谢。看起来他们用的是过量,