Класс QOpenGLTextureBlitter
Класс QOpenGLTextureBlitter предоставляет удобный способ отрисовки текстурированных квадов с помощью OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTextureBlitter> |
| CMake: | find_package(Qt6 COMPONENTS OpenGL REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| С тех пор: | Qt 5.8 |
Типы Public
| перечисление | Origin { OriginBottomLeft, OriginTopLeft } |
Public Функции
| QOpenGLTextureBlitter() | |
| ~QOpenGLTextureBlitter() | |
| void | bind(GLenum target = GL_TEXTURE_2D) |
| void | blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin) |
| void | blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform) |
| bool | create() |
| void | destroy() |
| bool | isCreated() const |
| void | release() |
| void | setOpacity(float opacity) |
| void | setRedBlueSwizzle(bool swizzle) |
| bool | supportsExternalOESTarget() const |
Статические Public члены
| QMatrix3x3 | sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin) |
| QMatrix4x4 | targetTransform(const QRectF &target, const QRect &viewport) |
Подробное описание
Отрисовка текстурированных квадов, чтобы получить содержимое текстуры на экране, является распространенной операцией при разработке 2D пользовательских интерфейсов. QOpenGLTextureBlitter предоставляет удобный класс, чтобы избежать повторения данных вершин, источников шейдеров, управления буферами и программами, а также вычислений матриц.
Например, подкласс QOpenGLWidget может сделать следующее, чтобы нарисовать содержимое, отображенное в буфере фреймов в позиции пикселя (x, y):
void OpenGLWidget::initializeGL()
{
m_blitter.create();
m_fbo = new QOpenGLFramebufferObject(size);
}
void OpenGLWidget::paintGL()
{
m_fbo->bind();
// update offscreen content
m_fbo->release();
m_blitter.bind();
const QRect targetRect(QPoint(x, y), m_fbo->size());
const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(0, 0), m_fbo->size()));
m_blitter.blit(m_fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
m_blitter.release();
} Блиттер реализует шейдеры GLSL как для GLSL 1.00 (подходящие для OpenGL (ES) 2.x и профилей совместимости более новых версий OpenGL), так и версии 150 (подходящие для контекстов с основным профилем OpenGL 3.2 и более новых).
Документация по типу члена
перечисление QOpenGLTextureBlitter::Origin
| Константа | Значение | Описание |
|---|---|---|
QOpenGLTextureBlitter::OriginBottomLeft |
0 |
Указывает, что данные в текстуре следуют соглашению OpenGL о системах координат, что означает, что Y изменяется снизу вверх. |
QOpenGLTextureBlitter::OriginTopLeft |
1 |
Указывает, что данные в текстуре имеют Y, изменяющийся сверху вниз, что типично для обычных, не перевернутых данных изображения. |
См. также blit().
Документация по документации функции члена
QOpenGLTextureBlitter::QOpenGLTextureBlitter()
Создает новый экземпляр QOpenGLTextureBlitter.
Примечание: никакие графические ресурсы не инициализируются в конструкторе. Это делает безопасным размещение обычных членов QOpenGLTextureBlitter в классах, поскольку фактическая инициализация, зависящая от контекста OpenGL, происходит только в create().
QOpenGLTextureBlitter::~QOpenGLTextureBlitter()
Уничтожает экземпляр.
Примечание: Когда контекст OpenGL — или контекст, разделяющий ресурсы с ним — который был текущим при вызове create(), не является текущим, графические ресурсы не будут освобождены. Поэтому рекомендуется вызывать destroy() вручную вместо того, чтобы полагаться на деструктор для выполнения очистки графических ресурсов OpenGL.
void QOpenGLTextureBlitter::bind(GLenum target = GL_TEXTURE_2D)
Связывает графические ресурсы, используемые блиттером. Это необходимо вызвать перед вызовом blit(). Следует избегать кода, изменяющего состояние OpenGL, между вызовом bind() и blit(), так как в противном случае могут возникнуть конфликты.
target — целевой тип текстуры для исходной текстуры и должен быть либо GL_TEXTURE_2D либо GL_OES_EGL_image_external.
void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)
Выполняет блит с исходной текстурой texture.
targetTransform задает применяемое преобразование. Обычно это генерируется функцией-помощником targetTransform().
sourceOrigin указывает, требуется ли переворот данных изображения. Когда texture соответствует текстуре, присоединенной к проходу FBO, передайте OriginBottomLeft. С другой стороны, когда texture основана на не перевернутых данных изображения, передайте OriginTopLeft. Это более эффективно, чем использование QImage::mirrored().
См. также targetTransform(), Origin и bind().
void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform)
Выполняет блит с исходной текстурой texture.
targetTransform задает применяемое преобразование. Обычно это генерируется функцией-помощником targetTransform().
sourceTransform задает преобразование, применяемое к источнику. Это позволяет использовать только подпрямоугольник исходной текстуры. Обычно это генерируется функцией-помощником sourceTransform().
См. также sourceTransform(), targetTransform(), Origin и bind().
bool QOpenGLTextureBlitter::create()
Инициализирует графические ресурсы, используемые блиттером.
Возвращает true при успехе, false в случае неудачи. Ошибки могут возникать, когда нет текущего контекста OpenGL в текущей нити или при неудачной компиляции шейдера по какой-либо причине.
См. также isCreated() и destroy().
void QOpenGLTextureBlitter::destroy()
Освобождает все графические ресурсы, удерживаемые блиттером. Предполагается, что контекст OpenGL или другой контекст, разделяющий ресурсы с ним, который был текущим в потоке во время вызова create(), является текущим.
Функция не имеет эффекта, когда блиттер не в созданном состоянии.
См. также create().
bool QOpenGLTextureBlitter::isCreated() const
Возвращает true, если create() был вызван и выполнился успешно. false в противном случае.
См. также create() и destroy().
void QOpenGLTextureBlitter::release()
Освобождает графические ресурсы, используемые блиттером.
См. также bind().
void QOpenGLTextureBlitter::setOpacity(float opacity)
Изменяет непрозрачность на opacity. Значение по умолчанию — 1.0.
Примечание: блиттер не изменяет состояние смешивания. От пользователя функции blit() требуется обеспечить корректные настройки смешивания.
void QOpenGLTextureBlitter::setRedBlueSwizzle(bool swizzle)
Устанавливает значение swizzle для включения/выключения перестановки красного и синего цветовых каналов. Преобразование BGRA в RGBA (происходит в шейдере на GPU, а не в медленной операции на CPU) может быть полезно, когда исходная текстура содержит данные из QImage с форматом, таким как QImage::Format_ARGB32, который соответствует BGRA на системах с малым порядком байтов.
По умолчанию перестановка красного и синего каналов отключена, так как это необходимо для текстуры, прикрепленной к объекту фреймбуфера или текстуре, основанной на формате байтового порядка QImage (например, QImage::Format_RGBA8888).
[static] QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)
Вычисляет 3x3 матрицу, подходящую в качестве входных данных для blit(). Используется при необходимости использования только части текстуры в блите.
subTexture — желаемый исходный прямоугольник в пикселях, textureSize — полная ширина и высота данных текстуры. origin определяет ориентацию данных изображения относительно оси Y.
bool QOpenGLTextureBlitter::supportsExternalOESTarget() const
Возвращает true если bind() принимает GL_TEXTURE_EXTERNAL_OES в качестве аргумента целевого объекта.
[static] QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target, const QRect &viewport)
Вычисляет матрицу преобразования целевого объекта, подходящую для blit().
target — целевой прямоугольник в пикселях. viewport описывает исходные размеры и в большинстве случаев устанавливается в (0, 0, ширина_изображения, высота_изображения).
Для выходных данных без масштабирования размеры target и viewport должны совпадать.
См. также blit().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qopengltextureblitter.html