QOpenGLBuffer 类

QOpenGLBuffer 类提供用于创建和管理 OpenGL 缓冲对象的函数。更多信息...

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

公共类型

枚举访问 { OnlyRead, OnlyWrite, ReadWrite }
枚举范围访问标志 { RangeRead, RangeWrite, RangeInvalidate, RangeInvalidateBuffer, RangeFlushExplicit, RangeUnsynchronized }
标志范围访问标志集
枚举类型 { VertexBuffer, IndexBuffer, PixelPackBuffer, PixelUnpackBuffer }
枚举使用模式 { StreamDraw, StreamRead, StreamCopy, StaticDraw, StaticRead, …, DynamicCopy }

公共函数

QOpenGLBuffer()
QOpenGLBuffer(QOpenGLBuffer::Type type)
QOpenGLBuffer(const QOpenGLBuffer &other)
(自 6.5 版起) QOpenGLBuffer(QOpenGLBuffer &&other)
~QOpenGLBuffer()
voidallocate(const void *data, int count)
voidallocate(int count)
boolbind()
GLuintbufferId() const
boolcreate()
voiddestroy()
boolisCreated() const
void *map(QOpenGLBuffer::Access access)
void *mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)
boolread(int offset, void *data, int count)
voidrelease()
voidsetUsagePattern(QOpenGLBuffer::UsagePattern value)
intsize() const
(自 6.5 版起) voidswap(QOpenGLBuffer &other)
QOpenGLBuffer::Typetype() const
boolunmap()
QOpenGLBuffer::UsagePatternusagePattern() const
voidwrite(int offset, const void *data, int count)
QOpenGLBuffer &operator=(const QOpenGLBuffer &other)
(自 6.5 版起) QOpenGLBuffer &operator=(QOpenGLBuffer &&other)

静态公共成员

voidrelease(QOpenGLBuffer::Type type)

详细描述

缓冲对象在OpenGL服务器中创建,这样客户端应用程序就可以避免每次需要时都上传顶点、索引、纹理图像数据等。

QOpenGLBuffer对象可以作为底层OpenGL缓冲对象的引用来拷贝。

QOpenGLBuffer buffer1(QOpenGLBuffer::IndexBuffer);
buffer1.create();

QOpenGLBuffer buffer2 = buffer1;

QOpenGLBuffer以这种方式复制对象时执行浅拷贝,但不实现写时复制语义。当复制被修改时,原始对象将受到影响。

成员类型文档

枚举 QOpenGLBuffer::Access

此枚举定义了QOpenGLBuffer::map的访问模式。

常量描述
QOpenGLBuffer::ReadOnly0x88B8缓冲区将仅用于读取。
QOpenGLBuffer::WriteOnly0x88B9缓冲区仅用于写入。
QOpenGLBuffer::ReadWrite0x88BA缓冲区将用于读取和写入。

枚举 QOpenGLBuffer::RangeAccessFlag
标志 QOpenGLBuffer::RangeAccessFlags

此枚举定义了QOpenGLBuffer::mapRange的访问模式位。

常量描述
QOpenGLBuffer::RangeRead0x0001缓冲区将用于读取。
QOpenGLBuffer::RangeWrite0x0002缓冲区将用于写入。
QOpenGLBuffer::RangeInvalidate0x0004取消指定范围的先前内容。
QOpenGLBuffer::RangeInvalidateBuffer0x0008取消整个缓冲区的先前内容。
QOpenGLBuffer::RangeFlushExplicit0x0010表示修改将通过glFlushMappedBufferRange显式刷新。
QOpenGLBuffer::RangeUnsynchronized0x0020表示在从mapRange返回之前不应同步挂起的操作。

The RangeAccessFlags类型是QFlags<RangeAccessFlag>的类型定义。它存储了RangeAccessFlag值的逻辑或组合。

枚举 QOpenGLBuffer::Type

此枚举定义了使用QOpenGLBuffer创建的OpenGL缓冲对象的类型。

常量描述
QOpenGLBuffer::VertexBuffer0x8892用于指定顶点数组的顶点缓冲区对象。
QOpenGLBuffer::IndexBuffer0x8893glDrawElements()一起使用的索引缓冲区对象。
QOpenGLBuffer::PixelPackBuffer0x88EB用于从OpenGL服务器(例如,使用glReadPixels())读取像素数据的像素打包缓冲区对象。在OpenGL/ES下不受支持。
QOpenGLBuffer::PixelUnpackBuffer0x88EC用于将像素数据写入OpenGL服务器(例如,使用glTexImage2D())的像素 unpack 缓冲区对象。在OpenGL/ES下不受支持。

