OpenGL 缓冲区对象

OpenGL 缓冲区对象

OpenGL红宝书 p57 2.7节 缓冲区对象

OpenGL 1.5 版本增加了缓冲区对象(bufferobject),允许应用程序显式地指定把哪些数据存储在图形服务器中。OpenGL是按照客户机-服务器模式设计的,假设应用程序位于客户机,而图形服务器处于别的计算机,于是每次要渲染图像就要从客户机取数据。在一般情况下,可以认为OpenGL需要从内存读取数据到显存用于计算。

OpenGL 1.5 :顶点数据可以存储在服务器端的缓冲区对象中。

OpenGL 2.1 :像素数据(纹理贴图或者像素块)的支持。

OpenGL 3.1 :同意缓冲对象(uniformbuffer object),用于着色器。

 

创建缓冲区对象

返回那个当前未使用的名称,buffers是一个存储名称的数组,你不必指定到底是什么名称。

void glGenBuffers(GLsizei n,GLuint *buffers);

 

激活缓冲区对象

首先要将其绑定。绑定缓冲区对象表示选择未来的操作(对数据进行初始化或者使用缓冲区对象进行渲染)将影响哪个缓冲区对象。

void glBindBuffer(GLenum target,GLuintbuffer);

target 指定buffer类型,buffer指前面生成的缓冲区id。

作用:

1、  buffer是一个首次使用的非零整数时,它创建一个新的缓冲区对象,把buffer分配给这个缓冲区对象用作名字。

2、  绑定到一个以前创建过的缓冲区对象,这个缓冲区对象成为活动对象。

3、  绑定到一个值为零的buffer时,OpengGL停止使用缓冲区对象。

 

绑定后进行数据分配和初始化缓冲区对象

void glBufferData(GLenum target,GLsizeiptrsize,const GLvoid *data,GLenum usage);

分配size个存储单位的OpenGL服务器内存(显存),data是指向内存数据库的指针,usage指示如何读写数据块。这些数据块是否常常更新,适用于绘制还是用于计算,通过设置可以优化性能。

 

更新缓冲区对象

1、  用另一个缓冲区替换当前绑定的缓冲区的一部分。

void glBufferSubData(GLenum target,GLintptroffset,GLsizeiptr size,const GLvoid *data);

2、  glMapBuffer()返回一个指向缓冲区对象的指针,可以在这个缓冲区对象中写入新值,就像对数组进行赋值一样。glMapBuffer()提供了对缓冲区对象中的整个数据集合的访问。如果需要修改缓冲区的大多数数据,这种方法很有用。但是,如果一个很大的缓冲区只需要更新很小的一部分值,这种方法效率很低。

GLvoid *glMapBuffer(GLenum target,GLenum access);
GLboolean glUnmapBuffer(GLenum target);//完成了对数据存储的访问。
GLvoid *glMapBufferRange(GLenum target,GLintptroffset,GLsizeiptr length,GLbitfield access);//offset 和 length 指定了映射范围
GLvoid *glFlushMappedBufferRange(GLenum target,GLintptroffset,GLsizeiptr length);//表示一个缓冲区范围中的值已经修改

缓冲区对象之间的复制数据

void glCopyBufferSubData(GLenum readbuffer,GLenum writebuffer,
                         GLintptrreadoffset, GLintptr writeoffset,
                         GLsizeiptrsize);

清除缓冲区对象

void glDeleteBuffers(GLsizei n,const GLuint*buffers);//删除n个缓冲区对象。

----------------------------------------------------------------------------------------------------------------------

QGLbuffer提供了创建和操作openGL缓冲区对象的功能。

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

缓冲区之间的复制是浅复制,当拷贝被修改是,原始数据一并被修改。

 

enum QGLBuffer::Access

l  QGLBuffer::ReadOnly

l  QGLBuffer::WriteOnly

l  QGLBuffer::ReadWrite

 

enum QGLBuffer::Type

l  QGLBuffer::VertexBuffer

l  QGLBuffer::IndexBuffer

l  QGLBuffer::PixelPackBuffer

l  QGLBuffer::PixelUnpackBuffer

 

enum QGLBuffer::UsagePattern

QGLBuffer::StreamDraw

QGLBuffer::StreamRead

QGLBuffer::StreamCopy

QGLBuffer::StaticDraw

QGLBuffer::StaticRead

QGLBuffer::StaticCopy

QGLBuffer::DynamicDraw

QGLBuffer::DynamicRead

QGLBuffer::DynamicCopy

 

直接用QGLBuffer()构造函数创建一个新的缓冲区对象。

用create()函数在GL server中穿件缓冲区。

用allocate()分配缓存大小。

用destroy()销毁缓冲区,包括缓冲区中的存储块。

用bind()和release()绑定和解绑缓冲区。

你可能感兴趣的:(图形,QT)