Класс QOpenGLVertexArrayObject
Класс QOpenGLVertexArrayObject оборачивает объект массива вершин OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLVertexArrayObject> |
| CMake: | find_package(Qt6 COMPONENTS OpenGL REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| С момента: | Qt 5.1 |
| Наследует: | QObject |
Публичные типы
| класс | Binder |
Публичные функции
| QOpenGLVertexArrayObject(QObject *parent = nullptr) | |
| virtual | ~QOpenGLVertexArrayObject() |
| void | bind() |
| bool | create() |
| void | destroy() |
| bool | isCreated() const |
| GLuint | objectId() const |
| void | release() |
Подробное описание
Объект массива вершин (VAO) — это контейнерный объект OpenGL, который инкапсулирует состояние, необходимое для указания данных атрибутов каждой вершины в конвейере OpenGL. Другими словами, VAO запоминает состояния объектов буферов (см. QOpenGLBuffer) и их связанное состояние (например, делители атрибутов вершин). Это позволяет очень просто и эффективно переключаться между состояниями буферов OpenGL для визуализации разных «объектов» в сцене. Класс QOpenGLVertexArrayObject — это тонкий обёртный класс вокруг OpenGL VAO.
Для настольных систем VAO поддерживаются как основная функция в OpenGL 3.0 или более поздних версиях и GL_ARB_vertex_array_object для более старых версий. В OpenGL ES 2 VAO предоставляются дополнительным расширением GL_OES_vertex_array_object. Вы можете проверить версию OpenGL с помощью QOpenGLContext::surfaceFormat() и проверить наличие расширений с помощью QOpenGLContext::hasExtension().
Как и в других классах Qt OpenGL, в QOpenGLVertexArrayObject есть функция create() для создания базового объекта OpenGL. Это позволяет разработчику гарантировать наличие допустимого текущего контекста OpenGL в данный момент.
После успешного создания VAO типичный шаблон использования выглядит следующим образом:
- В функции инициализации сцены для каждого визуального объекта:
- Привязать VAO
- Установить состояние данных вершин для этого визуального объекта (вершины, нормали, координаты текстур и т. д.)
- Отвязать (release()) VAO
- В функции отрисовки для каждого визуального объекта:
- Привязать VAO (и программу шейдера, если необходимо)
- Вызвать функцию glDraw*()
- Отвязать (release()) VAO
Привязка VAO в функции отрисовки восстанавливает все состояния данных вершин, настроенные на стадии инициализации. Таким образом, мы можем установить множество состояний при настройке VAO и эффективно переключаться между наборами состояний объектов, которые будут отрисовываться. Использование VAO также позволяет драйверу OpenGL оптимизировать проверки данных вершин.
Примечание: Объекты массивов вершин, как и все другие контейнерные объекты OpenGL, специфичны для контекста, для которого они были созданы, и не могут быть совмещены между группами контекстов.
См. также QOpenGLVertexArrayObject::Binder и QOpenGLBuffer.
Документация по функциям-членам
QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)
Создаёт QOpenGLVertexArrayObject с указанным parent. Вы должны вызвать create() с допустимым контекстом OpenGL перед использованием.
[virtual] QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()
Удаляет QOpenGLVertexArrayObject и базовый ресурс OpenGL.
void QOpenGLVertexArrayObject::bind()
Привязывает этот объект массива вершин к точке привязки OpenGL. С этого момента и до тех пор, пока не будет вызвано release() или привязано другой объект массива вершин, любые изменения, внесенные в состояние данных вершин, хранятся в этом объекте массива вершин.
Если затем будет привязан другой объект массива вершин, вы сможете позже восстановить набор состояний, связанных с этим объектом, вызвав bind() для этого объекта ещё раз. Это позволяет эффективно изменять состояния данных вершин в функциях отрисовки.
bool QOpenGLVertexArrayObject::create()
Создаёт базовый объект массива вершин OpenGL. Для успешного выполнения этой функции должен быть допустимый контекст OpenGL, поддерживающий объекты массивов вершин.
Возвращает true если объект массива вершин OpenGL был успешно создан.
Если возвращаемое значение false, поддержка объектов массивов вершин недоступна. Это не ошибка: на системах с OpenGL 2.x или OpenGL ES 2.0 объекты массивов вершин могут не поддерживаться. Приложение может продолжить выполнение в этом случае, но тогда оно должно быть готово к работе и без VAO. Это означает, что вместо простого вызова bind() необходимо проверить значение isCreated(), и массивы вершин должны быть инициализированы традиционным способом, когда объект массива вершин отсутствует.
См. также isCreated().
void QOpenGLVertexArrayObject::destroy()
Удаляет базовый объект массива вершин OpenGL. Для успешного выполнения этой функции должен быть допустимый контекст OpenGL, поддерживающий объекты массивов вершин.
bool QOpenGLVertexArrayObject::isCreated() const
Возвращает true если базовый объект массива вершин OpenGL был создан. Если это возвращает true и связанный контекст OpenGL является текущим, то вы можете bind() этот объект.
GLuint QOpenGLVertexArrayObject::objectId() const
Возвращает идентификатор базового объекта массива вершин OpenGL.
void QOpenGLVertexArrayObject::release()
Отвязывает этот объект массива вершин, привязав по умолчанию объект массива вершин (id = 0).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qopenglvertexarrayobject.html