Класс QOpenGLVertexArrayObject
Класс QOpenGLVertexArrayObject оборачивает объект массива вершин OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLVertexArrayObject> |
| qmake: | QT += gui |
| С тех пор: | Qt 5.1 |
| Наследует: | QObject |
Этот класс был представлен в Qt 5.1.
Открытые типы
| класс | 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-5.14/qopenglvertexarrayobject.html