class QOpenGLFramebufferObject#

QOpenGLFramebufferObject 类封装了 OpenGL 图像缓冲区对象。更多…

概要

方法

静态函数#

注意

此文档可能包含从 C++ 自动翻译到 Python 的代码片段。我们始终欢迎对片段翻译的贡献。如果您在翻译中发现问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建工单的方式来告知我们。

详细描述#

QOpenGLFramebufferObject 类封装了 OpenGL 纹理缓冲对象,由 GL_EXT_framebuffer_object 扩展定义。它提供了一个可以由 QOpenGLPaintDevice 和 QPainter 在协助下绘制的渲染表面,或者使用本机 OpenGL 调用渲染。该表面可以绑定并作为您自己的 OpenGL 绘图代码中的常规纹理使用。默认情况下,QOpenGLFramebufferObject 类生成一个 2D OpenGL 纹理(使用 GL_TEXTURE_2D 目标),这作为内部渲染目标。

创建 QOpenGLFramebufferObject 时,必须有一个当前有效的 OpenGL 上下文,否则初始化将失败。

如果您想使 QPainter 正确渲染,则需要使用 CombinedDepthStencil 附件创建 QOpenGLFramebufferObject 实例。请注意,您需要创建一个具有每个像素多个样本的 QOpenGLFramebufferObject,这样使用 QPainter 绘制时原始图形才能抗锯齿。要创建多样本帧缓冲区对象,您应使用包含 QOpenGLFramebufferObjectFormat 参数的构造函数之一,并将 samples() 属性设置为非零值。

对于多样本帧缓冲区对象,将创建一个颜色渲染缓冲区,否则将创建一个指定的纹理目标的纹理。颜色渲染缓冲区或纹理将具有指定的内部格式,并将绑定到帧缓冲区中的 GL_COLOR_ATTACHMENT0 附件。

还支持多个渲染目标,如果 OpenGL 实现支持此功能。这里将存在多个纹理(或者在多采样的情况下,渲染缓冲区),并且每个都将附加到 GL_COLOR_ATTACHMENT012、…。

如果您想将启用多采样的帧缓冲区对象用作纹理,首先需要使用 blitFramebuffer() 从它传到常规帧缓冲区对象。

您可以在单独的线程中使用 QPainter 和 QOpenGLPaintDeviceQOpenGLFramebufferObject 中绘制。

class Attachment#

此枚举类型用于配置创建帧缓冲区对象时附加到帧缓冲区的深度和模板缓冲区。

常量

描述

QOpenGLFramebufferObject.NoAttachment

没有将附加物添加到帧缓冲对象中。注意,在将渲染发送到没有任何深度或模板缓冲区的帧缓冲对象时,OpenGL的深度和模板测试将不会工作。这是默认值。

QOpenGLFramebufferObject.CombinedDepthStencil

如果存在GL_EXT_packed_depth_stencil扩展,将附加一个组合的深度和模板缓冲区。如果该扩展不存在,则仅附加深度缓冲区。

QOpenGLFramebufferObject.Depth

将深度缓冲区附加到帧缓冲对象。

另请参阅

attachment()

FramebufferRestorePolicy#

此枚举类型用于配置与调用blitFramebuffer()时恢复帧缓冲区绑定相关的行为。

常量

描述

QOpenGLFramebufferObject.DontRestoreFramebufferBinding

不要恢复之前的帧缓冲区绑定。调用者负责跟踪和设置帧缓冲区绑定,如需。

QOpenGLFramebufferObject.RestoreFramebufferBindingToDefault

在blit操作完成后,绑定默认帧缓冲区。

QOpenGLFramebufferObject.RestoreFrameBufferBinding

恢复之前绑定的帧缓冲区。这可能会非常昂贵,因为这需要查询当前绑定的帧缓冲区。

另请参阅

blitFramebuffer()

__init__(size, format)#
参数:
__init__(size, attachment[, target=GL_TEXTURE_2D[, internalFormat=0]])
参数:
  • sizeQSize

  • attachmentAttachment

  • target – int

  • internalFormat – int

__init__(width, height[, target=GL_TEXTURE_2D])
参数:
  • width – int

  • height – int

  • target – int

__init__(width, height, format)
参数:
__init__(width, height, attachment[, target=GL_TEXTURE_2D[, internalFormat=0]])
参数:
  • width – int

  • height – int

  • attachmentAttachment

  • target – int

  • internalFormat – int

__init__(size[, target=GL_TEXTURE_2D])
参数:
  • sizeQSize

  • target – int

addColorAttachment(size[, internalFormat=0])#
参数:
  • sizeQSize

  • internalFormat – int

addColorAttachment(width, height[, internalFormat=0])
参数:
  • width – int

  • height – int

  • internalFormat – int

attachment()#
返回类型

附件

bind()#
返回类型

布尔类型

