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

时间:2014-05-22 02:13:34

标签: c++ qt opengl

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

这真的不可取。无论如何我可以解决这个问题吗?我应该重新考虑我的OpenGL对象的设计吗?

1 个答案:

答案 0 :(得分:3)

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

另一个选择是你在单例中保留对QOpenGLFunctions对象的引用,所以每个需要它的人都可以获得实例。虽然单身人士的使用可以争论(我真的不想开始关于单身人士的善恶的宗教辩论),但这是一个非常实际的解决方案。或者,如果您不关心隐藏您正在做的事情,可以将引用保留在全局变量中。

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

QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());

您必须小心在上下文为最新时创建实例。