枚举 QOpenGLBuffer::UsagePattern

此枚举定义了QOpenGLBuffer对象的用法模式。

常量描述
QOpenGLBuffer::StreamDraw0x88E0数据将设置一次,并在绘图操作中使用几次。在OpenGL/ES 1.1下,这与StaticDraw相同。
QOpenGLBuffer::StreamRead0x88E1数据将设置一次,并在从OpenGL服务器中读取数据(如果在OpenGL/ES下)时使用几次。在OpenGL/ES下不受支持。
QOpenGLBuffer::StreamCopy0x88E2数据将设置一次,并在从OpenGL服务器读取数据(用于进一步绘图操作)时使用几次。在OpenGL/ES下不受支持。
QOpenGLBuffer::StaticDraw0x88E4一次设置数据,然后用于多次绘图操作。
QOpenGLBuffer::StaticRead0x88E5一次设置数据,然后用于从OpenGL服务器读取数据多次。在OpenGL/ES下不支持。
QOpenGLBuffer::StaticCopy0x88E6一次设置数据,然后用于从OpenGL服务器读取数据多次以便用于进一步的绘图操作。在OpenGL/ES下不支持。
QOpenGLBuffer::DynamicDraw0x88E8数据会重复修改,并用于多次绘图操作。
QOpenGLBuffer::DynamicRead0x88E9数据会重复修改,并用于多次从OpenGL服务器读取数据。在OpenGL/ES下不支持。
QOpenGLBuffer::DynamicCopy0x88EA数据会重复修改,并用于多次从OpenGL服务器读取数据以便用于进一步的绘图操作。在OpenGL/ES下不支持。

成员函数文档

QOpenGLBuffer::QOpenGLBuffer()

构造一个类型为QOpenGLBuffer::VertexBuffer的新缓冲区对象。

注意:此构造函数仅创建QOpenGLBuffer实例。实际在OpenGL服务器中的缓冲区对象只有当调用create()后才会创建。

另请参阅create()。

[显式] QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer::Type type)

构造一个指定类型的缓冲区对象。

注意:此构造函数仅创建QOpenGLBuffer实例。实际在OpenGL服务器中的缓冲区对象只有当调用create()后才会创建。

另请参阅create()。

QOpenGLBuffer::QOpenGLBuffer(const QOpenGLBuffer &other)

构造一个对other的浅拷贝。

注意:QOpenGLBuffer不实现延迟拷写的语义,因此每当修改拷贝时,other都会受到影响。

[noexcept, since 6.5] QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer &&other)

other移动构造一个新QOpenGLBuffer。

注意:移动后的对象other会被置于一个部分形成的状态,此时其唯一有效的操作是自我销毁和新值赋值。

此函数自Qt 6.5引入。

[noexcept] QOpenGLBuffer::~QOpenGLBuffer()

销毁此缓冲区对象,包括OpenGL服务器中使用的存储。

void QOpenGLBuffer::allocate(const void *data, int count)

分配缓冲区中count字节的存储空间,并用data的内容初始化。任何先前的内容都将被移除。

假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。

另请参阅create(),read()和write()。

void QOpenGLBuffer::allocate(int count)

这是一个重载函数。

分配缓冲区中count字节的存储空间。任何先前的内容都将被移除。

假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。

另请参阅create()和write()。

bool QOpenGLBuffer::bind()

将与此对象关联的缓冲区绑定到当前OpenGL上下文。如果绑定失败(通常因为不支持的类型),则返回false

该缓冲区必须在调用()时绑定到相同的QOpenGLContext,或者绑定到另一个与它共享的QOpenGLContext。否则,此函数将返回false

另请参阅()和()。

GLuint QOpenGLBuffer::bufferId() const

返回与此缓冲区关联的OpenGL标识符;如果缓冲区尚未创建,则返回零。

另请参阅()。

bool QOpenGLBuffer::create()

在OpenGL服务器中创建缓冲区对象。如果对象被创建,则返回true;否则返回false

必须在此QOpenGLContextifdef current时调用此函数。缓冲区将绑定到此上下文,并且只能在该上下文中(或与之共享的任何其他上下文中)使用。

如果OpenGL实现不支持缓冲区,或者没有当前QOpenGLContext,则此函数将返回false

另请参阅(),(),

void QOpenGLBuffer::destroy()

销毁此缓冲区对象,包括OpenGL服务器中使用的存储。所有对缓冲区的引用都将变为无效。

bool QOpenGLBuffer::isCreated() const

如果此缓冲区已创建,则返回true;否则返回false

