QOpenGLTextureBlitter 类

QOpenGLTextureBlitter 类提供了通过 OpenGL 绘制纹理四边形的便捷方式。更多...

头文件 #include <QOpenGLTextureBlitter>
CMakefind_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmakeQT += opengl

公共类型

枚举Origin { OriginBottomLeft, OriginTopLeft }

公共函数

QOpenGLTextureBlitter()
~QOpenGLTextureBlitter()
voidbind(GLenum target = GL_TEXTURE_2D)
voidblit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)
voidblit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform)
boolcreate()
voiddestroy()
boolisCreated() const
voidrelease()
voidsetOpacity(float opacity)
voidsetRedBlueSwizzle(bool swizzle)
boolsupportsExternalOESTarget() const
boolsupportsRectangleTarget() const

静态公共成员

QMatrix3x3sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)
QMatrix4x4targetTransform(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();
}

blitter 实现了 GLSL 着色器,包括 GLSL 1.00(适合 OpenGL (ES) 2.x 和 newer OpenGL 版本的兼容性配置文件)和版本 150(适合 OpenGL 3.2 及更高版本的 core profile 上下文)。

成员类型文档

枚举 QOpenGLTextureBlitter::Origin

常量描述
QOpenGLTextureBlitter::OriginBottomLeft0表示纹理中的数据遵循OpenGL坐标系惯例,意味着Y坐标从底部到顶部。
QOpenGLTextureBlitter::OriginTopLeft1表示纹理中的数据Y坐标从顶部到底部,这是常规未翻转图像数据的典型设置。

另请参阅 blit()。

成员函数文档

QOpenGLTextureBlitter::QOpenGLTextureBlitter()

构造一个新的QOpenGLTextureBlitter实例。

注意:构造函数中不初始化图形资源。这使得可以将QOpenGLTextureBlitter成员放入类中,因为实际的初始化(依赖于OpenGL上下文)仅发生在create()中。

[noexcept] QOpenGLTextureBlitter::~QOpenGLTextureBlitter()

销毁该实例。

注意:当调用create()时的OpenGL上下文(或与之共享资源的上下文)不是当前上下文时,图形资源将不会被释放。因此,建议手动调用destroy(),而不是依赖析构函数来执行OpenGL资源清理。

void QOpenGLTextureBlitter::bind(GLenum target = GL_TEXTURE_2D)

绑定用于blitter的图形资源。在调用blit()之前必须调用此函数。在调用bind()和blit()之间应避免修改OpenGL状态,否则可能会出现冲突。

target是源纹理的纹理目标,必须是GL_TEXTURE_2DGL_TEXTURE_RECTANGLEGL_OES_EGL_image_external之一。

另请参阅 release()和blit()。

void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)

使用源纹理texture执行blit操作。

targetTransform指定应用的转换。这通常由targetTransform()辅助函数生成。

sourceOrigin指定是否需要翻转图像数据。当texture对应于附加到FBO传递的纹理时,使用OriginBottomLeft。另一方面,当texture基于未翻转的图像数据时,传递OriginTopLeft。这比使用QImage::mirrored()更有效。

另请参阅 targetTransform()、Originbind()。

void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform)

使用源纹理texture执行blit操作。

targetTransform指定应用的转换。这通常由targetTransform()辅助函数生成。

sourceTransform指定对源应用的转换。这允许仅使用源纹理的子矩形。这通常由sourceTransform()辅助函数生成。

另请参阅 sourceTransform(),targetTransform(),Origin 以及 bind

bool QOpenGLTextureBlitter::create()

初始化用于blitter的图形资源。

如果成功返回 true,如果失败返回 false。失败可能发生在当前线程没有活动OpenGL上下文,或者由于某些原因着色器编译失败。

另请参阅 isCreated() 和 destroy

void QOpenGLTextureBlitter::destroy()

释放blitter持有的所有图形资源。假设在调用 create() 时,当前线程上的OpenGL上下文或与其共享资源的另一个上下文是当前上下文。

当blitter不在创建状态时,该函数没有任何影响。

另请参阅 create

bool QOpenGLTextureBlitter::isCreated() const

如果 create() 已被调用且成功,则返回 true;否则返回 false

另请参阅 create() 和 destroy

void QOpenGLTextureBlitter::release()

解除用于blitter的图形资源的绑定。

另请参阅 bind

void QOpenGLTextureBlitter::setOpacity(float opacity)

将不透明度更改为 opacity。默认不透明度为 1.0。

注意: blitter不会改变混合状态。确保活动正确的混合设置是由调用 blit() 的调用者负责。

void QOpenGLTextureBlitter::setRedBlueSwizzle(bool swizzle)

设置是否启用红色和蓝色颜色通道的交错 swizzle。源纹理包含从类似 QImage 的格式(如 QImage::Format_ARGB32)类型的 QImage 的数据时,BGRA 到 RGBA 的转换(在GPU上的着色器中发生,而不是在缓慢的CPU端转换)可能很有用。

默认情况下禁用红色-蓝色交错,因为在将纹理附加到帧缓冲对象或基于字节排序的 QImage 格式(如 QImage::Format_RGBA8888)的纹理时需要。

[静态] QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)

计算一个3x3矩阵,该矩阵适合作为 blit() 的输入。这在仅为blit使用纹理的一部分时使用。

subTexture 是以像素为单位的所需源矩形,textureSize 是纹理数据的完整宽度和高度。 origin 指定了图像数据在 Y 轴方向上的方向。

另请参阅 blit() 和 Origin

bool QOpenGLTextureBlitter::supportsExternalOESTarget() const

bind() 接受 GL_TEXTURE_EXTERNAL_OES 作为其目标参数时返回 true

另请参阅 bind() 和 blit

bool QOpenGLTextureBlitter::supportsRectangleTarget() const

bind() 接受 GL_TEXTURE_RECTANGLE 作为其目标参数时返回 true

另请参阅 bind() 和 blit

[static] QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target, const QRect &viewport)

计算适用于 blit 的目标变换。

target 是像素坐标的目标矩形。 viewport 描述了源尺寸并且通常设置为 (0, 0, 图像宽度, 图像高度)。

对于未缩放输出,targetviewport 的大小应该匹配。

另请参阅 blit()。

© 2024 The Qt Company Ltd. 这里包含的文档贡献的版权归各自所有者所有。这里提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证 version 1.3 的条款许可的。Qt 和相关标志是 The Qt Company Ltd. 在芬兰和其他国家和地区的商标。所有其他商标均为其各自所有者的财产。