Класс 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 Core путём соответствующей функции-члена. Существует класс для каждой допустимой комбинации версии и профиля 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/archives/qt-5.6/qabstractopenglfunctions.html