繁体   English   中英

如何在C ++中使用QAbstractOpenGLFunctions?

[英]How do you use QAbstractOpenGLFunctions in c++?

我是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类可以很好地工作。

如果您要搜索的是一种在各种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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM