分类: LINUX
2011-10-19 12:30:41
PBO,即Pixel Buffer Object。PBO的目的是在显存中快速传递数据。
下面的原译文见于http://www.cnitblog.com/linghuye/archive/2005/09/08/2557.html
1.在一个Opengl Context(HGLRC)里创建的Texture不能在另一个Opengl Context中使用.
2.HPBUFFERARB PBuffer对象提供了一种Offsceen Render Target机制,类似于GDI的内存位图,DX的RenderSurface.属Opengl 1.3规范,wgl扩展形式.
2.创建PBuffer:
a.使用wglChoosePixelFormatARB获得指定属性特点的象素格式列表,随便选择1个,使用wglCreatePbufferARB创建一个OBuffer对象,取得该PBuffer的关联DC,创建一个Opengl Context,即PBuffer所关联的环境.
b.进入该PBuffer的Opengl context,作图.
3.使用wglBindTexImageARB将1个PBuffer关联到当前的纹理对象上,此后若渲染该纹理时将渲染PBuffer表面的数据,此时纹理对象仅是个傀儡,其关联的PBuffer才是真正的数据源.wglBindTexImageARB应该在PBuffer Context之外的Opengl context中调用.
4.使用wglReleaseTexImageARB把PBuffer从其之前关联的Texture对象上释放.在PBuffer被绑定到某Texture后,未释放之前,不得进入PBuffer的Context进行渲染.显然wglReleaseTexImageARB也应该在PBuffer Context之外的Opengl context中调用
5.Render to texture 仅是PBuffer的一种使用方式. 技巧:
a.使用glReadPixels读出PBuffer数据,然后在外部Context进行glDrawPixels,或glTexImageData,或直接图像输出,不会有Window Overlayclip 的限制.
6.使用glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE),使得渲染出的纹理数据自动构造为Mipmap.
7.可用于离线渲染。
8.问题:(From GDC Nvida)
• 每个PBO通常要有一个符合自己pixel格式的OpenGL Context
– PBO之间可通过wglShareLists()来共享纹理对象和显示列表
– 较难于管理,导致一些bug
• PBO之间的切换代价高
– wglMakeCurrent实现context的切换
• 每个PBO有自己的深度缓存、模板缓存和辅助缓存
– PBO之间不能共享深度缓存