OpenGL FBO 初探

参考:http://www.gamedev.net/page/resources/_/technical/opengl/opengl-frame-buffer-object-101-r2331 

  http://www.zwqxin.com/archives/opengl/learn-fbo.html

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

 

  1. 生成句柄 GLuint fbo;
  2. 生成带有句柄的FBO glGenFramebuffersEXT(1, &fbo);
  3. 绑定 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo)

单独的FBO用处不大。我们需要用它来挂载对象。能够与FBO挂接的对象有两种,一种是纹理对象(texture object),另一种是渲染缓冲区对象(renderbuffer object)。纹理对象,就是我们平日为模型设置纹理贴图时使用的对象;而渲染缓冲区对象可以用作不具有纹理格式的缓冲区,如深度缓冲区和模板缓冲区。当然,渲染缓冲区对象也可以用来渲染场景。

GLuint depthbuffer;
glGenRenderbuffersEXT(1, &depthbuffer);//成功之后,需要绑定才能使用
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);//欧了,可以用了,depthbuffer就是句柄
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height); //分配存储空间width*height




At this point the renderbuffer doesn’t have any storage space associated with it, so we need to tell OpenGL how we want to use it and what size we’d like. In this case we are asking for a depth buffer of a certain size:

glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height); Upon successful completion of the above code OpenGL will have allocated space for the renderbuffer to be used as a depth buffer with a given width and height. Note that renderbuffers can be used for normal RGB/RGBA storage and could be used to store stencil information.

Having reserved the space for the depth buffer the next job is to attach it to the FBO we created earlier.

总结:

步骤和FBO一样,只是多了一个指定renderbuffer大小的操作

  1. GLuint depthbuffer;
  2. glGenRenderbuffersEXT(1, &depthbuffer);
  3. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);

指定renderbuffer的大小 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height);

 

最后的扫尾动作:

  1. glDeleteFramebuffersEXT(1, &fbo);
  2. glDeleteRenderbuffersEXT(1, &depthbuffer);
posted @ 2012-02-02 09:24  maadiah  阅读(1471)  评论(0编辑  收藏  举报