Класс QOpenGLTextureBlitter
Класс QOpenGLTextureBlitter предоставляет удобный способ рисования текстурированных квадов с помощью OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTextureBlitter> |
| qmake: | QT += gui |
| С момента: | Qt 5.8 |
Открытые типы
| перечисление | Origin { OriginBottomLeft, OriginTopLeft } |
Открытые функции
| QOpenGLTextureBlitter() | |
| ~QOpenGLTextureBlitter() | |
| void | bind(GLenum target = GL_TEXTURE_2D) |
| void | blit(GLuint texture, const QMatrix4x4 &targetTransform, 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 |
Статические открытые члены
| QMatrix3x3 | sourceTransform(const QRectF &subTexture, const QSize &textureSize, Origin origin) |
| QMatrix4x4 | targetTransform(const QRectF &target, const QRect &viewport) |
Подробное описание
Класс QOpenGLTextureBlitter предоставляет удобный способ рисования текстурированных квадов с помощью OpenGL.
Рисование текстурированных квадов для отображения содержимого текстуры на экране — распространенная операция при разработке 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, 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 (происходящее в шейдере на графическом процессоре, а не медленным преобразованием на процессоре) может быть полезным, когда исходная текстура содержит данные из QImage с форматом, например, QImage::Format_ARGB32, который отображается как BGRA на системах с малой эндианностью.
По умолчанию перестановка красного и синего отключена, так как это необходимо для текстуры, прикреплённой к объекту фреймбуфера или текстуре на основе байтового порядка QImage (например, QImage::Format_RGBA8888).
[static] QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, const QSize &textureSize, 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-5.9/qopengltextureblitter.html