errorman

不积跬步,无以至千里

导航

QOpenGLBuffer Class

Posted on 2023-03-15 11:50  Clemens  阅读(156)  评论(0编辑  收藏  举报

Detailed Description 详细描述

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

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

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

当以这种方式复制对象时,OpenGLBuffer执行浅复制,但不实现写时复制语义。每当修改副本时,原始对象都会受到影响。

Member Type Documentation

enum QOpenGLBuffer::Access

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

Constant Value Description
QOpenGLBuffer::ReadOnly 0x88B8 该缓冲区将只被映射为读取状态。
QOpenGLBuffer::WriteOnly 0x88B9 该缓冲区将只被映射为写入状态。
QOpenGLBuffer::ReadWrite 0x88BA 将缓冲区映射为可读可写。

 

enum QOpenGLBuffer::RangeAccessFlag
flags QOpenGLBuffer::RangeAccessFlags
这个枚举定义了QOpenGLBuffer::mapRange()方法的访问模式位。
Constant Value Description
QOpenGLBuffer::RangeRead 0x0001 这个缓冲区将被映射为读取模式。
QOpenGLBuffer::RangeWrite 0x0002 这个缓冲区将被映射为写入模式。
QOpenGLBuffer::RangeInvalidate 0x0004 丢弃指定范围内的先前内容。
QOpenGLBuffer::RangeInvalidateBuffer 0x0008 丢弃整个缓冲区的先前内容。
QOpenGLBuffer::RangeFlushExplicit 0x0010 表示修改将通过glFlushMappedBufferRange显式刷新。
QOpenGLBuffer::RangeUnsynchronized 0x0020 表示在从mapRange()返回之前不应同步挂起的操作。
RangeAccessFlags类型是QFlags<RangeAccessFlag>的typedef。它存储RangeAccessFlag值的OR组合。

 

enum QOpenGLBuffer::Type
这个枚举定义了使用QOpenGLBuffer创建的OpenGL缓冲对象的类型。
Constant Value Description
QOpenGLBuffer::VertexBuffer 0x8892 顶点缓冲对象,用于指定顶点数组时使用。
QOpenGLBuffer::IndexBuffer 0x8893 索引缓冲对象,用于与glDrawElements()一起使用。
QOpenGLBuffer::PixelPackBuffer 0x88EB 像素打包缓冲对象,用于从OpenGL服务器读取像素数据(例如,使用glReadPixels()函数)。在OpenGL/ES中不支持该功能。
QOpenGLBuffer::PixelUnpackBuffer 0x88EC 像素解包缓冲对象,用于将像素数据写入到OpenGL服务器(例如,使用glTexImage2D()函数)。在OpenGL/ES中不支持该功能。

 

enum QOpenGLBuffer::UsagePattern
这个枚举定义了 QOpenGLBuffer 对象的使用模式。
Constant Value Description
QOpenGLBuffer::StreamDraw 0x88E0 数据将被设置一次,并用于绘图操作多次。在OpenGL/ES 1.1下,这与StaticDraw相同。
QOpenGLBuffer::StreamRead 0x88E1 数据将被设置一次,并用于从OpenGL服务器读取数据多次。在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下不支持。

 

Member Function Documentation

QOpenGLBuffer::QOpenGLBuffer(const QOpenGLBuffer &other)

构造一个other的浅拷贝。 注意:QOpenGLBuffer不实现写时复制语义,因此在修改拷贝时,other也会受到影响。

 

QOpenGLBuffer::QOpenGLBuffer(QOpenGLBuffer::Type type)

构造一个新的类型为type的缓冲区对象。

注意:这个构造函数只是创建了QOpenGLBuffer实例,实际的OpenGL服务器中的缓冲区对象并没有创建。直到调用create()函数时才会创建实际的缓冲区对象。

另请参见create()函数。

 

QOpenGLBuffer::QOpenGLBuffer()

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

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

另请参见create()。

 

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

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

注意:QOpenGLBuffer不实现写时复制语义,因此在修改副本时,other会受到影响。

 

QOpenGLBuffer::~QOpenGLBuffer()

Destroys this buffer object, including the storage being used in the OpenGL server.

 

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 上下文。如果绑定不可能,通常是因为 type() 在此 OpenGL 实现中不受支持,则返回 false。

缓冲区必须绑定到调用 create() 时与当前 QOpenGLContext 相同的 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()并将其绑定到当前上下文。

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

注意:在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上下文的绑定。此函数必须与绑定缓冲区时使用的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()。

 

QOpenGLBuffer::Type QOpenGLBuffer::type() const

返回该对象所代表的缓冲区类型。

 

bool QOpenGLBuffer::unmap()

该函数取消映射在应用程序内存空间中的缓冲区,该缓冲区是通过先前调用map()进行映射的。如果取消映射成功,则返回true;否则返回false。

假定此缓冲区已绑定到当前上下文,并且先前已使用map()进行了映射。

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

参见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()。