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()。
本文来自博客园,原创作者:Clemens,转载请注明原文链接:https://www.cnblogs.com/errorman/p/17217811.html