将渲染从默认,由窗口系统提供的帧缓冲区切换到该帧缓冲区对象。成功时返回 true,否则返回 false。

注意

如果调用了 takeTexture(),将会创建一个新的纹理并将其与帧缓冲区对象相关联。这可能很昂贵,并且会改变上下文状态(当前绑定的纹理)。

另请参阅

release()

静态 bindDefault()#
返回类型

布尔类型

将渲染切换回默认的,由窗口系统提供的帧缓冲区。成功时返回 true,否则返回 false。

另请参阅

bind() release()

静态 blitFramebuffer(target, source[, buffers=GL_COLOR_BUFFER_BIT[, filter=GL_NEAREST]])#
参数:
静态 blitFramebuffer(target, targetRect, source, sourceRect[, buffers=GL_COLOR_BUFFER_BIT[, filter=GL_NEAREST]])
参数:
静态 blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter, readColorAttachmentIndex, drawColorAttachmentIndex)
参数:
静态 blitFramebuffer(target, targetRect, source, sourceRect, buffers, filter, readColorAttachmentIndex, drawColorAttachmentIndex, restorePolicy)
参数:
format()#
返回类型

QOpenGLFramebufferObjectFormat

handle()#
返回类型

int

返回此帧缓冲区的OpenGL帧缓冲区对象句柄(通过glGenFrameBuffersEXT()函数返回)。此句柄可以用来将新图像或缓冲区附加到帧缓冲区。用户负责清理和销毁这些对象。

静态 hasOpenGLFramebufferBlit()#
返回类型

布尔类型

如果此系统上有OpenGL GL_EXT_framebuffer_blit扩展,则返回true;否则返回false

另请参阅

blitFramebuffer()

静态 hasOpenGLFramebufferObjects()#
返回类型

布尔类型

如果该系统支持OpenGL扩展GL_EXT_framebuffer_object,则返回true;否则返回false

height()#
返回类型

int

返回缓存对象附件的高度。

isBound()#
返回类型

布尔类型

isValid()#
返回类型

布尔类型

如果缓存对象有效,则返回true

如果初始化过程失败、用户将无效的缓冲区附加到缓存对象,或当纹理目标为GL_TEXTURE_2D时指定了非2的幂宽/高作为纹理大小,则缓存对象可能变为无效。如果OpenGL版本是2.0或更高,或者存在GL_ARB_texture_non_power_of_two扩展,则此限制不适用。

如果创建缓存对象的QOpenGLContext被销毁,并且没有其他共享上下文可以接管缓存对象的所有权,则缓存对象也可能变为无效。

release()#
返回类型

布尔类型

将渲染切换回默认的,由窗口系统提供的帧缓冲区。成功时返回 true,否则返回 false。

另请参阅

bind()

setAttachment(attachment)#
参数:

attachmentAttachment

size()#
返回类型

QSize

sizes()#
返回类型

列表中的QSize

takeTexture()#
返回类型

int

返回附加到该缓存对象的纹理的纹理ID。纹理的所有权将转移给调用者。

如果缓存对象当前绑定,则会隐式调用release()方法。在下一次调用bind()方法期间,将创建一个新的纹理。

如果使用多采样缓存对象,则没有纹理,此函数的返回值将无效。同样,不完整的缓存对象也会返回0。

另请参阅

texture() bind() release()

takeTexture(colorAttachmentIndex)
参数:

colorAttachmentIndex – int

返回类型

int

texture()#
返回类型

int

返回此帧缓冲对象中作为默认渲染目标附加的纹理的纹理ID。此纹理ID可绑定为您自己的OpenGL代码中的一个普通纹理。

如果您使用的是多重采样帧缓冲对象,则此函数返回的值将无效。

当附加多个纹理时,返回值是第一个的ID。

另请参阅

takeTexture() textures()

textures()#
返回类型

. 无符号整数的列表

toImage([flipped=true])#
参数:

flipped – bool

返回类型

QImage

将此帧缓冲对象的内容作为QImage返回。

如果flipped为true,则图像从OpenGL坐标翻转到底层坐标。如果与QOpenGLPaintDevice一起使用,则flipped 应与paintFlipped()的值相反。

返回的图像格式为预乘的ARGB32或RGB32。后者仅在internalTextureFormat()设置为GL_RGB时使用。从Qt 5.2开始,如果(A)RGB32读取不受支持,则将回退到预乘的RGBA8888或RGBx8888,这包括OpenGL ES。从Qt 5.4开始,如果内部格式是RGB10_A2,则返回A2BGR30图像;如果内部格式是RGBA16,则从Qt 5.12开始返回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检索内容。这是一个可能昂贵且效率低下的操作。因此,建议尽可能少地使用此函数。

另请参阅

paintFlipped()

toImage(flipped, colorAttachmentIndex)
参数:
  • flipped – bool

  • colorAttachmentIndex – int

返回类型

QImage

width()#
返回类型

int

返回帧缓冲对象附件的宽度。