Класс 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) | |
| виртуальный | ~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
- Задайте состояние данных вершин для данного визуального объекта (вершины, нормали, текстурные координаты и т. д.)
- Отключите VAO (release())
- В функции рендеринга для каждого визуального объекта:
- Привяжите VAO (и программу шейдеров, если необходимо)
- Вызовите функцию glDraw*()
- Отключите VAO (release())
Привязка 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.0/qopenglvertexarrayobject.html