简单了解 VBO,FBO

OpenGL是个状态机,我们通常见到的glEnable - glDisable函数就是通知OpenGL开启/关闭某种状态的,譬如光照、深度检测等等,故此得名。

VBO (Vertex buffer object)

VBO就是通过几个函数,是显卡存储空间里一块缓存区BUFFER,用于存储和顶点以及其属性相关的信息(顶点信息,颜色信息,法线信息,纹理坐标信息和索引信息等),那么为什么会产生这种方式呢?

解决什么问题: 由于最早的openGL不支持实例化绘制,导致在绘制大量相似图元的时候,需要反复向GPU提交代码渲染,这点在OpenGL中的二次方图元和实例化绘制已经提到过了,会严重导致瓶颈效应。

VBO其实就是显卡中的显存,为了提高渲染速度,可以将要绘制的顶点数据缓存在显存中,这样就不需要将要绘制的顶点数据重复从CPU发送到GPU, 浪费带宽资源。

VBO + IBO

const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0
};

初始化:

 

 1. glGenBuffers(1, &_vboID);  //生成一个句柄
 2. glBindBuffer(GL_ARRAY_BUFFER, _vboID); //绑定
   //copy the data into the buffer object
3. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

使用:

 

glEnableVertexAttribArray(_positionSlot);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

glEnableVertexAttribArray(_colorSlot);
glVertexAttribPointer(_colorSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL+sizeof(GL_FLOAT)*3);

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
               GL_UNSIGNED_BYTE, 0);

清除:

 

glDeleteBuffers(1,&nVBOVertices); //删除句柄,同时删除server端顶点缓冲

Demo-新增VBO绘制方式

VAO (Vertex Array object)

在 GL3.0开始的新标准,你大概会留意到传统的绘图方式(glVertex)已经要被废掉了,不仅如此,以最高绘制速度为标记的显示列表方式也已经被印上deprecated了。
GL3.0时代新增了很多辅助役,VAO则是一个容器,可以包括多个VBO, 它类似于以前的call list, 由于它进一步将VBO容于其中,所以绘制效率将在VBO的基础上更进一步。

使用方式上,也是和 VBO 大抵差不多。

FBO (Frame Buffer Object)

FBO

FBO出现之前,我们是怎么离屏渲染的呢?

  1. 前面提到的glCopyTexImage2D;
  2. glDrawBuffers(size, *p)。

可以把在帧缓冲渲染转移到离屏off screen中, 使用FBO的优点

  • FBOs aren’t limited to the size of your window.
  • Textures can be attached to FBOs, allowing direct rendering to textures without an explicit glCopyTexImage.
  • FBOs can contain multiple color buffers, which can be written to simultaneously from a fragment shader.

“帧缓存关联图像”

纹理图像(texture images)和渲染缓存图像(renderbuffer images)。如果纹理对象的图像数据关联到帧缓存,OpenGL执行的是“渲染到纹理”(render to texture)操作。如果渲染缓存的图像数据关联到帧缓存,OpenGL执行的是离线渲染(offscreen rendering).

整个过程是这样的:

在预处理中,新建一个FBO对象,用Bind绑定到当前(这些BIND之类函数一般是表示“你接下来要处理这个对象啦”的意思),给FBO输入渲染缓存或纹理,检查FBO状态是否正确,再脱离绑定。渲染过程,在需要它时再一次绑定,指定把接下来的内容渲染到它里面的哪一个渲染缓存或纹理......脱离绑定,使用之。

 

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);

注意点:

  • 切换渲染到屏幕和FBO需要, glBindFramebuffer(GL_FRAMEBUFFER,0)
  • openGL渲染的东西会保留,所以切换也需要进行 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|...)

RBO (Render Buffer Object)

RBO 是一块2D图像缓存,能够用于存储color,depth,stencil值,也就是可以作为
fbo的color或depth或stencil attachment。但是这个rbo不能直接作为纹理使用。

http://blog.csdn.net/ldpxxx/article/details/17304273

renderbufferStorage 关联屏幕渲染, 缓冲区中最后显示在屏幕[_context presentRenderbuffer: GL_RENDERBUFFER ];

PBO (Pixel Buffer Object)

待续......

参考:
VBO
FBO
PBO



作者:osbornZ
链接:https://www.jianshu.com/p/283b2f57d7a9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在OpenGL中,VAO(Vertex Array Object)、VBO(Vertex Buffer Object)、EBO(Element Buffer Object)和FBO(Framebuffer Object)是四个常用的对象,用于管理渲染管线的数据和帧缓冲区。 1. VAO(Vertex Array Object):VAO是用于存储顶点属性配置的对象。它保存了顶点属性数组的状态,包括顶点坐标、法线、颜色、纹理坐标等。VAO记录了顶点属性数据在内存中的布局和访问方式,并提供了一种方便的方式来绑定和配置顶点属性。 2. VBO(Vertex Buffer Object):VBO是用于存储顶点数据(如顶点坐标、法线、颜色、纹理坐标等)的缓冲区对象。它可以用来高效地传输大量的顶点数据到GPU,并在渲染时供顶点着色器使用。VBO可以存储顶点数据的位置、颜色、法线等信息,并且可以根据需要进行更新。 3. EBO(Element Buffer Object):EBO是用于存储索引数据的缓冲区对象。它可以用来优化渲染过程中对重复顶点的处理,通过存储顶点索引来共享顶点数据。使用EBO可以减少存储和传输的数据量,提高渲染效率。 4. FBO(Framebuffer Object):FBO是用于渲染到纹理或渲染缓冲区的对象。它允许将渲染结果输出到自定义的帧缓冲区中,而不是默认的帧缓冲区。通过将纹理或渲染缓冲区附加到FBO上,可以在渲染过程中捕获渲染结果,进行离屏渲染、渲染到纹理、多重渲染等操作。 这些对象在OpenGL中起到不同的作用,常常一起使用来管理和处理图形渲染所需的数据和帧缓冲区。它们在渲染管线中起到关键的作用,提供了高效、灵活的图形渲染方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值