在使用QOpenGLFunctions时将OpenGL功能封装在c++对象中
Encapsulating OpenGL functionality in C++ objects while using QOpenGLFunctions
我决定将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());
您只需要注意,实例是在上下文是当前的情况下创建的。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将可变参数函数的参数封装在类实例中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 封装C++模板
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 从封装在对象中的函数 C++ 返回时为空的列表
- 当要访问的对象被多次封装时,如何正确使用setter
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 如何在类中封装C/C++套接字发送和接收函数?
- 如何使用吸气剂方法实现C++封装
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 类C++友元函数无法访问封装的类
- 当从成员类调用封装的std::begin时,程序崩溃
- 从私有成员类中断封装派生的模板类
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如何修复列表视图中的错误?,封装控件时无法选择任何项
- 我们可以使用命名空间实现封装吗?
- 封装 std::vector 以允许迭代,但不允许其他内容
- lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止
- 如何使用提升范围将自定义迭代器封装在函数中