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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简单了解 VBO,FBO相关推荐

  1. OPENGL VBO,FBO和PBO

    转载自:http://hi.baidu.com/bfiyubfpgibjpqq/item/0897eb6a7c7f2d0aa0cf0f22 VBO:顶点缓冲对像. VBO其实没有用到GPU运算,也就是 ...

  2. OpenGL 开始学习指南

    近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenG ...

  3. UnityShader19:渲染纹理(上)之截屏功能实现

    一.渲染到 RT 渲染纹理(Render Texture) 就是游戏开发中经常被提到的 RT,渲染到 RT 本质上就是不将渲染的结果直接显示的屏幕上,而是存至一张指定的纹理中 在 Unity 中最简单 ...

  4. Android音视频开发详解

    概要:         1.课程从FFmpeg编译.Android Studio创建C++项目.Java调用C++.C++调用Java.C++多线程和线程锁.C++队列.OpenSL ES集成.FFm ...

  5. OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)

    OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏录制,解决透明冲突) 1.水印签名罢工了? 不知道大家有没注意到,之前我们使用MediaCodec录制的视频,水印签名那部分区 ...

  6. VBO, PBO与FBO(三)

    VBO, PBO与FBO(三) (2008-08-14 22:52:28) <script> var $tag='fbo,framebuffer,opengl,extension,it'; ...

  7. OpenGL ES VAO、VBO、EBO、FBO、PBO、TBO、UBO

    面试中经常被问到的 OpenGL ES 对象,你知道的有哪些? 该原创文章首发于微信公众号:字节流动 VBO 和 EBO VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EB ...

  8. VBO、FBO、PBO 学习总结贴 (OpenGL ES)

    这是几篇好文链接: VBO: http://blog.sina.com.cn/s/blog_4062094e0100aluv.html PBO: http://blog.sina.com.cn/s/b ...

  9. OpenGL VBO、VAO、EBO简单例子

    文章目录 VBO使用glDrawArrays()函数画梯形 在上一个例子的基础上改变背景颜色 VBO+VAO使用glDrawArrays()函数画梯形 VBO+VAO+片段着色器给梯形着色 EBO+V ...

最新文章

  1. 搜索插入位置的golang实现
  2. rabbitmq消费固定个数消息_SpringBoot+RabbitMQ (保证消息100%投递成功并被消费)
  3. python 搭建登陆系统_Django 搭建CMDB系统完整[1](用户登录)
  4. python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
  5. 17年9月计算机二级试题,9月计算机二级MSOffice练习试题
  6. Linux命令之find的用法
  7. 每个Xcode开发者应该知道的七个使用技巧
  8. JQuery 表单校验
  9. 使用 Storyboard Segue 实作 UIViewController 的切换 (实例)
  10. 收藏 | Python必备技能之 25个Matplotlib常用代码!
  11. 我设计了一个支撑数亿用户的系统
  12. 《集体智慧编程》第12章 算法总结 个人笔记
  13. 西宁公交调度员招聘计算机题库,调度员考试题库.doc
  14. QQ计数器统计器使用教程
  15. 65个最常见的面试问题与技巧性答复(面试技巧和注意事项),很不错,求职之前,多看看
  16. C语言实验——逆置正整数
  17. 计算机网络最新复习【太原理工大学】
  18. 计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析
  19. 书单|双十一必入的科普口碑好书
  20. Java基础项目:小鲨鱼记账系统

热门文章

  1. Chrome, Firefox(火狐), Edge 官方离线安装包下载
  2. 测试隔音软件,自己动手做汽车隔音,第一阶段效果测试!
  3. 教你如何把TXT文本转化成xls表格
  4. Mac和虚拟机内linux互传文件
  5. html转换成keynote,Keynote教程(一)——隐藏的功能知识
  6. vscode设置将英文界面设置为中文?
  7. 【最大子区间和】打水漂 rqnoj145
  8. iOS和Android即时通讯开发时后台实时消息推送的原理和区别
  9. wx2tt 微信小程序转头条小程序工具
  10. Win32汇编WG系列教程1——《植物大战僵尸5211314》