简单了解 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出现之前,我们是怎么离屏渲染的呢?
- 前面提到的glCopyTexImage2D;
- 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相关推荐
- OPENGL VBO,FBO和PBO
转载自:http://hi.baidu.com/bfiyubfpgibjpqq/item/0897eb6a7c7f2d0aa0cf0f22 VBO:顶点缓冲对像. VBO其实没有用到GPU运算,也就是 ...
- OpenGL 开始学习指南
近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenG ...
- UnityShader19:渲染纹理(上)之截屏功能实现
一.渲染到 RT 渲染纹理(Render Texture) 就是游戏开发中经常被提到的 RT,渲染到 RT 本质上就是不将渲染的结果直接显示的屏幕上,而是存至一张指定的纹理中 在 Unity 中最简单 ...
- Android音视频开发详解
概要: 1.课程从FFmpeg编译.Android Studio创建C++项目.Java调用C++.C++调用Java.C++多线程和线程锁.C++队列.OpenSL ES集成.FFm ...
- OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)
OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏录制,解决透明冲突) 1.水印签名罢工了? 不知道大家有没注意到,之前我们使用MediaCodec录制的视频,水印签名那部分区 ...
- VBO, PBO与FBO(三)
VBO, PBO与FBO(三) (2008-08-14 22:52:28) <script> var $tag='fbo,framebuffer,opengl,extension,it'; ...
- OpenGL ES VAO、VBO、EBO、FBO、PBO、TBO、UBO
面试中经常被问到的 OpenGL ES 对象,你知道的有哪些? 该原创文章首发于微信公众号:字节流动 VBO 和 EBO VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EB ...
- VBO、FBO、PBO 学习总结贴 (OpenGL ES)
这是几篇好文链接: VBO: http://blog.sina.com.cn/s/blog_4062094e0100aluv.html PBO: http://blog.sina.com.cn/s/b ...
- OpenGL VBO、VAO、EBO简单例子
文章目录 VBO使用glDrawArrays()函数画梯形 在上一个例子的基础上改变背景颜色 VBO+VAO使用glDrawArrays()函数画梯形 VBO+VAO+片段着色器给梯形着色 EBO+V ...
最新文章
- 搜索插入位置的golang实现
- rabbitmq消费固定个数消息_SpringBoot+RabbitMQ (保证消息100%投递成功并被消费)
- python 搭建登陆系统_Django 搭建CMDB系统完整[1](用户登录)
- python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
- 17年9月计算机二级试题,9月计算机二级MSOffice练习试题
- Linux命令之find的用法
- 每个Xcode开发者应该知道的七个使用技巧
- JQuery 表单校验
- 使用 Storyboard Segue 实作 UIViewController 的切换 (实例)
- 收藏 | Python必备技能之 25个Matplotlib常用代码!
- 我设计了一个支撑数亿用户的系统
- 《集体智慧编程》第12章 算法总结 个人笔记
- 西宁公交调度员招聘计算机题库,调度员考试题库.doc
- QQ计数器统计器使用教程
- 65个最常见的面试问题与技巧性答复(面试技巧和注意事项),很不错,求职之前,多看看
- C语言实验——逆置正整数
- 计算机网络最新复习【太原理工大学】
- 计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析
- 书单|双十一必入的科普口碑好书
- Java基础项目:小鲨鱼记账系统