如何在 c++ 中使用 QAbstractOpenGLFunctions



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

OpenGL的每个版本和配置文件都有类。这些类具有每个版本支持的所有 OpenGL 调用的显式方法。以下是部分列表:

  • QOpenGLFunctions_1_0
  • QOpenGLFunctions_1_1
  • QOpenGLFunctions_1_2
  • QOpenGLFunctions_1_3
  • QOpenGLFunctions_1_4

我认为它会像下面这样:

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

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

这些类之所以有用,是因为之前的 QOpenGLFunctions 类只公开了 OpenGL/ES 2.0 功能。现在,他们已经公开了许多版本的OpenGL的全部功能,使您可以利用仅在这些版本中提供的功能。

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

如果您正在寻找一种在不知道您使用的是哪个版本的 OpenGL 的情况下调用各种 QOpenGLFunctions_* 类之间的"通用"方法的方法(同时仍然让自己有机会利用"更高"版本的特定功能),为什么不使用模板呢?

例如:

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();

相关内容

  • 没有找到相关文章

最新更新