Класс QOpenGLTextureBlitter
Класс QOpenGLTextureBlitter предоставляет удобный способ отрисовки текстурированных квадов с помощью OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTextureBlitter> |
| qmake: | QT += gui |
| С момента: | Qt 5.8 |
Этот класс был представлен в 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) |
Подробное описание
Отрисовка текстурированных квадов, для того чтобы получить содержимое текстуры на экране, является распространённой операцией при разработке 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(). Используется, когда требуется использовать только часть текстуры при blit-опереции.
subTexture — желаемый исходный прямоугольник в пикселях, textureSize — полная ширина и высота данных текстуры. origin определяет ориентацию данных изображения относительно оси Y.
bool QOpenGLTextureBlitter::supportsExternalOESTarget() const
Возвращает true когда bind() принимает GL_TEXTURE_EXTERNAL_OES в качестве аргумента target.
[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.15/qopengltextureblitter.html