QOpenGLBuffer

一、描述

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(),并且已将其绑定到当前上下文。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值