Класс 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, 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 |
Статические члены публичного доступа
| QMatrix3x3 | sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::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, 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 на системах с little endian.
По умолчанию перестановка красного и синего каналов отключена, так как это необходимо для текстуры, присоединённой к объекту фреймбуфера или текстуре, основанной на байтовом формате QImage (например, QImage::Format_RGBA8888).
[static] QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)
Вычисляет матрицу 3x3, подходящую в качестве входных данных для blit(). Используется, когда требуется использовать только часть текстуры при выполнении 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/archives/qt-5.11/qopengltextureblitter.html