OpenGL顶点缓冲区对象

OpenGL顶点缓冲区对象html

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

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

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

管理和使用缓冲区对象

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

  void glGenBuffers(GLsizei n, GLuint *buffers);ui

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

  而后绑定顶点缓冲区对象:.net

  void glBindBuffer(GLenum target, GLuint buffer);指针

  这里的target参数指定了要绑定什么样的数组。类型有不少,能够是顶点数组GL_ARRAY_BUFFER,顶点索引数组GL_ELEMENT_ARRAY_BUFFER(用于glDrawElements和其余基于索引的渲染函数)等。xml

加载缓冲区对象

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

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

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

用法提示 描述
GL_DYNAMIC_DRAW 存储在缓冲区对象中的顶点数组常常要更新,而且可能屡次做为绘图的来源。这个提示告诉OpenGL实现把数据放置在更新开销不大的地方。
GL_STATIC_DRAW 数组不多更新,但可能屡次做为绘图的来源。这个提示告诉OpenGL实现把数据放置在可以快速渲染但不须要快速更新的地方。
GL_STREAM_DRAW 数据极少变化,而且最多只有几回做为绘图的源数据。这个提示告诉OpenGL实现有一些时间敏感的数据(例如动画)将只使用一次,而后被替换。

  

从顶点缓冲区对象渲染

从顶点缓冲区对象渲染有两个地方须要改动。首先,须要在调用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.

参考:http://my.oschina.net/sweetdark/blog/186675

相关文章
相关标签/搜索