QAbstractOpenGLFunctions类是一系列类的基类,它们公开每个OpenGL版本和配置文件的所有函数。
头文件:#include
qmake:QT += gui
开始引入:Qt5.1
被继承:QOpenGLFunctions_1_0, QOpenGLFunctions_1_1, QOpenGLFunctions_1_2, QOpenGLFunctions_1_3, QOpenGLFunctions_1_4, QOpenGLFunctions_1_5, QOpenGLFunctions_2_0, QOpenGLFunctions_2_1, QOpenGLFunctions_3_0, QOpenGLFunctions_3_1, QOpenGLFunctions_3_2_Compatibility, QOpenGLFunctions_3_2_Core, QOpenGLFunctions_3_3_Compatibility, QOpenGLFunctions_3_3_Core, QOpenGLFunctions_4_0_Compatibility, QOpenGLFunctions_4_0_Core, QOpenGLFunctions_4_1_Compatibility, QOpenGLFunctions_4_1_Core, QOpenGLFunctions_4_2_Compatibility, QOpenGLFunctions_4_2_Core, QOpenGLFunctions_4_3_Compatibility, QOpenGLFunctions_4_3_Core, QOpenGLFunctions_4_4_Compatibility, QOpenGLFunctions_4_4_Core, QOpenGLFunctions_4_5_Compatibility, QOpenGLFunctions_4_5_Core, and QOpenGLFunctions_ES2
不同平台上的OpenGL实现能够链接到可变数量的OpenGL函数,具体取决于该平台上的OpenGL ABI。 例如,在Microsoft Windows上,只有OpenGL 1.1中的功能可以在构建时链接到。 必须在运行时解析所有其他函数。 传统的解决方案是使用QOpenGLContext :: getProcAddress()或QOpenGLFunctions。 前者繁琐且容易出错,意味着直接处理函数指针。 后者仅暴露了OpenGL ES 2和桌面OpenGL常用的功能。 然而,在编写真实世界的OpenGL应用程序时,有许多新的OpenGL功能非常有用。
Qt现在提供了一系列类,它们都继承自QAbstractOpenGLFunctions,它们通过相应的成员函数公开每个核心OpenGL函数。 每个有效的OpenGL版本和配置文件组合都有一个类。 每个类遵循命名约定:
QOpenGLFunctions__[_PROFILE]
对于OpenGL版本1.0到3.0,没有配置文件,导致类:
其中每个类都继承自QAbstractOpenGLFunctions。
OpenGL 3.1版删除了许多已弃用的函数,从而导致更简单和通用的API。
使用OpenGL 3.2,引入了概要文件的概念。 目前为OpenGL定义了两个配置文件:核心和兼容性。
Core配置文件不包含在OpenGL 3.1中删除的任何功能。 兼容性配置文件包含相同版本的Core配置文件中的所有函数以及在OpenGL 3.1中删除的所有函数。 通过这种方式,兼容性配置文件类允许使用更新的OpenGL功能,但也允许您继续使用旧的OpenGL代码。 对于新的OpenGL代码,应首选Core配置文件。
请注意,某些供应商(尤其是Apple)未实施兼容性配置文件。 因此,如果您希望在OS X上定位新的OpenGL功能,那么您应该确保通过QSurfaceFormat :: setProfile()请求Core配置文件上下文。
Qt提供所有版本以及核心和兼容性配置文件组合的类。 OpenGL版本3.1到4.3的类是:
其中每个类都继承自QAbstractOpenGLFunctions。
可以从QOpenGLContext :: versionFunctions()获得指向与正在使用的OpenGL的版本和配置文件对应的类的对象的指针。 如果以这种方式获得,请注意QOpenGLContext保留对象的所有权。 这样只需要创建一个实例。
在调用任何公开的OpenGL函数之前,必须确保对象已经解析了OpenGL函数的函数指针。 这只需要使用initializeOpenGLFunctions()为每个实例执行一次。 初始化后,该对象可用于调用相应版本和配置文件的任何OpenGL函数。 请注意,initializeOpenGLFunctions()在某些情况下可能会失败,因此请检查返回值。 初始化失败的情况是,如果您的版本或配置文件的函数对象包含的函数不是用于解析函数指针的上下文的一部分。
如果您专门使用函数对象,那么如果您尝试使用该版本和配置文件中未包含的函数,则会出现编译时错误。 这显然比运行时的未定义行为更容易调试。
一、成员函数
[protected] QAbstractOpenGLFunctions::QAbstractOpenGLFunctions()
构造一个QAbstractOpenGLFunctions对象。
[virtual] QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()
销毁QAbstractOpenGLFunctions对象。