QAbstractOpenGLFunctions 类

QAbstractOpenGLFunctions 类是暴露每个 OpenGL 版本和配置文件所有函数的类的家族的基类。 更多...

公共函数

受保护的函数

详细描述

不同平台上的 OpenGL 实现能根据该平台上的 OpenGL ABI 连接到一个可变数量的 OpenGL 函数。例如,在 Microsoft Windows 只能链接到 OpenGL 1.1 的函数,其他所有函数必须在运行时解析。传统的解决这个问题的方式是使用 QOpenGLContext::getProcAddress() 或 QOpenGLFunctions。前者非常繁琐且容易出错,需要直接处理函数指针。后者仅暴露 OpenGL ES 2 和桌面 OpenGL 中的通用函数。但实际编写 OpenGL 应用程序时,还有许多具有实用性的新型 OpenGL 功能。

Qt 现在提供了一系列从 QAbstractOpenGLFunctions 继承的类,这些类通过对应的成员函数公开每一个核心 OpenGL 函数。对于每个有效的 OpenGL 版本和配置文件组合,都有一个类。每个类都遵循以下命名规范

QOpenGLFunctions_<MAJOR VERSION>_<MINOR VERSION>[_PROFILE]

对于1.0到3.0版本的OpenGL,没有配置文件,导致存在以下几种类:

其中每个类都从QAbstractOpenGLFunctions继承。

OpenGL 3.1版本移除了许多已过时的函数,导致API变得更为简洁和通用。

引入OpenGL 3.2版本后,引入了配置文件的概念。目前为OpenGL定义了两种配置文件:核心配置文件和兼容配置文件。

核心配置文件不包含OpenGL 3.1中移除的任何函数。兼容配置文件包含同一版本核心配置文件中的所有函数以及OpenGL 3.1中移除的所有函数。因此,兼容配置文件类允许使用新的OpenGL功能,同时也可以继续使用您的旧OpenGL代码。对于新的OpenGL代码,建议首选核心配置文件。

请注意,一些供应商,尤其是苹果,不实现兼容配置文件。因此,如果您希望针对macOS上的新OpenGL功能进行开发,那么您应该通过QSurfaceFormat::setProfile()请求核心配置文件上下文。

Qt为所有版本和核心及兼容配置文件组合提供了类。OpenGL版本3.1到4.3的类为:

其中每个类都从QAbstractOpenGLFunctions继承。

可以从QOpenGLVersionFunctionsFactory::get()获取对应于正在使用的OpenGL版本和配置文件的对象的指针。如果以这种方式获取,请注意,QOpenGLContext保留该对象的所有权。这样可以为实例做缓存和共享。

在调用任何公开的OpenGL函数之前,您必须确保该对象已解决了指向OpenGL函数的函数指针。这只需要使用initializeOpenGLFunctions()在实例中做一次。初始化后,该对象就可以用来调用相应版本和配置文件中的任何OpenGL函数。请注意,initializeOpenGLFunctions()在某些情况下可能失败,因此请检查返回值。初始化可能失败的情景是您有一个包含不用于解决函数指针的上下文中不包含的函数的版本或配置文件的函数对象。

如果您仅使用函数对象,那么如果您尝试使用该版本和配置文件中未包含的函数,则将在编译时得到编译错误。这显然比运行时未定义的行为更容易调试。

另请参阅QOpenGLVersionFunctionsFactory::get

成员函数文档

[protected] QAbstractOpenGLFunctions::QAbstractOpenGLFunctions()

构建一个QAbstractOpenGLFunctions对象。

[virtual noexcept] QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()

销毁一个 QAbstractOpenGLFunctions 对象。

© 2024 The Qt Company Ltd。本文件包含的文档贡献均属其各自所有者的版权。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可版本1.3许可条款提供的。Qt及相应的标志是The Qt Company Ltd在芬兰和/或其他国家/地区的商标。所有其他商标均属于其各自所有者。