Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1349434
  • 博文数量: 281
  • 博客积分: 8800
  • 博客等级: 中将
  • 技术积分: 3346
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 22:31
文章分类

全部博文(281)

文章存档

2013年(1)

2012年(18)

2011年(16)

2010年(44)

2009年(86)

2008年(41)

2007年(10)

2006年(65)

我的朋友

分类: 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之间不能共享深度缓存

阅读(3265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~