设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——顶点缓冲区对象
2015-02-25 22:42:54 来源: 作者: 【 】 浏览:27
Tags:OpenGL 超级 宝典 学习 笔记 顶点 缓冲区 对象

显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码。在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件。在最好的情况下,是编译后放在图形硬件中以减少传输的带宽。显示列表的优化根据实现的不同而有所不同,而且显示列表一旦被创建就不可以修改,灵活性差。


顶点数组提供了我们想要的灵活性,最坏的结果不过是把数据块复制给硬件而已(比立即模式快的多)。而索引顶点数组可以减少向硬件传输的顶点数据的数量,减少变换的开销。


OpenGL还提供了一个特性对图形的吞吐量进行终极的控制。当我们使用顶点数组时,可以把单个数组从客户内存(CPU可以访问)传输到图形硬件。这个特性称为顶点缓冲区对象,允许我们按照类似于管理纹理的方式来管理顶点数组数据,而且顶点缓冲区对象要更灵活。


?


首先要使用缓冲区对象得有顶点数组。第二步创建顶点缓冲区对象,使用函数:


void glGenBuffers(GLsizei n, GLuint *buffers);


这个函数工作方式像glGenTextures一样。其对应的删除缓冲区对象的函数是glDeleteBuffers。


然后绑定顶点缓冲区对象:


void glBindBuffer(GLenum target, GLuint buffer);


这里的target参数指定了要绑定什么样的数组。类型有很多,可以是顶点数组GL_ARRAY_BUFFER,顶点索引数组GL_ELEMENT_ARRAY_BUFFER(用于glDrawElements和其他基于索引的渲染函数)等。


?


在绑定了缓冲区对象之后,我们就可以往图形硬件拷贝顶点数组了。


void glBufferData(GLenum target, GLsizeptr size, GLvoid *data, GLenum usage);


target可以是GL_ARRAY_BUFFER或者GL_ELEMENT_ARRAY_BUFFER等。size指定了顶点数组的大小(以字节为单位)。最后一个参数是用法提示。如下表:


?


从顶点缓冲区对象渲染有两个地方需要改动。首先,需要在调用glVertexPointer之前绑定缓冲区对象,然后把真实的数组指针改成顶点缓冲区对象的偏移值。例如:


glVertexPointer(3, GL_FLOAT, 0, pVerts);


现在变成了:


glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[0]);


glVertexPointer(3, GL_FLOAT, 0, 0);


渲染 就变成了:


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[3]);


glDrawElements(GL_TRIANGLES, nNumIdexes, GL_UNSIGNED_SHORT, 0);


最后一个参数会偏移量。从技术上说,缓冲区对象的这个偏移量基于本地体系结构的NULL指针。在大多数系统中,可设置为0.


?


简单示例:


?


image


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——性能.. 下一篇OpenGL超级宝典学习笔记——选择

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: