一、描述
QOpenGLBuffer 类提供了用于创建和管理 OpenGL 缓冲区对象的函数。
QOpenGLBuffer 对象可以作为对底层 OpenGL 缓冲区对象的引用进行复制:
QOpenGLBuffer buffer1(QOpenGLBuffer::IndexBuffer);
buffer1.create();
QOpenGLBuffer buffer2 = buffer1;
当以这种方式复制对象时,QOpenGLBuffer 执行浅拷贝,但不实现写时复制语义。每当修改副本时,原始对象都会受到影响。
二、类型成员
1、enum QOpenGLBuffer::Access:此枚举定义了 map() 的访问模式。
- ReadOnly:缓冲区将被映射为只读。
- WriteOnly:缓冲区将被映射为只写。
- ReadWrite:缓冲区将被映射用于读写。
2、enum QOpenGLBuffer::RangeAccessFlag:此枚举定义了 mapRange() 的访问模式位。
- RangeRead:缓冲区将被映射以供读取。
- RangeWrite:缓冲区将被映射以进行写入。
- RangeInvalidate:丢弃指定范围的先前内容。
- RangeInvalidateBuffer:丢弃整个缓冲区的先前内容。
- RangeFlushExplicit:表示修改将通过 glFlushMappedBufferRange 显式刷新。
- RangeUnsynchronized:表示在从 mapRange() 返回之前不应该同步挂起的操作。
3、enum QOpenGLBuffer::Type:此枚举定义了使用 QOpenGLBuffer 创建的 OpenGL 缓冲区对象的类型。
- VertexBuffer:顶点数组时使用的顶点缓冲区对象。
- IndexBuffer:用于 glDrawElements() 的索引缓冲区对象。
- PixelPackBuffer:用于从 OpenGL 服务器读取像素数据的像素包缓冲区对象。
- PixelUnpackBuffer:像素解包缓冲区对象,用于将像素数据写入 OpenGL 服务器。
4、enum QOpenGLBuffer::UsagePattern:此枚举定义了 QOpenGLBuffer 对象的使用模式。
- StreamDraw:数据将被设置一次,并用于绘制操作几次。
- StreamRead:数据将被设置一次并使用几次从OpenGL服务器读回数据。
- StreamCopy:数据将被设置一次并使用几次,用于从 OpenGL 服务器读取数据以用于进一步的绘图操作。
- StaticDraw:数据会设置一次,多次用于绘图操作。
- StaticRead:数据将被设置一次并多次用于从 OpenGL 服务器读取数据。
- StaticCopy:数据将被设置一次并多次用于从 OpenGL 服务器读取数据以用于进一步的绘图操作。
- DynamicDraw:数据会被反复修改,多次用于绘图操作。
- DynamicRead:数据将被反复修改并多次用于从OpenGL服务器读回数据。
- DynamicCopy:数据将被反复修改并多次用于从 OpenGL 服务器读取数据以用于进一步的绘图操作。
三、成员函数
1、void allocate(const void *data, int count)
将 count 字节的空间分配给缓冲区,初始化为 data 的内容。任何以前的内容都将被删除。
假定已在此缓冲区上调用了 create(),并且已将其绑定到当前上下文。
void allocate(int count)
将 count 个字节的空间分配给缓冲区。任何以前的内容都将被删除。
假定已在此缓冲区上调用了 create(),并且已将其绑定到当前上下文。
2、bool bind()
将与此对象关联的缓冲区绑定到当前的 OpenGL 上下文。如果无法绑定,则返回 false,通常是因为此 OpenGL 实现不支持 type()。
缓冲区必须绑定到调用 create() 时当前的相同 QOpenGLContext,或者绑定到与其共享的另一个 QOpenGLContext。否则,此函数将返回 false。
3、GLuint bufferId()
返回与此缓冲区关联的 OpenGL 标识符。
4、bool create()
在 OpenGL 服务器中创建缓冲区对象。返回是否已创建对象。
必须使用当前的 QOpenGLContext 调用此函数。缓冲区将绑定到并且只能在该上下文(或与其共享的任何其他上下文)中使用。
5、void destroy()
销毁此缓冲区对象。所有对缓冲区的引用都将变为无效。
6、bool isCreated()
此缓冲区是否已创建。
7、void * map(QOpenGLBuffer::Access access)
将此缓冲区的内容映射到应用程序的内存空间并返回指向它的指针。
假定已在此缓冲区上调用了 create(),并且已将其绑定到当前上下文。
8、void * mapRange(int offset, int count, QOpenGLBuffer::RangeAccessFlags access)
将此缓冲区的内容的 offset 和count 指定的范围映射到应用程序的内存空间并返回指向它的指针。
假定已在此缓冲区上调用了 create(),并且已将其绑定到当前上下文。
9、bool read(int offset, void *data, int count)
将此缓冲区中从 offset 开始的 count 字节读取到 data 中。返回是否成功读取。
假定此缓冲区已绑定到当前上下文。
10、void release()
从当前 OpenGL 上下文中释放与此对象关联的缓冲区。
必须使用与在缓冲区上调用 bind() 时相同的 QOpenGLContext 当前调用此函数。
11、【static】void release(QOpenGLBuffer::Type type)
释放与当前 QOpenGLContext 中的 type 关联的缓冲区。
12、void setUsagePattern(QOpenGLBuffer::UsagePattern value)
设置此缓冲区对象的使用模式。该函数必须在 allocate() 或 write() 之前调用。
13、int size()
返回此缓冲区中数据的大小,用于读取操作。如果不支持获取缓冲区大小或尚未创建缓冲区,则返回 -1。
假定此缓冲区已绑定到当前上下文。
14、bool unmap()
使用先前调用 map() 将缓冲区映射到应用程序的内存空间后取消映射。返回是否取消成功。
假定此缓冲区已绑定到当前上下文,并且之前已使用 map() 进行映射。
15、void write(int offset, const void *data, int count)
用 data 的内容替换从 offset 开始的这个缓冲区的 count 字节。缓冲区中的任何其他字节都将保持不变。
假定已在此缓冲区上调用了 create(),并且已将其绑定到当前上下文。