Класс QOpenGLFramebufferObject
Класс QOpenGLFramebufferObject инкапсулирует объект буфера кадра OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLFramebufferObject> |
| qmake: | QT += gui |
| С момента: | Qt 5.0 |
Типы публичного доступа
| Перечисление | Attachment { НетПрикрепления, ОбъединённаяГлубинаИШаблоны, Глубина } |
Публичные функции
| QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D) | |
| QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D) | |
| QOpenGLFramebufferObject(const QSize &size, Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0) | |
| QOpenGLFramebufferObject(int width, int height, Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0) | |
| QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format) | |
| QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format) | |
| virtual | ~QOpenGLFramebufferObject() |
| void | addColorAttachment(const QSize &size, GLenum internalFormat = 0) |
| void | addColorAttachment(int width, int height, GLenum internalFormat = 0) |
| Attachment | attachment() const |
| bool | bind() |
| QOpenGLFramebufferObjectFormat | format() const |
| GLuint | handle() const |
| int | height() const |
| bool | isBound() const |
| bool | isValid() const |
| bool | release() |
| void | setAttachment(Attachment attachment) |
| QSize | size() const |
| QVector<QSize> | sizes() const |
| GLuint | takeTexture() |
| GLuint | takeTexture(int colorAttachmentIndex) |
| GLuint | texture() const |
| QVector<GLuint> | textures() const |
| QImage | toImage(bool flipped) const |
| QImage | toImage() const |
| QImage | toImage(bool flipped, int colorAttachmentIndex) const |
| int | width() const |
Статические публичные члены
| bool | bindDefault() |
| void | blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers, GLenum filter, int readColorAttachmentIndex, int drawColorAttachmentIndex) |
| void | blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) |
| void | blitFramebuffer(QOpenGLFramebufferObject *target, QOpenGLFramebufferObject *source, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) |
| bool | hasOpenGLFramebufferBlit() |
| bool | hasOpenGLFramebufferObjects() |
Подробное описание
Класс QOpenGLFramebufferObject инкапсулирует объект буфера кадра OpenGL.
Класс QOpenGLFramebufferObject инкапсулирует объект буфера кадра OpenGL, определённый расширением GL_EXT_framebuffer_object. Он предоставляет поверхность для отрисовки с помощью QPainter с помощью QOpenGLPaintDevice или для отрисовки с помощью собственных вызовов OpenGL. Эта поверхность может быть связана и использована как обычная текстура в вашем собственном коде рисования OpenGL. По умолчанию, класс QOpenGLFramebufferObject генерирует 2D OpenGL текстуру (используя целевой GL_TEXTURE_2D), которая используется как внутренняя целевая поверхность для отрисовки.
Важно иметь текущий контекст OpenGL при создании QOpenGLFramebufferObject, в противном случае инициализация завершится неудачей.
Создайте экземпляр QOpenGLFrameBufferObject с прикреплением CombinedDepthStencil, если вы хотите, чтобы QPainter правильно отображал содержимое. Обратите внимание, что для правильной антиалиасинга примитивов при отрисовке с помощью QPainter вам необходимо создать QOpenGLFramebufferObject с более чем одним образцом на пиксель. Для создания многообразного объекта буфера кадра используйте один из конструкторов, принимающих параметр QOpenGLFramebufferObjectFormat, и установите свойство QOpenGLFramebufferObjectFormat::samples() в ненулевое значение.
Для многообразных объектов буфера кадра создаётся буфер цвета, в противном случае создаётся текстура с указанным целевым параметром текстуры. Буфер цвета или текстура будут иметь указанный внутренний формат и будут привязаны к прикреплению GL_COLOR_ATTACHMENT0 в объекте буфера кадра.
Также поддерживается несколько целевых поверхностей, если реализация OpenGL это поддерживает. В этом случае будут присутствовать несколько текстур (или, в случае многообразности, буферов) и каждая из них будет прикреплена к GL_COLOR_ATTACHMENT0, 1, 2, ...
Если вы хотите использовать объект буфера кадра с включённой многообразностью как текстуру, сначала необходимо скопировать его в обычный объект буфера кадра с помощью QOpenGLContext::blitFramebuffer().
Возможна отрисовка в QOpenGLFramebufferObject с помощью QPainter и QOpenGLPaintDevice в отдельном потоке.
Документация по типам членов
enum QOpenGLFramebufferObject::Attachment
Этот тип перечисления используется для настройки буферов глубины и трафарета, прикрепленных к объекту фреймбуфера при его создании.
| Константа | Значение | Описание |
|---|---|---|
QOpenGLFramebufferObject::NoAttachment |
0 |
К объекту фреймбуфера не добавляется никакое прикрепление. Обратите внимание, что тесты OpenGL на глубину и трафарет не будут работать при отрисовке в объект фреймбуфера без буферов глубины или трафарета. Это значение по умолчанию. |
QOpenGLFramebufferObject::CombinedDepthStencil |
1 |
Если присутствует расширение GL_EXT_packed_depth_stencil, прикрепляется объединенный буфер глубины и трафарета. Если расширение отсутствует, прикрепляется только буфер глубины. |
QOpenGLFramebufferObject::Depth |
2 |
К объекту фреймбуфера прикреплен буфер глубины. |
См. также attachment().
Документация по функциям-членам
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D)
Создает объект фреймбуфера OpenGL и привязывает 2D текстуру OpenGL к буферу размером size. Текстура привязана к целевому параметру GL_COLOR_ATTACHMENT0 в объекте фреймбуфера.
Параметр target используется для указания целевого параметра OpenGL. Значение по умолчанию - GL_TEXTURE_2D. Имейте в виду, что текстуры GL_TEXTURE_2D должны иметь ширину и высоту, являющиеся степенью двойки (например, 256x512), если вы не используете OpenGL 2.0 или более позднюю версию.
По умолчанию буферы глубины и трафарета не прикреплены. Это поведение можно изменить с помощью одного из перегруженных конструкторов.
По умолчанию формат внутренней текстуры - GL_RGBA8 для настольного OpenGL и GL_RGBA для OpenGL/ES.
Важно, чтобы текущий контекст OpenGL был установлен при создании QOpenGLFramebufferObject, в противном случае инициализация завершится ошибкой.
См. также size(), texture() и attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D)
Это перегруженная функция.
Создает объект фреймбуфера OpenGL и привязывает 2D текстуру OpenGL к буферу заданной ширины и высоты.
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0)
Это перегруженная функция.
Создает объект фреймбуфера OpenGL и привязывает текстуру к буферу заданного размера.
Параметр attachment описывает конфигурацию буфера глубины/трафарета, target - целевой параметр текстуры, а internalFormat - внутренний формат текстуры. Значение по умолчанию для целевого параметра - GL_TEXTURE_2D, а для внутреннего формата - GL_RGBA8 для настольного OpenGL и GL_RGBA для OpenGL/ES.
См. также size(), texture() и attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0)
Это перегруженная функция.
Создает объект фреймбуфера OpenGL и привязывает текстуру к буферу заданной ширины и высоты.
Параметр attachment описывает конфигурацию буфера глубины/трафарета, target - целевой параметр текстуры, а internalFormat - внутренний формат текстуры. Значение по умолчанию для целевого параметра - GL_TEXTURE_2D, а для внутреннего формата - GL_RGBA8 для настольного OpenGL и GL_RGBA для OpenGL/ES.
См. также size(), texture() и attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format)
Это перегруженная функция.
Создает объект фреймбуфера OpenGL заданного размера на основе предоставленного формата.
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format)
Это перегруженная функция.
Создает объект фреймбуфера OpenGL заданной ширины и высоты на основе предоставленного формата.
[virtual] QOpenGLFramebufferObject::~QOpenGLFramebufferObject()
Удаляет объект фреймбуфера и освобождает все выделенные ресурсы.
void QOpenGLFramebufferObject::addColorAttachment(const QSize &size, GLenum internalFormat = 0)
Создает и прикрепляет дополнительную текстуру или буфер рендеринга шириной и высотой size.
В GL_COLOR_ATTACHMENT0 всегда есть прикрепление. Используйте эту функцию для настройки дополнительных прикреплений в GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 и т.д.
Если internalFormat не 0, он определяет внутренний формат текстуры или буфера рендеринга. В противном случае используется значение по умолчанию GL_RGBA или GL_RGBA8.
Примечание: Эта функция работает только при поддержке нескольких целей рендеринга реализацией OpenGL. В противном случае функция не добавит никаких дополнительных цветных прикреплений. Вызовите QOpenGLFunctions::hasOpenGLFeature() с QOpenGLFunctions::MultipleRenderTargets во время выполнения, чтобы проверить, поддерживается ли MRT.
Примечание: Внутренний формат цветовых прикреплений может отличаться, но могут быть ограничения на поддерживаемые комбинации, в зависимости от драйверов.
Примечание: Размер цветовых прикреплений может отличаться, но рендеринг ограничен областью, которая соответствует всем прикреплениям, согласно спецификации OpenGL. Некоторые драйверы могут не полностью соответствовать этому требованию.
Эта функция была добавлена в Qt 5.6.
void QOpenGLFramebufferObject::addColorAttachment(int width, int height, GLenum internalFormat = 0)
Это перегруженная функция.
Создает и прикрепляет дополнительную текстуру или буфер рендеринга размером width и height.
Если internalFormat не 0, он определяет внутренний формат текстуры или буфера рендеринга. В противном случае используется значение по умолчанию GL_RGBA или GL_RGBA8.
Эта функция была добавлена в Qt 5.6.
Attachment QOpenGLFramebufferObject::attachment() const
Возвращает состояние буферов глубины и трафарета, прикрепленных к этому объекту фреймбуфера.
См. также setAttachment().
bool QOpenGLFramebufferObject::bind()
Переключает рендеринг с буфера фреймбуфера по умолчанию, предоставляемого системным окном, на этот объект фреймбуфера. Возвращает true при успехе, false в противном случае.
Примечание: Если была вызвана takeTexture(), создается новая текстура и ассоциируется с объектом фреймбуфера. Это может быть дорогостоящим процессом и изменить состояние контекста (текущая привязанная текстура).
См. также release().
[static] bool QOpenGLFramebufferObject::bindDefault()
Переключает рендеринг обратно на буфер фреймбуфера по умолчанию, предоставляемый системным окном. Возвращает true при успехе, false в противном случае.
[static] void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers, GLenum filter, int readColorAttachmentIndex, int drawColorAttachmentIndex)
Копирует данные из прямоугольника sourceRect в объекте фреймбуфера source в прямоугольник targetRect в объекте фреймбуфера target.
Если source или target равно 0, будет использоваться буферный фрейм по умолчанию вместо объекта буфера фрейма соответственно в качестве источника или назначения.
Эта функция не будет иметь никакого эффекта, если hasOpenGLFramebufferBlit() возвращает true.
Параметр buffers должен быть маской, состоящей из любой комбинации GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, и GL_STENCIL_BUFFER_BIT. Любой тип буфера, отсутствующий как в источниковых, так и в целевых буферах, будет проигнорирован.
Прямоугольники sourceRect и targetRect могут иметь разные размеры; в этом случае buffers не должен содержать GL_DEPTH_BUFFER_BIT или GL_STENCIL_BUFFER_BIT. Параметр filter должен быть установлен на GL_LINEAR или GL_NEAREST, и определяет, использовать ли линейную или ближайшую интерполяцию при масштабировании.
Если source равно target, копирование выполняется в пределах одного и того же буфера. Результаты не определены, если прямоугольники источника и назначения перекрываются и имеют разные размеры. Размеры также должны быть одинаковыми, если любой из объектов буфера фрейма является многообразным буфером фрейма.
Примечание: Режим вырезания (scissor test) будет ограничивать область копирования (blit), если он включен.
Когда используются несколько целевых областей рендеринга, readColorAttachmentIndex и drawColorAttachmentIndex указывают индекс цветовых прикреплений в источниковых и целевых буферах фреймов.
См. также hasOpenGLFramebufferBlit().
[static] void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST)
Это перегруженная функция.
* Перегрузка для удобства копирования между двумя объектами буфера фрейма.
[static] void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, QOpenGLFramebufferObject *source, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST)
Это перегруженная функция.
Удобная перегрузка для копирования между двумя объектами буфера фрейма.
QOpenGLFramebufferObjectFormat QOpenGLFramebufferObject::format() const
Возвращает формат этого объекта буфера фрейма.
GLuint QOpenGLFramebufferObject::handle() const
Возвращает дескриптор объекта буфера фрейма OpenGL для этого объекта буфера фрейма (возвращаемый функцией glGenFrameBuffersEXT()). Этот дескриптор может использоваться для прикрепления новых изображений или буферов к буферу фрейма. Пользователь отвечает за очистку и уничтожение этих объектов.
[static] bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
Возвращает true , если расширение OpenGL GL_EXT_framebuffer_blit присутствует в этой системе; в противном случае возвращает false.
См. также blitFramebuffer().
[static] bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
Возвращает true , если расширение OpenGL GL_EXT_framebuffer_object присутствует в этой системе; в противном случае возвращает false.
int QOpenGLFramebufferObject::height() const
Возвращает высоту прикреплений объекта буфера фрейма.
bool QOpenGLFramebufferObject::isBound() const
Возвращает true , если объект буфера фрейма в настоящее время привязан к текущему контексту, в противном случае возвращается false.
bool QOpenGLFramebufferObject::isValid() const
Возвращает true , если объект буфера фрейма корректен.
Буфер фрейма может стать некорректным, если процесс инициализации завершился неудачно, пользователь прикрепил некорректный буфер к объекту буфера фрейма или указал размер текстуры, не являющийся степенью двойки, в качестве размера текстуры, если целевой объект текстуры равен GL_TEXTURE_2D. Ограничение по степени двойки не применяется, если версия OpenGL 2.0 или выше, или если расширение GL_ARB_texture_non_power_of_two присутствует.
Буфер фрейма также может стать некорректным, если QOpenGLContext, в рамках которого был создан буфер фрейма, уничтожен, и нет других общих контекстов, которые могут принять на себя управление буфером фрейма.
bool QOpenGLFramebufferObject::release()
Возвращает рендеринг обратно к буферу фрейма по умолчанию, предоставляемому системным окном. Возвращает true при успешном выполнении, false в противном случае.
См. также bind().
void QOpenGLFramebufferObject::setAttachment(Attachment attachment)
Устанавливает прикрепления объекта буфера фрейма в attachment.
Это можно использовать для освобождения или повторного прикрепления прикреплений буфера глубины и трафарета по мере необходимости.
Примечание: Эта функция изменяет текущую привязку буфера фрейма.
См. также attachment().
QSize QOpenGLFramebufferObject::size() const
Возвращает размер цветовых и глубинно-трафаретных прикреплений, прикрепленных к этому объекту буфера фрейма.
QVector<QSize> QOpenGLFramebufferObject::sizes() const
Возвращает размеры всех цветовых прикреплений, прикрепленных к этому объекту буфера фрейма.
Эта функция была введена в Qt 5.6.
GLuint QOpenGLFramebufferObject::takeTexture()
Возвращает идентификатор текстуры для текстуры, прикрепленной к этому объекту буфера фрейма. Владение текстурой передается вызывающей стороне.
Если объект буфера фрейма в настоящее время привязан, неявное release() будет выполнено. Во время следующего вызова bind() будет создана новая текстура.
Если используется многообразный объект буфера фрейма, то текстуры нет, и возвращаемое значение этой функции будет недействительным. Аналогично, неполные объекты буфера фрейма также вернут 0.
Эта функция была введена в Qt 5.3.
См. также texture(), bind() и release().
GLuint QOpenGLFramebufferObject::takeTexture(int colorAttachmentIndex)
Это перегруженная функция.
Возвращает идентификатор текстуры для текстуры, прикрепленной к цветовому прикреплению с индексом colorAttachmentIndex этого объекта буфера фрейма. Владение текстурой передается вызывающей стороне.
Когда colorAttachmentIndex равно 0, поведение идентично варианту функции без параметров.
Если объект буфера фрейма в настоящее время привязан, неявное release() будет выполнено. Во время следующего вызова bind() будет создана новая текстура.
Если используется многообразный объект буфера фрейма, то текстуры нет, и возвращаемое значение этой функции будет недействительным. Аналогично, неполные объекты буфера фрейма также вернут 0.
Эта функция была введена в Qt 5.6.
GLuint QOpenGLFramebufferObject::texture() const
Возвращает идентификатор текстуры для текстуры, прикрепленной в качестве целевой области рендеринга по умолчанию в этом объекте буфера фрейма. Этот идентификатор текстуры можно привязать как обычную текстуру в собственном коде OpenGL.
Если используется многообразный объект буфера фрейма, то возвращаемое значение этой функции будет недействительным.
Когда прикреплено несколько текстур, возвращаемое значение — ID первой из них.
См. также takeTexture() и textures().
QVector<GLuint> QOpenGLFramebufferObject::textures() const
Возвращает идентификатор текстуры для всех прикрепленных текстур.
Если используется многообразный объект буфера фрейма, возвращается пустой вектор.
Эта функция была введена в Qt 5.6.
См. также takeTexture() и texture().
QImage QOpenGLFramebufferObject::toImage(bool flipped) const
Возвращает содержимое этого объекта буфера фрейма в виде QImage.
Если flipped равно true, изображение переворачивается от координат OpenGL к координатам растра. Если используется вместе с QOpenGLPaintDevice, flipped должно быть противоположно значению QOpenGLPaintDevice::paintFlipped().
Возвращаемое изображение имеет формат premultiplied ARGB32 или RGB32. Последний используется только когда internalTextureFormat() установлен на GL_RGB.
Если рендеринг в буфере фрейма не выполнялся с учетом умножения альфа-канала наперед, создайте оберточное QImage с не-premultiplied форматом. Это необходимо перед выполнением операций, таких как QImage::save(), так как в противном случае данные изображения будут раскомпонованы, даже если они не были предварительно умножены в самом начале. Чтобы создать такой оберточный объект QImage без копирования пиксельных данных, выполните следующие действия:
QImage fboImage(fbo.toImage()); QImage image(fboImage.constBits(), fboImage.width(), fboImage.height(), QImage::Format_ARGB32);
С Qt 5.2 функция будет использовать предварительно умноженный RGBA8888 или RGBx8888 при чтении, если (A)RGB32 не поддерживается. С версии 5.4 при внутреннем формате RGB10_A2 возвращается изображение A2BGR30.
Для многовыборочных буферов фреймов выборки выполняются с помощью расширения GL_EXT_framebuffer_blit. Если расширение недоступно, содержимое возвращаемого изображения не определено.
Для одновыборочных буферов фреймов содержимое извлекается с помощью glReadPixels. Это потенциально дорогостоящая и неэффективная операция. Поэтому рекомендуется использовать эту функцию как можно реже.
См. также QOpenGLPaintDevice::paintFlipped().
QImage QOpenGLFramebufferObject::toImage() const
Это перегруженная функция.
Возвращает содержимое этого буфера фреймов как QImage. Этот метод переворачивает изображение из координат OpenGL в координаты растрового изображения.
QImage QOpenGLFramebufferObject::toImage(bool flipped, int colorAttachmentIndex) const
Это перегруженная функция.
Возвращает содержимое цветового объекта с индексом colorAttachmentIndex этого буфера фреймов как QImage. Этот метод переворачивает изображение из координат OpenGL в координаты растрового изображения, если flipped установлено в true.
Примечание: Эта перегрузка полностью функциональна только при поддержке нескольких целевых областей рендеринга реализацией OpenGL. Если это не так, будет настроен только один цветовой объект.
Функция была добавлена в Qt 5.6.
int QOpenGLFramebufferObject::width() const
Возвращает ширину прикреплений буфера фреймов.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qopenglframebufferobject.html