本页内容

QOpenGLBuffer Class

QOpenGLBuffer 类提供了用于创建和管理 OpenGL 缓冲区对象的函数。更多内容...

头文件: #include <QOpenGLBuffer>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl

公共类型

enum Access { ReadOnly, WriteOnly, ReadWrite }
enum RangeAccessFlag { RangeRead, RangeWrite, RangeInvalidate, RangeInvalidateBuffer, RangeFlushExplicit, RangeUnsynchronized }
flags RangeAccessFlags
enum Type { VertexBuffer, IndexBuffer, PixelPackBuffer, PixelUnpackBuffer }
enum UsagePattern { StreamDraw, StreamRead, StreamCopy, StaticDraw, StaticRead, …, DynamicCopy }

公共函数

QOpenGLBuffer()
QOpenGLBuffer(QOpenGLBuffer::Type type)
QOpenGLBuffer(const QOpenGLBuffer &other)
(since 6.5) QOpenGLBuffer(QOpenGLBuffer &&other)
~QOpenGLBuffer()
void allocate(const void *data, int count)
void allocate(int count)
bool bind()
GLuint bufferId() const
bool create()
void destroy()
bool isCreated() const
void *map(QOpenGLBuffer::Access access)
void *mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)
bool read(int offset, void *data, int count)
void release()
void setUsagePattern(QOpenGLBuffer::UsagePattern value)
int size() const
(since 6.5) void swap(QOpenGLBuffer &other)
QOpenGLBuffer::Type type() const
bool unmap()
QOpenGLBuffer::UsagePattern usagePattern() const
void write(int offset, const void *data, int count)
(since 6.5) QOpenGLBuffer &operator=(QOpenGLBuffer &&other)
QOpenGLBuffer &operator=(const QOpenGLBuffer &other)

静态公共成员

void release(QOpenGLBuffer::Type type)

详细说明

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

QOpenGLBuffer 对象可以作为对底层 OpenGL 缓冲区对象的引用进行复制:

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

QOpenGLBuffer buffer2 = buffer1;

当以这种方式复制对象时,QOpenGLBuffer 会执行浅拷贝,但未实现“写时复制”语义。每当副本被修改时,原始对象都会受到影响。

警告: QOpenGLBuffer 使用的所有 数据均 应为可信内容。缓冲区数据将传递给底层的 OpenGL 实现。建议应用程序开发人员在将用户提供的内容传递给allocate() 和write() 等函数之前,仔细考虑潜在的影响。

成员类型文档

enum QOpenGLBuffer::Access

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

常量值描述
QOpenGLBuffer::ReadOnly0x88B8缓冲区将被映射为只读模式。
QOpenGLBuffer::WriteOnly0x88B9缓冲区将仅映射为只读。
QOpenGLBuffer::ReadWrite0x88BA该缓冲区将被映射为读写模式。

enum QOpenGLBuffer::RangeAccessFlag
flags QOpenGLBuffer::RangeAccessFlags

该枚举定义了QOpenGLBuffer::mapRange() 的访问模式位。

常量值描述
QOpenGLBuffer::RangeRead0x0001缓冲区将被映射为读取模式。
QOpenGLBuffer::RangeWrite0x0002缓冲区将被映射用于读取。
QOpenGLBuffer::RangeInvalidate0x0004丢弃指定范围内的先前内容。
QOpenGLBuffer::RangeInvalidateBuffer0x0008丢弃整个缓冲区的先前内容。
QOpenGLBuffer::RangeFlushExplicit0x0010表示应通过 `glFlushMappedBufferRange` 显式刷新修改内容。
QOpenGLBuffer::RangeUnsynchronized0x0020表示在从mapRange() 返回之前,不应同步待处理的操作。

RangeAccessFlags 类型是QFlags<RangeAccessFlag> 的 typedef。它存储 RangeAccessFlag 值的按“或”运算组合。

enum QOpenGLBuffer::Type

此枚举定义了要通过 `QOpenGLBuffer` 函数创建的 OpenGL 缓冲区对象的类型。

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

enum QOpenGLBuffer::UsagePattern

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

常量常量值描述
QOpenGLBuffer::StreamDraw0x88E0数据将设置一次,并在绘制操作中使用几次。在 OpenGL/ES 1.1 中,这与 StaticDraw 完全相同。
QOpenGLBuffer::StreamRead0x88E1数据将设置一次,并用于从 OpenGL 服务器读取数据数次。在 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 实例。在调用create() 之前,OpenGL 服务器中的实际缓冲区对象不会被创建。

另请参阅 create()。

[explicit] QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer::Type type)

创建一个新的type 缓冲区对象。

注意:此构造函数仅创建 QOpenGLBuffer 实例。直到调用create() 之后,OpenGL 服务器中的实际缓冲区对象才会被创建。

另请参阅 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 上下文。如果无法进行绑定(通常是因为该 OpenGL 实现不支持type()),则返回false 。

该缓冲区必须绑定到调用create() 时当前的QOpenGLContext ,或者绑定到与其共享的另一个QOpenGLContext 。否则,本函数将返回 false。

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

GLuint QOpenGLBuffer::bufferId() const

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

另请参阅 isCreated()。

bool QOpenGLBuffer::create()

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

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

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

另请参阅 isCreated()、allocate()、write() 和destroy()。

void QOpenGLBuffer::destroy()

销毁此缓冲区对象,包括在 OpenGL 服务器中使用的存储空间。所有对该缓冲区的引用都将失效。

bool QOpenGLBuffer::isCreated() const

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

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

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 。

另请参阅 unmap()、create()、bind() 和mapRange()。

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

将该缓冲区内容中由offset 和count 指定的范围映射到应用程序的内存空间中,并返回指向该区域的指针。如果无法进行内存映射,则返回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 上下文中释放与该对象关联的缓冲区。

调用此函数时,必须使用与在该缓冲区上调用 `bind()` 时相同的 `QOpenGLContext ` 当前上下文。

另请参阅 bind()。

[static] 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()。

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

将other 通过移动赋值操作赋值给此QOpenGLBuffer 实例。

注意: 被移动的对象 other 将处于一种部分初始化的状态,在此状态下,唯一有效的操作是销毁和赋予新值。

该函数于 Qt 6.5 中引入。

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

将 `other ` 的浅拷贝赋值给此对象。

注意:QOpenGLBuffer 未实现“写时复制”语义,因此每当副本被修改时,other 都会受到影响。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.