另请参阅()和

void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)

将此缓冲区的内容映射到应用程序的内存空间,并返回对该内容的指针。如果内存映射不可行,则返回null。参数access指定要执行的类型。

假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。

注意:此函数仅在OpenGL ES 2.0或更早版本上支持,如果存在GL_OES_mapbuffer扩展。

注意:在OpenGL ES 3.0及更高版本或桌面OpenGL的情况下,如果支持GL_ARB_map_buffer_range,则此函数使用glMapBufferRange而不是glMapBuffer

另请参阅(),(),

void *QOpenGLBuffer::mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)

将此缓冲区内容的offsetcount指定的范围映射到应用程序的内存空间,并返回对该内容的指针。如果内存映射不可行,则返回null。参数access指定组合的访问标志。

假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。

注意:此函数在OpenGL ES 2.0及更早版本中不可用。

另请参阅unmap(),create() 和 bind()。

bool QOpenGLBuffer::read(int offset, void *data, int count)

从该缓冲区的起始地址 offset 读取 count 字节到 data 中。成功时返回 true;如果从缓冲区读取不受支持,则返回 false。在 OpenGL/ES 中不支持缓冲区读取。

假设此缓冲区已绑定到当前上下文。

另请参阅write() 和 bind()。

void QOpenGLBuffer::release()

释放与该对象关联的缓冲区与当前 OpenGL 上下文。

该函数必须在调用 QOpenGLContextbind() 时使用的同一个当前 QOpenGLContext 上调用。

另请参阅bind()。

[静态] void QOpenGLBuffer::release(QOpenGLBuffer::Type type)

释放当前 QOpenGLContext 中与 type 关联的缓冲区。

此函数直接调用 glBindBuffer(type, 0),用于当调用者不清楚哪个 QOpenGLBuffer 已绑定到上下文但想要确保它已释放时。

QOpenGLBuffer::release(QOpenGLBuffer::VertexBuffer);

void QOpenGLBuffer::setUsagePattern(QOpenGLBuffer::UsagePattern value)

将此缓冲区对象的用途模式设置为 value。在调用 allocate() 或 write() 之前必须调用此函数。

另请参阅usagePattern(),allocate() 和 write()。

int QOpenGLBuffer::size() const

返回该缓冲区中数据的长度,用于读取操作。如果获取缓冲区大小不受支持或缓冲区尚未创建,则返回 -1。

假设此缓冲区已绑定到当前上下文。

另请参阅isCreated() 和 bind()。

[noexcept, since 6.5] void QOpenGLBuffer::swap(QOpenGLBuffer &other)

与此缓冲区交换缓冲区 other。此操作非常快且从未失败。

此函数自Qt 6.5引入。

QOpenGLBuffer::Type QOpenGLBuffer::type() const

返回由此对象表示的缓冲区类型。

bool QOpenGLBuffer::unmap()

在通过之前调用 map() 将缓冲区映射到应用程序的内存空间后,取消映射缓冲区。如果取消映射成功,则返回 true;否则返回 false。

假设此缓冲区已绑定到当前上下文,并且它之前已被 map() 映射。

注意:此功能仅在OpenGL ES 2.0及更早版本中支持下,如果存在GL_OES_mapbuffer扩展。

另请参阅:map()。

QOpenGLBuffer::UsagePattern QOpenGLBuffer::usagePattern() const

返回此缓冲区对象的用途模式。默认值是StaticDraw

另请参阅:setUsagePattern()。

void QOpenGLBuffer::write(int offset, const void *data, int count)

将此缓冲区中从offset开始的count个字节替换为data的内容。缓冲区中的其他字节将保持不变。

假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。

另请参阅:create()、read()和allocate()。

QOpenGLBuffer &QOpenGLBuffer::operator=(const QOpenGLBuffer &other)

other的浅拷贝分配给此对象。

注意:QOpenGLBuffer未实现写时复制语义,因此每次修改拷贝时other都会受到影响。

[noexcept, since 6.5] QOpenGLBuffer &QOpenGLBuffer::operator=(QOpenGLBuffer &&other)

移动分配other到此QOpenGLBuffer实例。

注意:移动后的对象other会被置于一个部分形成的状态,此时其唯一有效的操作是自我销毁和新值赋值。

此函数自Qt 6.5引入。

© 2024 Qt公司有限。本文档中包含的贡献是各自所有者的版权。本提供的文档是根据由自由软件基金会发布的GNU自由文档许可版1.3的条款许可的。Qt以及相应的标志是芬兰及其在全球的专利,所有其他商标都是各自所有者的财产。