QOpenGLFramebufferObject类
QOpenGLFramebufferObject类封装了OpenGL帧缓冲对象。更多信息...
头文件 | #include <QOpenGLFramebufferObject> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake | QT += opengl |
- 包括继承成员在内的所有成员列表
- QOpenGLFramebufferObject是3D渲染的一部分。
公共类型
枚举 | Attachment { NoAttachment, CombinedDepthStencil, Depth } |
枚举 | FramebufferRestorePolicy { DontRestoreFramebufferBinding, RestoreFramebufferBindingToDefault, RestoreFrameBufferBinding } |
公共函数
QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D) | |
QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D) | |
QOpenGLFramebufferObject(const QSize &size, QOpenGLFramebufferObject::Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0) | |
QOpenGLFramebufferObject(int width, int height, QOpenGLFramebufferObject::Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0) | |
QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format) | |
QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format) | |
virtual | ~QOpenGLFramebufferObject() |
void | addColorAttachment(const QSize &size, GLenum internalFormat = 0) |
void | addColorAttachment(int width, int height, GLenum internalFormat = 0) |
QOpenGLFramebufferObject::Attachment | attachment() const |
bool | bind() |
QOpenGLFramebufferObjectFormat | format() const |
GLuint | handle() const |
int | height() const |
bool | isBound() const |
bool | isValid() const |
bool | release() |
void | setAttachment(QOpenGLFramebufferObject::Attachment attachment) |
QSize | size() const |
QList<QSize> | sizes() const |
GLuint | takeTexture() |
GLuint | takeTexture(int colorAttachmentIndex) |
GLuint | texture() const |
QList<GLuint> | textures() const |
QImage | toImage(bool flipped = true) const |
QImage | toImage(bool flipped, int colorAttachmentIndex) const |
int | width() const |
静态公共成员
bool | bindDefault() |
void | blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers, GLenum filter, int readColorAttachmentIndex, int drawColorAttachmentIndex, QOpenGLFramebufferObject::FramebufferRestorePolicy restorePolicy) |
void | blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers, GLenum filter, int readColorAttachmentIndex, int drawColorAttachmentIndex) |
void | blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) |
void | blitFramebuffer(QOpenGLFramebufferObject *target, QOpenGLFramebufferObject *source, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) |
bool | hasOpenGLFramebufferBlit() |
bool | hasOpenGLFramebufferObjects() |
详细说明
QOpenGLFramebufferObject类封装了一个OpenGL帧缓冲区对象,由GL_EXT_framebuffer_object
扩展定义。它提供了一个渲染表面,可以使用带有QPainter和QOpenGLPaintDevice的帮助进行绘制,或使用本机OpenGL调用进行渲染。这个表面可以绑定并用作您自己的OpenGL绘制代码中的常规纹理。默认情况下,QOpenGLFramebufferObject类生成一个2D OpenGL纹理(使用GL_TEXTURE_2D
目标),用作内部渲染目标。
在创建QOpenGLFramebufferObject时必须有一个活动的OpenGL上下文,否则初始化将失败。
如果想要QPainter
正确渲染,请在构造函数中指定CombinedDepthStencil附加。注意,当使用QPainter
绘制时,需要创建具有超过一个样本每像素的QOpenGLFramebufferObject以进行抗锯齿。为了创建多样本帧缓冲区对象,应使用一个接受QOpenGLFramebufferObjectFormat参数的构造函数,并将QOpenGLFramebufferObjectFormat::samples()属性设置为非零值。
对于多样本帧缓冲区对象创建一个颜色渲染缓冲区,否则创建一个具有指定纹理目标的纹理。颜色渲染缓冲区或纹理具有指定的内部格式,并绑定到帧缓冲区对象的GL_COLOR_ATTACHMENT0
附加项。
也支持多个渲染目标,在这种情况下,如果OpenGL实现支持,将存在多个纹理(或,在多样本的情况下,渲染缓冲区)。每个纹理将附加到GL_COLOR_ATTACHMENT0
、1
、2
等。
要使用已启用多样本的帧缓冲区对象作为纹理,首先需要使用QOpenGLContext::blitFramebuffer()从中复制到常规帧缓冲区对象。
可以使用QPainter和QOpenGLPaintDevice在单独的线程中将图形绘制到QOpenGLFramebufferObject。
成员类型文档
枚举 QOpenGLFramebufferObject::Attachment
此枚举类型用于在创建帧缓冲对象时配置附加到该对象的深度和模板缓冲区。
常量 | 值 | 描述 |
---|---|---|
QOpenGLFramebufferObject::NoAttachment | 0 | 不向帧缓冲对象添加附件。请注意,在没有深度或模板缓冲区的帧缓冲对象上渲染时,OpenGL的深度和模板测试将不起作用。这是默认值。 |
QOpenGLFramebufferObject::CombinedDepthStencil | 1 | 如果存在GL_EXT_packed_depth_stencil 扩展,将附加一个合并的深度和模板缓冲区。如果没有此扩展,则只附加深度缓冲区。 |
QOpenGLFramebufferObject::Depth | 2 | 附加一个深度缓冲区到帧缓冲对象。 |
另请参阅 attachment().
枚举 QOpenGLFramebufferObject::FramebufferRestorePolicy
此枚举类型用于配置在调用blitFramebuffer()时的帧缓冲绑定恢复行为。
常量 | 值 | 描述 |
---|---|---|
QOpenGLFramebufferObject::DontRestoreFramebufferBinding | 0 | 不要恢复先前的帧缓冲绑定。调用者负责跟踪和设置所需的帧缓冲绑定。 |
QOpenGLFramebufferObject::RestoreFramebufferBindingToDefault | 1 | 在blit操作后,绑定默认帧缓冲区。 |
QOpenGLFramebufferObject::RestoreFrameBufferBinding | 2 | 恢复之前绑定的帧缓冲区。这可能很昂贵,因为需要查询当前绑定的帧缓冲区。 |
另请参阅 blitFramebuffer().
成员函数文档
[显示]
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D)
创建一个OpenGL帧缓冲对象,并将一个大小为size的2D OpenGL纹理绑定到缓冲区。纹理绑定到帧缓冲对象中的GL_COLOR_ATTACHMENT0
目标。
target参数用于指定OpenGL纹理目标。默认目标为GL_TEXTURE_2D
。请注意,除非您使用OpenGL 2.0或更高版本,否则GL_TEXTURE_2D
纹理的宽度和高度必须是2的幂(例如256x512)。
默认情况下,不附加深度和模板缓冲区。可以使用重载的构造函数之一来切换此行为。
默认内部纹理格式为桌面OpenGL的GL_RGBA8
,以及OpenGL/ES的GL_RGBA
。
在创建QOpenGLFramebufferObject时,必须设置了当前的OpenGL上下文,否则初始化将失败。
另请参阅 size(),texture()和attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D)
创建一个OpenGL帧缓冲对象,并将一个2D OpenGL纹理绑定到指定的大小width和height的缓冲区。
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, QOpenGLFramebufferObject::Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0)
创建一个OpenGL帧缓冲对象,并将纹理绑定到给定的大小size的缓冲区。
“附件”参数描述深度/模板缓冲区配置,target描述纹理目标,internalFormat描述内部纹理格式。默认纹理目标是GL_TEXTURE_2D
,默认内部格式适用于桌面OpenGL为GL_RGBA8
,适用于OpenGL/ES为GL_RGBA
。
另请参阅 size(),texture()和attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, QOpenGLFramebufferObject::Attachment attachment, GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0)
构建OpenGL帧缓冲对象并将纹理绑定到给定width和height的缓冲区。
“附件”参数描述深度/模板缓冲区配置,target描述纹理目标,internalFormat描述内部纹理格式。默认纹理目标是GL_TEXTURE_2D
,默认内部格式适用于桌面OpenGL为GL_RGBA8
,适用于OpenGL/ES为GL_RGBA
。
另请参阅 size(),texture()和attachment().
QOpenGLFramebufferObject::QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format)
基于提供的format构建给定size的OpenGL帧缓冲对象。
QOpenGLFramebufferObject::QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format)
基于提供的format构建给定width和height的OpenGL帧缓冲对象。
[虚函数 noexcept]
QOpenGLFramebufferObject::~QOpenGLFramebufferObject()
销毁帧缓冲对象并释放任何已分配的资源。
void QOpenGLFramebufferObject::addColorAttachment(const QSize &size, GLenum internalFormat = 0)
创建并附加一个尺寸为size的额外纹理或渲染缓冲区。
总是有一个附加点在GL_COLOR_ATTACHMENT0。调用此函数以设置GL_COLOR_ATTACHMENT1、GL_COLOR_ATTACHMENT2等额外的附加点。
当internalFormat不为0时,指定纹理或渲染缓冲区的内部格式。否则使用默认的GL_RGBA或GL_RGBA8。
注意: 这仅在OpenGL实现支持多个渲染目标时才有效。如果不支持,该函数将不会添加任何额外的颜色附加点。在运行时调用QOpenGLFunctions::hasOpenGLFeature()并以QOpenGLFunctions::MultipleRenderTargets检查是否支持MRT。
注意: 颜色附加点的内部格式可能不同,但支持的组合可能会有所限制,具体取决于驱动程序。
注意: 颜色附加点的大小可能不同,但渲染限制在根据OpenGL规范适合所有附加点的区域。但是,一些驱动程序可能不完全符合这一规范。
void QOpenGLFramebufferObject::addColorAttachment(int width, int height, GLenum internalFormat = 0)
这是一个重载函数。
创建并附加一个尺寸为width和height的额外纹理或渲染缓冲区。
当internalFormat不为0时,指定纹理或渲染缓冲区的内部格式。否则使用默认的GL_RGBA或GL_RGBA8。
QOpenGLFramebufferObject::Attachment QOpenGLFramebufferObject::attachment() const
返回附加到此帧缓冲对象上的深度和模板缓冲区的状态。
参见setAttachment().
bool QOpenGLFramebufferObject::bind()
将渲染从默认的、由窗口管理系统提供的帧缓冲区切换到此帧缓冲对象。成功时返回 true
,否则返回 false。
注意:如果调用了takeTexture(),则会创建一个新的纹理并将其关联到帧缓冲对象。这可能会很昂贵并改变上下文状态(当前绑定的纹理)。
参见release().
[静态]
bool QOpenGLFramebufferObject::bindDefault()
将渲染切换回默认的、由窗口管理系统提供的帧缓冲区。成功时返回 true
,否则返回 false。
[静态]
void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *目标, const QRect &目标矩形, QOpenGLFramebufferObject *源, const QRect &源矩形, GLbitfield 缓冲区, GLenum 过滤器, int 读颜色附件索引, int 画颜色附件索引, QOpenGLFramebufferObject::FramebufferRestorePolicy 恢复策略)
从 源 帧缓冲对象的 源矩形矩形复制到 目标 帧缓冲对象的 目标矩形矩形。
如果 源 或 目标 为 0,则分别使用默认帧缓冲区作为源或目标。
如果 hasOpenGLFramebufferBlit() 返回 true,此函数才有效。
参数 缓冲区 应为任何组合的掩码,包括 GL_COLOR_BUFFER_BIT
、GL_DEPTH_BUFFER_BIT
和 GL_STENCIL_BUFFER_BIT
。在源和目标缓冲区中都不存在的任何缓冲区类型都将被忽略。
参数 源矩形和 目标矩形可以有不同的尺寸;在这种情况下,缓冲区 不应包含 GL_DEPTH_BUFFER_BIT
或 GL_STENCIL_BUFFER_BIT
。参数 过滤器 应设置为 GL_LINEAR
或 GL_NEAREST
,以指定在缩放时是否使用线性或最近点插值。
如果 源 等于 目标,则在同一缓冲区内执行复制。如果源和目标矩形重叠且尺寸不同,则结果是不确定的。如果任何帧缓冲对象是多重采样帧缓冲区,尺寸也必须相同。
注意:如果启用,裁剪测试将限制复制区域。
当使用多个渲染目标时,读颜色附件索引 和 画颜色附件索引 指定源和目标帧缓冲区中颜色附件的索引。
参数 恢复策略 决定在调用此函数之前应否恢复之前绑定的帧缓冲区,或者是否在返回之前绑定默认帧缓冲区,或者调用者负责跟踪和设置绑定的帧缓冲区。恢复上一个帧缓冲区可能相对昂贵,因为它涉及到对 glGetIntegerv
的调用,这可能在某些 OpenGL 驱动程序中引起管道停顿。
[静态]
void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers, GLenum filter, int readColorAttachmentIndex, int drawColorAttachmentIndex)
这是一个重载函数。
提供在两个帧缓冲区之间进行复制并恢复上一个帧缓冲区绑定的便捷重载。等同于调用blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter, readColorAttachmentIndex, drawColorAttachmentIndex, RestoreFrameBufferBinding)。
[静态]
void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, QOpenGLFramebufferObject *source, const QRect &sourceRect, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST)
这是一个重载函数。
* 提供在两个帧缓冲区之间复制的便捷重载。
[静态]
void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, QOpenGLFramebufferObject *source, GLbitfield buffers = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST)
这是一个重载函数。
提供在两个帧缓冲区之间复制的便捷重载。
QOpenGLFramebufferObjectFormat QOpenGLFramebufferObject::format() const
返回此帧缓冲区的格式。
GLuint QOpenGLFramebufferObject::handle() const
返回此帧缓冲区的OpenGL帧缓冲区句柄(由glGenFrameBuffersEXT()函数返回)。此句柄可以用来将新的图像或缓冲区附加到帧缓冲区。用户负责清理和销毁这些对象。
[静态]
bool QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()
如果本系统上存在OpenGL GL_EXT_framebuffer_blit
扩展,则返回true
;否则返回false
。
另请参阅 blitFramebuffer().
[静态]
bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()
如果本系统上存在OpenGL GL_EXT_framebuffer_object
扩展,则返回true
;否则返回false
。
int QOpenGLFramebufferObject::height() const
返回帧缓冲区附加的宽度。
bool QOpenGLFramebufferObject::isBound() const
如果帧缓冲区当前绑定到当前上下文,则返回true
;否则返回false。
bool QOpenGLFramebufferObject::isValid() const
如果帧缓冲区对象有效,则返回 true
。
如果初始化过程失败,用户将无效的缓冲区附加到帧缓冲区对象,或者如果纹理目标为 GL_TEXTURE_2D
而指定了非2的幂次的宽度/高度作为纹理大小,则帧缓冲区可能成为无效。如果OpenGL版本为2.0或更高,或者如果存在GL_ARB_texture_non_power_of_two扩展,则此非2的幂次限制不适用。
如果创建帧缓冲区的 《QOpenGLContext》 被销毁且没有其他共享的上下文可以接管帧缓冲区的所有权,则帧缓冲区也可能变得无效。
bool QOpenGLFramebufferObject::release()
将渲染切换回默认的、由窗口管理系统提供的帧缓冲区。成功时返回 true
,否则返回 false。
另请参阅 bind()。
void QOpenGLFramebufferObject::setAttachment(QOpenGLFramebufferObject::Attachment attachment)
将帧缓冲区对象的附加设置为 attachment。
这可以用来按照需要释放或重新附加深度和模板缓冲区附加项。
注意: 此函数会改变当前帧缓冲区绑定。
另请参阅 attachment().
QSize QOpenGLFramebufferObject::size() const
返回附加到此帧缓冲区对象的颜色和深度/模板缓冲区附加项的大小。
QList<QSize> QOpenGLFramebufferObject::sizes() const
返回附加到此帧缓冲区对象的所有颜色附加项的大小。
GLuint QOpenGLFramebufferObject::takeTexture()
返回附加到此帧缓冲区对象的纹理的纹理ID。纹理的所有权将转交给调用者。
如果当前帧缓冲区对象被绑定,将执行隐式的 release()。在进行下一次 bind() 调用时,将创建一个新的纹理。
如果使用多通道帧缓冲区对象,则此函数的返回值将无效。同样,不完整的帧缓冲区对象也将返回0。
另请参阅 texture(),bind() 和 release()。
GLuint QOpenGLFramebufferObject::takeTexture(int colorAttachmentIndex)
这是一个重载函数。
返回附加到此帧缓冲区对象颜色附加项索引为 colorAttachmentIndex 的纹理的纹理ID。纹理的所有权将转交给调用者。
当 colorAttachmentIndex 为 0
时,其行为与该函数的无参数变体相同。
如果当前帧缓冲区对象被绑定,将执行隐式的 release()。在进行下一次 bind() 调用时,将创建一个新的纹理。
如果使用多通道帧缓冲区对象,则此函数的返回值将无效。同样,不完整的帧缓冲区对象也将返回0。
GLuint QOpenGLFramebufferObject::texture() const
返回附加到此帧缓冲区对象的默认渲染目标的纹理的纹理ID。此纹理ID可以在您的OpenGL代码中作为普通纹理绑定。
如果使用多通道帧缓冲区对象,则该函数的返回值将无效。
当附加多个纹理时,返回值是第一个纹理的ID。
另请参阅 takeTexture() 和 textures。
QList<GLuint> QOpenGLFramebufferObject::textures() const
返回所有附加纹理的纹理ID。
如果使用多采样帧缓冲对象,则返回一个空向量。
另请参阅 takeTexture() 和 texture。
QImage QOpenGLFramebufferObject::toImage(bool flipped = true) const
以 QImage 的形式返回此帧缓冲对象的内容。
如果 flipped 为 true,则图像从 OpenGL 坐标翻转到底图坐标。如果与 QOpenGLPaintDevice 一起使用,flipped 应与 QOpenGLPaintDevice::paintFlipped 的值相反。
返回的图像格式为预乘 ARGB32 或 RGB32。后者仅在内部纹理格式设置为 GL_RGB
时使用。从 Qt 5.2 开始,如果在读取时 (A)RGB32 不受支持,则函数会回退到预乘 RGBA8888 或 RGBx8888,这包括 OpenGL ES。从 Qt 5.4 开始,如果内部格式为 RGB10_A2,则返回 A2BGR30 图像,从 Qt 5.12 开始,如果内部格式为 RGBA16,则返回 RGBA64 图像。
如果在帧缓冲区中的渲染没有考虑到预乘 Alpha,则创建一个具有非预乘格式的包装器 QImage。在进行如 QImage::save() 运算之前这是必要的,因为即使最初未预乘,图像数据也会被未预乘。
QImage fboImage(fbo.toImage()); QImage image(fboImage.constBits(), fboImage.width(), fboImage.height(), QImage::Format_ARGB32);
对于多采样帧缓冲对象,通过使用 GL_EXT_framebuffer_blit
扩展来解析样本。如果该扩展不可用,则返回图像的内容是未定义的。
对于单采样帧缓冲区,通过 glReadPixels
获取内容。这是一个潜在昂贵且低效的操作。因此推荐尽可能少使用此函数。
另请参阅 QOpenGLPaintDevice::paintFlipped。
QImage QOpenGLFramebufferObject::toImage(bool flipped, int colorAttachmentIndex) const
这是一个重载函数。
返回此帧缓冲对象索引 colorAttachmentIndex 的颜色附加端的内容,作为一个 QImage。当 flipped 设置为 true
时,此方法将图像从 OpenGL 坐标翻转到底图坐标。
注意: 此重载仅在 OpenGL 实现支持多个渲染目标时才完全正常工作。如果不支持,则将设置一个颜色附加端。
int QOpenGLFramebufferObject::width() const
返回帧缓冲对象附加的宽度。
© 2024 Qt公司有限公司。本文档中包含的文档贡献的版权属于各自的所有者。提供的文档是根据自由软件基金会发布的GNU自由文档许可协议第1.3版许可的。Qt及其相应标志是芬兰以及全球其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。