介绍OpenGL 缓冲区对象一篇很好的文章。http://developer.178.com/201104/96859219738.html
OpenGL的缓冲区对象主要关系到内存与显存之间进行数据传输与交互时而进行的优化操作。常见的缓冲对象有:顶点缓冲对象VBO、像素缓冲对象PBO和帧缓冲对象FBO,不同的对象的操作方式及应用场合不尽相同。
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均有可能)