QOpenGLBuffer 类
QOpenGLBuffer 类提供用于创建和管理 OpenGL 缓冲对象的函数。更多信息...
头文件 | #include <QOpenGLBuffer> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake | QT += opengl |
- 所有成员列表,包括继承成员
- QOpenGLBuffer 是 3D 渲染 的一部分。
公共类型
枚举 | 访问 { 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() | |
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 |
(自 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) |
QOpenGLBuffer & | operator=(const QOpenGLBuffer &other) |
(自 6.5 版起) QOpenGLBuffer & | operator=(QOpenGLBuffer &&other) |
静态公共成员
void | release(QOpenGLBuffer::Type type) |
详细描述
缓冲对象在OpenGL服务器中创建,这样客户端应用程序就可以避免每次需要时都上传顶点、索引、纹理图像数据等。
QOpenGLBuffer对象可以作为底层OpenGL缓冲对象的引用来拷贝。
QOpenGLBuffer buffer1(QOpenGLBuffer::IndexBuffer); buffer1.create(); QOpenGLBuffer buffer2 = buffer1;
QOpenGLBuffer以这种方式复制对象时执行浅拷贝,但不实现写时复制语义。当复制被修改时,原始对象将受到影响。
成员类型文档
枚举 QOpenGLBuffer::Access
此枚举定义了QOpenGLBuffer::map的访问模式。
常量 | 值 | 描述 |
---|---|---|
QOpenGLBuffer::ReadOnly | 0x88B8 | 缓冲区将仅用于读取。 |
QOpenGLBuffer::WriteOnly | 0x88B9 | 缓冲区仅用于写入。 |
QOpenGLBuffer::ReadWrite | 0x88BA | 缓冲区将用于读取和写入。 |
枚举 QOpenGLBuffer::RangeAccessFlag
标志 QOpenGLBuffer::RangeAccessFlags
此枚举定义了QOpenGLBuffer::mapRange的访问模式位。
常量 | 值 | 描述 |
---|---|---|
QOpenGLBuffer::RangeRead | 0x0001 | 缓冲区将用于读取。 |
QOpenGLBuffer::RangeWrite | 0x0002 | 缓冲区将用于写入。 |
QOpenGLBuffer::RangeInvalidate | 0x0004 | 取消指定范围的先前内容。 |
QOpenGLBuffer::RangeInvalidateBuffer | 0x0008 | 取消整个缓冲区的先前内容。 |
QOpenGLBuffer::RangeFlushExplicit | 0x0010 | 表示修改将通过glFlushMappedBufferRange 显式刷新。 |
QOpenGLBuffer::RangeUnsynchronized | 0x0020 | 表示在从mapRange返回之前不应同步挂起的操作。 |
The RangeAccessFlags类型是QFlags<RangeAccessFlag>的类型定义。它存储了RangeAccessFlag值的逻辑或组合。
枚举 QOpenGLBuffer::Type
此枚举定义了使用QOpenGLBuffer创建的OpenGL缓冲对象的类型。
常量 | 值 | 描述 |
---|---|---|
QOpenGLBuffer::VertexBuffer | 0x8892 | 用于指定顶点数组的顶点缓冲区对象。 |
QOpenGLBuffer::IndexBuffer | 0x8893 | 与glDrawElements() 一起使用的索引缓冲区对象。 |
QOpenGLBuffer::PixelPackBuffer | 0x88EB | 用于从OpenGL服务器(例如,使用glReadPixels() )读取像素数据的像素打包缓冲区对象。在OpenGL/ES下不受支持。 |
QOpenGLBuffer::PixelUnpackBuffer | 0x88EC | 用于将像素数据写入OpenGL服务器(例如,使用glTexImage2D() )的像素 unpack 缓冲区对象。在OpenGL/ES下不受支持。 |
枚举 QOpenGLBuffer::UsagePattern
此枚举定义了QOpenGLBuffer对象的用法模式。
常量 | 值 | 描述 |
---|---|---|
QOpenGLBuffer::StreamDraw | 0x88E0 | 数据将设置一次,并在绘图操作中使用几次。在OpenGL/ES 1.1下,这与StaticDraw相同。 |
QOpenGLBuffer::StreamRead | 0x88E1 | 数据将设置一次,并在从OpenGL服务器中读取数据(如果在OpenGL/ES下)时使用几次。在OpenGL/ES下不受支持。 |
QOpenGLBuffer::StreamCopy | 0x88E2 | 数据将设置一次,并在从OpenGL服务器读取数据(用于进一步绘图操作)时使用几次。在OpenGL/ES下不受支持。 |
QOpenGLBuffer::StaticDraw | 0x88E4 | 一次设置数据,然后用于多次绘图操作。 |
QOpenGLBuffer::StaticRead | 0x88E5 | 一次设置数据,然后用于从OpenGL服务器读取数据多次。在OpenGL/ES下不支持。 |
QOpenGLBuffer::StaticCopy | 0x88E6 | 一次设置数据,然后用于从OpenGL服务器读取数据多次以便用于进一步的绘图操作。在OpenGL/ES下不支持。 |
QOpenGLBuffer::DynamicDraw | 0x88E8 | 数据会重复修改,并用于多次绘图操作。 |
QOpenGLBuffer::DynamicRead | 0x88E9 | 数据会重复修改,并用于多次从OpenGL服务器读取数据。在OpenGL/ES下不支持。 |
QOpenGLBuffer::DynamicCopy | 0x88EA | 数据会重复修改,并用于多次从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(),并且它已绑定到当前上下文中。
void QOpenGLBuffer::allocate(int count)
这是一个重载函数。
分配缓冲区中count字节的存储空间。任何先前的内容都将被移除。
假设已对当前缓冲区调用create(),并且它已绑定到当前上下文中。
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)
将此缓冲区内容的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 中不支持缓冲区读取。
假设此缓冲区已绑定到当前上下文。
void QOpenGLBuffer::release()
释放与该对象关联的缓冲区与当前 OpenGL 上下文。
该函数必须在调用 QOpenGLContext 的 bind() 时使用的同一个当前 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。
假设此缓冲区已绑定到当前上下文。
[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以及相应的标志是芬兰及其在全球的专利,所有其他商标都是各自所有者的财产。