【OpenGL学习】使用VBO和FBO

一、概念

这两个都是Buffer Object,说白了就是一块存储区域。 VBO(顶点缓冲对像)是用来加快渲染的速度,主要思想是在显卡中分配一块显存空间,然后一次性将CPU中的数据传输过来,这样显示的时候就会直接输出到显示器,这样做的动机是因为CPU到GPU传输的瓶颈。 FBO(帧缓冲对像)是用来改变当前帧缓存的输出位置,默认的帧缓存会直接输出到显示器,而有的时候不需要输出到显示器,在后台渲染就可以,这个技术叫离屏渲染,渲染完之后再用该纹理进行操作,最终再以某种形式输出到屏幕,其实类似于以前用的双缓冲显示技术。

二、使用方法

http://www.cppblog.com/w2001/archive/2008/05/10/49376.aspx,其核心在于顶点数据的修改和上传,具体见这里:http://blog.csdn.net/dreamcs/article/details/7702701

和VBO类似的还有个概念叫VA,具体见:http://blog.csdn.net/dreamcs/article/details/7699603,和VBO的不同体现在VA不能修改,只能初始化的时候指定,效率比VBO要高,因为其直接放在了显存中。这里对显示列表和VBO有更详尽的描述和使用方法:http://www.cppblog.com/zmj/archive/2009/01/01/2820.html

FBO的使用方法:http://blog.sina.com.cn/s/blog_4062094e0100alvv.html以及http://www.cnblogs.com/Fancyboy2004/archive/2008/06/02/1212312.html,后者有和Shader结合的代码示例。特别注意的是FBO可以绑定多个对象,即多个纹理,可以通过glDrawBuffers()函数来切换当前的渲染对象,可以很方便地在几个渲染对象之间切换,这正是FBO的精髓所在。同时在FBO中可以使用Shader来进行操作,操作完之后再关闭shader,这样可以高效的完成渲染操作。

三、一些技巧

1.在做每一个VBO对象渲染的时候最好用glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);和glPopAttrib();两句话将对象内部和外部隔离开来,这样在渲染时候做的一些状态的修改不会影响到全局的参数。这个地方我就耽误的了就,一直查不到原因。不过更好的一个习惯是用完了某一个状态后要记得把该状态改回来。

四、参考文献

见文中链接。

原文地址:https://www.cnblogs.com/xweiwei/p/2732537.html