QOpenGLTextureBlitter 类
QOpenGLTextureBlitter 类提供了通过 OpenGL 绘制纹理四边形的便捷方式。更多...
头文件 | #include <QOpenGLTextureBlitter> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake | QT += opengl |
- 包括所有成员,包括继承的成员
- QOpenGLTextureBlitter 是 3D 渲染 的一部分。
公共类型
枚举 | 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 |
bool | supportsRectangleTarget() 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(); }
blitter 实现了 GLSL 着色器,包括 GLSL 1.00(适合 OpenGL (ES) 2.x 和 newer OpenGL 版本的兼容性配置文件)和版本 150(适合 OpenGL 3.2 及更高版本的 core profile 上下文)。
成员类型文档
枚举 QOpenGLTextureBlitter::Origin
常量 | 值 | 描述 |
---|---|---|
QOpenGLTextureBlitter::OriginBottomLeft | 0 | 表示纹理中的数据遵循OpenGL坐标系惯例,意味着Y坐标从底部到顶部。 |
QOpenGLTextureBlitter::OriginTopLeft | 1 | 表示纹理中的数据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_2D
、GL_TEXTURE_RECTANGLE
或GL_OES_EGL_image_external
之一。
void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)
使用源纹理texture执行blit操作。
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执行blit操作。
targetTransform指定应用的转换。这通常由targetTransform()辅助函数生成。
sourceTransform指定对源应用的转换。这允许仅使用源纹理的子矩形。这通常由sourceTransform()辅助函数生成。
另请参阅 sourceTransform(),targetTransform(),Origin 以及 bind。
bool QOpenGLTextureBlitter::create()
初始化用于blitter的图形资源。
如果成功返回 true
,如果失败返回 false
。失败可能发生在当前线程没有活动OpenGL上下文,或者由于某些原因着色器编译失败。
void QOpenGLTextureBlitter::destroy()
释放blitter持有的所有图形资源。假设在调用 create() 时,当前线程上的OpenGL上下文或与其共享资源的另一个上下文是当前上下文。
当blitter不在创建状态时,该函数没有任何影响。
另请参阅 create。
bool QOpenGLTextureBlitter::isCreated() const
如果 create() 已被调用且成功,则返回 true
;否则返回 false
。
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 轴方向上的方向。
bool QOpenGLTextureBlitter::supportsExternalOESTarget() const
当 bind() 接受 GL_TEXTURE_EXTERNAL_OES
作为其目标参数时返回 true
。
bool QOpenGLTextureBlitter::supportsRectangleTarget() const
当 bind() 接受 GL_TEXTURE_RECTANGLE
作为其目标参数时返回 true
。
[static]
QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target, const QRect &viewport)
计算适用于 blit 的目标变换。
target 是像素坐标的目标矩形。 viewport 描述了源尺寸并且通常设置为 (0, 0, 图像宽度, 图像高度)。
对于未缩放输出,target 和 viewport 的大小应该匹配。
另请参阅 blit()。
© 2024 The Qt Company Ltd. 这里包含的文档贡献的版权归各自所有者所有。这里提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证 version 1.3 的条款许可的。Qt 和相关标志是 The Qt Company Ltd. 在芬兰和其他国家和地区的商标。所有其他商标均为其各自所有者的财产。