OpenGL Buffer Object

OpenGL的缓冲对象提供了一种高效的数据操作及吞吐方式,这此操作涉及整个渲染管线的多个环节,用来提高OpenGL的实现效率。常见的缓冲对象有:顶点缓冲对象(VBO)、像素缓冲对象(PBO)和帧缓冲对象(FBO),各种缓冲对象的操作方式及应用场合不尽相同,但主要都是在关系到内存与显存之间需进行数据传输与交互时而进行的优化操作,因为内存与显存之间的数据交互在当前的硬件渲染架构下是必须的,但效率却又受限于PCI的传输速度。缓冲区对象的作用就是让这种数据交互操作在一种最优的方式下进行,使所有的操作从Client到显存之间的距离尽可能地缩短,从而提高效率。

Vertex Buffer Object:

  1. 在Client与Server之间快速地操作几何顶点数据,能够很快地对顶点数据进行更新等操作。这里顶点数据的实质可以根据具体需要以其它数据填充。
  2. 开辟的实际数据空间的位置不确定,根据VBO的属性及CPU调用的次数,由显存逐渐向内存转移。

 

Pixel Buffer Object:

  1. 在Client与Server之间快速地操作各类像素数据
  2. 高效并不在于传输更快,而在于与硬件相关的异步调用方式,调用之后CPU即返回执行其它操作(使用DMA方式的传输、由OpenGL直接控制)
  3. 在单个PBO情况下并不能得到很好的效果,毕竟传输过程仍然存在(但速度可能变快,比如显存内部的数据传输),但其异步性就提供了双PBO实现的可能性,用双PBO来进行加速。
  4. PBO关联的实际数据空间位置不确定,主要由PBO的属性及OpenGL来确定。

 

Frame Buffer Object:

  1. 提供了一个与FrameBuffer同类型的离屏渲染操作对象,可直接控制管线最终数据的去向。
  2. 分配的空间是在显存之中,因此用FBO来对显存进行涉及GPU运算的交互操作效率较高。
  3. 主要用于显存内部数据的转化、交互、操作的场合。

 

整个过程可用如下图所示:

 

 

注意:所有的Buffer Object都只是一个中间的管理平台,与实际的空间相分离。其中,除了FBO所关联的数据空间在显存之外,PBO和VBO所关联的数据空间位置均不一定(system memory, shared memory, AGP, Video Memory均有可能)

 

关于更加详细的Buffer Object使用方法可以参见:

《OpenGL Super Bible》(chapter11, chapter18)

http://www.songho.ca/opengl/gl_vbo.html

http://www.songho.ca/opengl/gl_pbo.html

http://www.songho.ca/opengl/gl_fbo.html

posted on 2012-06-29 15:35  30斤大番薯  阅读(345)  评论(0编辑  收藏  举报