如何将OpenGL绘图分离为类
How to separate OpenGL drawing into classes
假设我只想画一个简单的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
- C++:如何读取分离变量,然后读取向量
- 分离一个静态常量 std::thread?
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 如何在 c++ 中将数据与文件流分离
- 为什么堆栈和堆在内存中分离得如此之多?
- 具有可分离内核的 2D 模糊卷积
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- GTKMM:拍摄绘图区域的屏幕截图?
- 防止编译器分离函数的指令
- GTKMM:如何将键盘事件附加到绘图区域?
- 分离库的主机端和 CUDA 设备端版本
- C++将文件行分离为String和Int
- 分离类所有权和使用,生成最佳(快速)代码
- 动态空间分离C++程序中的输入
- 如何从几乎排序的链表中分离放错位置的元素?
- 检查分离的线程是否还活着?
- OpenGL:使用实例化绘图与我正在绘制的帧缓冲进行绘制
- 真的需要在 .h 和 .cpp 文件中分离 c++ 结构吗?
- 为什么分离线程没有得到输出消息
- 如何将OpenGL绘图分离为类