Класс 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, который encapsulates состояние, необходимое для задания данных атрибутов вершин по отдельности в конвейере OpenGL. Другими словами, VAO запоминает состояние объектов буфера (см. QOpenGLBuffer) и их связанное состояние (например, делители атрибутов вершин). Это позволяет очень просто и эффективно переключаться между состояниями буферов OpenGL для рендеринга различных «объектов» в сцене. Класс QOpenGLVertexArrayObject — тонкий wrapper вокруг объекта VAO OpenGL.
Для настольных систем 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.15/qopenglvertexarrayobject.html