Linux OpenGL 实践篇-10-framebuffer
在之前的实践中我们都是在当前的窗口中渲染,即使用的缓存都是由glutCreateWindow时创建的缓存,我们可称之为默认缓存。它是唯一一个可以被图形服务器的显示系统识别的帧缓存,我们在屏幕上看到的只能是这个缓存。
虽然我们可以对这个缓存作非常多的操作,应用不同的技术,但在不同的缓存间迁移大量的数据,我们还需要很多的操作,而帧缓存对象(framebuffer object)就是为此存在的。帧缓存可以实现理屏渲染技术、纹理贴图的更新、以及缓存乒乓技术(GPGPU用到的一种数据传输技术)的实现非常的有意义,但需要注意的是,应用程序创建的帧缓存是不能与窗口系统的缓存关联的,窗口系统有一套自己的缓存对象。
下面我们将实现离屏渲染,并把渲染的结果拷贝回默认缓存显示。
创建帧缓存
创建缓存对象的过程和OpenGL创建其它对象的过程非常类似,使用glGenFramebuffers和glBindFramebuffer,同时使用glFramebufferParameteri设置帧缓存对象的参数。
glGenFramebuffers(,&fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
创建渲染缓存
渲染缓存(renderbuffer)是OpenGL管理的一处高效的内存区域,它可以存储格式花的图像数据。渲染缓存的数据必须关联到帧缓存对象才有意义,并且要保证图像缓存的格式必须与OpenGL要求的渲染格式相符。
创建渲染缓存和创建帧缓存的步骤类似,分别使用glGenRenderbuffers和glBindRenderbuffer,使用glRenderbufferStorage分配存储空间和设置图像格式。
glGenRenderbuffers(,&rbo);
glBindRenderbuffer(GL_RENDERBUFFER,rbo);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA,width,height);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,rbo); //把渲染缓存关联到帧缓存
拷贝到默认缓存
创建好帧缓存和默认缓存后,我们就可以开始绘制了,首先我们设置绘制的目标为我们创建的帧缓存,不再绘制到默认缓存中。
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
然后正常绘制场景,这个时候图像的数据都会存储到fbo的存储空间中。
接着我们以这个帧缓存为源,以默认帧缓存为目标开始拷贝。
//指定绘制到创建的帧缓存中
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glViewport(,,width,height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //渲染
tShader->Use();
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES,,); //指定缓存操作的源和目的
glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,); glViewport(,,width,height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //拷贝
glBlitFramebuffer(,,width,height,,,width,height,GL_COLOR_BUFFER_BIT,GL_NEAREST);
glBlitFramebuffer(,,width,height,,,,,GL_COLOR_BUFFER_BIT,GL_NEAREST);
glFlush();
最终效果:

Linux OpenGL 实践篇-10-framebuffer的更多相关文章
- Linux OpenGL 实践篇-4 坐标系统
OpenGL中顶点经过顶点着色器后会变为标准设备坐标系.标准设备坐标系的各坐标的取值范围是[-1,1],超过这个范围的点将会被剔除.而这个变换的过程可描述为顶点在几个坐标系统的变换,这几个坐标系统为: ...
- Linux OpenGL 实践篇-3 绘制三角形
本次实践是绘制两个三角形,重点理解顶点数组对象和OpenGL缓存的使用. 顶点数组对象 顶点数组对象负责管理一组顶点属性,顶点属性包括位置.法线.纹理坐标等. OpenGL缓存 OpenGL缓存实质上 ...
- Linux OpenGL 实践篇-14-多实例渲染
多实例渲染 OpenGL的多实例渲染是一种连续执行多条相同的渲染命令的方法,并且每条命令产生的结果都有轻微的差异,通常用于渲染大量的几何物体. 设想一个场景,比如太空,我们需要渲染数以万记的星球,如果 ...
- Linux OpenGL 实践篇-11-shadow
OpenGL 阴影 在三维场景中,为了使场景看起来更加的真实,通常需要为其添加阴影,OpenGL可以使用很多种技术实现阴影,其中有一种非常经典的实现是使用一种叫阴影贴图的实现,在本节中我们将使用阴影贴 ...
- Linux OpenGL 实践篇-6 光照
经典光照模型 经典光照模型通过单独计算光源成分得到综合光照效果,然后添加到物体表面特定点,这些成分包括:环境光.漫反射光.镜面光. 环境光:是指不是来特定方向的光,在经典光照模型中基本是个常量. 漫反 ...
- Linux OpenGL 实践篇-5 纹理
纹理 在之前的实践中,我们所渲染的物体的表面颜色都是纯色或者根据顶点位置计算出的一个颜色,这种方式在表现物体细节方面是比较吃资源的,因为我们每增加一个细节,我们就需要定义更多的顶点及其属性.所以美术人 ...
- Linux OpenGL 实践篇-2 创建一个窗口
OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...
- Linux OpenGL 实践篇-1 OpenGL环境搭建
本次实践所使用环境为CentOS 7. 参考:http://www.xuebuyuan.com/1472808.html OpenGL开发环境搭建: 1.opengl库安装 opengl库使用mesa ...
- Linux OpenGL 实践篇-16 文本绘制
文本绘制 本文主要射击Freetype的入门理解和在OpenGL中实现文字的渲染. freetype freetype的官网,本文大部分内容参考https://www.freetype.org/fre ...
随机推荐
- Linux查看当前在线用户信息
Linux是多用户系统,支持同时登陆多个用户,在终端中用"w"命令可以查看当前的在线用户,以及每个用户正在执行的进程: 第一行显示的字段信息分别是: 12:16:49:系统当前时间 ...
- java 后台的学习步骤
一.JavaWeb部分 第一阶段:JavaWeb前端技术 web前端技术 HTML, CSS, JavaScript基础, jQuery基础, BootStrap. 第二阶段:服务器端技术 Mysql ...
- robotframework:appium切换webview后,在webview里滑动屏幕
问题: 在用robot写手机淘宝app的自动化时,打开手机淘宝后,点击天猫国际,跳转到天猫国际页面,天猫国际页面是H5, 需要切换到对应的webview,切换到webview后,点击美妆菜单,跳转到美 ...
- CodeForces 1103C. Johnny Solving
题目简述:给定简单(无自环.无重边)连通无向图$G = (V, E), 1 \leq n = |V| \leq 2.5 \times 10^5, 1 \leq m = |E| \leq 5 \time ...
- CSA Round #50 (Div. 2 only) Min Swaps(模拟)
传送门 题意 给出一个排列,定义\(value为\sum_{i=1}^{n-1}abs(f[i+1]-f[i])\) \(swap(a[i],a[j])(i≠j)为一次交换\),询问最少的交换次数使得 ...
- SDUT2161:Simple Game(NIM博弈+巴什博弈)
传送门 题意 n堆石子,每次可以取一堆至三堆任意非零石子数,取完者赢,问最后谁能赢 分析 以前我们做过NIM博弈是对一堆进行操作,现在换成了三堆,其实对于n堆都一样一堆的情况 如果最后二进制每位数的1 ...
- poj1015【DP.......无奈了】
首先,读题,真是一窍不通.后来看完程序的意思,才明白吧.. 题意: n个人中选m个,条件是取sum|D-P|最小,当有|D-P|相同的时候取|D+P|最大的.然后输出那些m个人的sumD,sumP,最 ...
- 3DMAX 8 角色建模2 身体
身体 20 25 60 分段 3 2 3 位置直接设置到-12.5 0 0,删除内部面,实例镜像出另一半x偏移25 1 身体大体形状 ,,,, 2 背阔肌 , 3腹肌 4 臀部 ,, 5 肩部 调整点 ...
- python __builtins__ 函数
dir(__builtins__) 1.'abs', 对传入参数取绝对值 abs(x, /) Return the absolute value of the argument. >>&g ...
- P5165 xtq的棋盘
传送门 设\(f[i]\)为\(i\)位置向左走一步的期望时间,那么答案就是\(\sum_{i=1}^mf[i]\) 首先\(f[n]=1\),设\(p\)为向左的概率,对于\(i<n\)的位置 ...