Класс QAbstractOpenGLFunctions
Класс QAbstractOpenGLFunctions является базовым классом семейства классов, которые экспонируют все функции для каждой версии и профиля OpenGL. Подробнее...
Открытые функции
| виртуальный | ~QAbstractOpenGLFunctions() |
Защищенные функции
| 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]
Для версий OpenGL от 1.0 до 3.0 нет профилей, что приводит к классам:
- 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
где каждый класс наследуется от QAbstractOpenGLFunctions.
В версии OpenGL 3.1 было удалено много устаревших функций, что привело к гораздо более простому и общему API.
В OpenGL 3.2 было введено понятие профилей. В настоящее время определены два профиля для OpenGL: Core и Compatibility.
Профиль Core не включает ни одной из функций, которые были удалены в OpenGL 3.1. Профиль Compatibility содержит все функции в профиле Core той же версии плюс все функции, которые были удалены в OpenGL 3.1. Таким образом, классы профиля Compatibility позволяют использовать новые возможности OpenGL, но также позволяют использовать ваш устаревший код OpenGL. Для нового кода OpenGL следует предпочитать профиль Core.
Обратите внимание, что некоторые поставщики, в частности Apple, не реализуют профиль Compatibility. Поэтому, если вы хотите ориентироваться на новые возможности OpenGL на macOS, необходимо убедиться, что вы запрашиваете контекст профиля Core с помощью QSurfaceFormat::setProfile().
Qt предоставляет классы для всех комбинаций версий и профилей Core и Compatibility. Классы для версий OpenGL с 3.1 до 4.3:
- QOpenGLFunctions_3_1
- QOpenGLFunctions_3_2_Core
- QOpenGLFunctions_3_2_Compatibility
- QOpenGLFunctions_3_3_Core
- QOpenGLFunctions_3_3_Compatibility
- QOpenGLFunctions_4_0_Core
- QOpenGLFunctions_4_0_Compatibility
- QOpenGLFunctions_4_1_Core
- QOpenGLFunctions_4_1_Compatibility
- QOpenGLFunctions_4_2_Core
- QOpenGLFunctions_4_2_Compatibility
- QOpenGLFunctions_4_3_Core
- QOpenGLFunctions_4_3_Compatibility
где каждый класс наследуется от QAbstractOpenGLFunctions.
Указатель на объект класса, соответствующего версии и профилю используемого OpenGL, можно получить из QOpenGLContext::versionFunctions(). Если он получен таким образом, обратите внимание, что QOpenGLContext сохраняет владение объектом. Это необходимо для того, чтобы создавать только один экземпляр.
Перед вызовом любой из экспонированных функций OpenGL необходимо убедиться, что объект разрешил указатели на функции OpenGL. Это необходимо сделать только один раз на каждый экземпляр с помощью initializeOpenGLFunctions(). После инициализации объект можно использовать для вызова любой функции OpenGL для соответствующей версии и профиля. Обратите внимание, что initializeOpenGLFunctions() может завершиться неудачей в некоторых случаях, поэтому проверьте значение возврата. Ситуации, в которых инициализация может завершиться неудачей, это если у вас есть функции-объекты для версии или профиля, которые содержат функции, не являющиеся частью используемого контекста для разрешения указателей на функции.
Если вы исключительно используете объекты функций, то получите ошибки компиляции, если попытаетесь использовать функцию, не включенную в эту версию и профиль. Это, очевидно, гораздо проще отладить, чем неопределенное поведение во время выполнения.
См. такжеQOpenGLContext::versionFunctions().
Документация по функциям-членам
[protected] QAbstractOpenGLFunctions::QAbstractOpenGLFunctions()
Конструирует объект QAbstractOpenGLFunctions.
[virtual] QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()
Удаляет объект QAbstractOpenGLFunctions.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qabstractopenglfunctions.html