在使用QOpenGLFunctions时将OpenGL功能封装在c++对象中

Encapsulating OpenGL functionality in C++ objects while using QOpenGLFunctions

本文关键字:封装 c++ 对象 功能 OpenGL QOpenGLFunctions 时将      更新时间:2023-10-16

我决定将Qt集成到我的OpenGL项目中。到目前为止,我已经使用原始的OpenGL调用来制作纹理,制作帧缓冲区,绘制东西等。问题是OpenGL调用隐藏在对象中,比如纹理对象。例如,你可以在纹理对象的构造函数中给它一个字符串路径,然后该对象会自动从文件中加载纹理数据并使用它创建一个OpenGL纹理(显然是使用OpenGL函数这样做的)。由于QOpenGLFunctions本身是一个对象,我要么必须限制这些调用的位置,要么将对它的引用传递给我的项目中使OpenGL函数调用的每个对象。

这真的是不可取的。有什么办法能让我避开这个吗?我应该重新考虑我的OpenGL对象的设计吗?

您有几个选择。我个人认为,将渲染代码本地化到软件的有限部分通常是可取的。显式地将QOpenGLFunctions对象传递给需要它的类,使您能够明确哪些类进行呈现,并对其保持一定程度的控制。除非它在您的特定架构中变得太麻烦,否则这可能是我的首选。

另一种选择是在单例中保持对QOpenGLFunctions对象的引用,这样需要它的每个人都可以获得实例。虽然可以对单例的使用进行争论(我真的不想开始一场关于单例的善或恶的宗教辩论),但这是一个非常实用的解决方案。或者,如果你不在乎隐藏你真正在做什么,你可以把引用保存在一个全局变量中。

据我所知,从Qt文档(http://qt-project.org/doc/qt-5/qopenglfunctions.html)中可以看出,创建多个实例也是完全合法的。看起来实例不包含任何状态。所以当你构造任何需要OpenGL渲染的对象时,你可以创建一个实例,并将它保存在一个成员变量中。下面的代码片段展示了如何在文档页面上创建一个新实例:

QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());

您只需要注意,实例是在上下文是当前的情况下创建的。