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()绑定和解绑缓冲区。