你如何在c ++中使用QAbstractOpenGLFunctions?

时间:2013-10-18 18:56:46

标签: c++ opengl qt5

我是OpenGL的新手,所以这可能是一个愚蠢的问题。好像我错过了一些明显的东西。我看不出新的OpenGL classes应该如何有用。

There are classes for each version and profile of OpenGL。这些类为每个版本支持的所有OpenGL调用都有显式方法。以下是部分列表:

  • QOpenGLFunctions_1_0
  • QOpenGLFunctions_1_1
  • QOpenGLFunctions_1_2
  • QOpenGLFunctions_1_3
  • QOpenGLFunctions_1_4

我认为它将类似于以下内容:

  • 查询视频卡并询问它支持的OpenGL版本。
  • 使用QOpenGLContext :: versionFunctions()
  • 实例化最高版本的类副本

那么如何使用这个类编写代码呢?我无法预测在运行时将获得哪个对象,而不明确知道它将运行什么硬件。基类不包含任何方法,因为它们对于每个派生类都是不同的。我可以编写一个巨大的开关,但这似乎是使用QOpenGLFunctions或仅手动获取函数地址的一步。

1 个答案:

答案 0 :(得分:3)

这些类有用的原因是前面的QOpenGLFunctions类只暴露了OpenGL / ES 2.0功能。现在,他们已经展示了许多OpenGL版本的全部功能,使您可以利用仅在这些版本中提供的功能。

当然,大多数开发人员不会在运行时为大多数应用程序选择GL版本。它们针对特定版本,因此Qt类可以很好地工作。

如果您正在搜索的是一种在各种QOpenGLFunctions_ *类之间调用“常用”方法的方法,而不知道您正在使用哪个版本的OpenGL(同时仍然给自己利用特定功能的机会) “更高版本”,为什么不使用模板?

例如:

template <class T>
class SomeOpenGLRendering {
public:
    SomeOpenGLRendering(T *openglFunctions) : openglFunctions(openglFunctions) {
        openglFunctions->initializeOpenGLFunctions();
    }

    void renderSomething() {
        openglFunctions->glClear(GL_COLOR_BUFFER_BIT);
    }

private:
    T *openglFunctions;
};

然后根据您想要的任何标准(例如您所说的硬件检测),根据需要创建正确的版本:

SomeOpenGLRendering<QOpenGLFunctions_3_2_Core> r(new QOpenGLFunctions_3_2_Core());
r.renderSomething();