OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)
片段操作图
  
这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式。
Buffers(缓冲)
OpenGL ES支持三种缓冲:
OpenGL ES
•• Color buffer颜色缓冲
•• Depth buffer深度缓冲
•• Stencil buffer模板缓冲
创建缓冲区
OpenGL ES 是一个交互式的渲染系统,假设每帧的开始,你希望初始化所有缓冲区中数据的默认值。调用glClear 函数来清除缓冲区内容,参数mask 指定清除的缓冲区。
  
你可能不要求清除每一个缓冲区,不在同时清除它们。但如果你想同时清除所有的缓冲区,只调用一次glClear 可以获得更好的性能。
  
  
  
如果你的帧缓冲区中有多个绘制缓冲,你也可以清除指定的缓冲区,如下:
  
为减少调用函数的次数,你可以同时清除深度和模板缓冲区内容,如下:
  
使用掩码来控制写入缓冲区
一般你可以控制对缓冲区的操作,哪部分可以写,哪部分不可写。在颜色缓冲区中,glColorMask 指定颜色缓冲区的组成里那部分可被更新。如果mask 被设为GL_FALSE,这个组成部分不能更新,默认值是GL_TRUE。对于深度同样
  
  
  
读取和写入像素到帧缓冲区
  
  
多渲染目标MRTs
MRTs允许应用程序同时渲染多个颜色缓冲区。下面是流程
1.创建帧缓冲对象framebuffer objects,使用
  glGenFramebuffers ( 1, &fbo );创建帧缓冲对象
  glBindFramebuffer ( GL_FRAMEBUFFER, fbo );绑定为当前使用的帧缓冲对象。
2.创建纹理对象
glGenTextures(4,textureId);创建
  glBindTexture ( GL_TEXTURE_2D, textureId );绑定
  glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA,
          textureWidth, textureHeight,
  0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
  // Set the filtering mode
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  GL_NEAREST );
  glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST );
3.帧缓冲对象绑定相关的纹理。
  glFramebufferTexture2D ( GL_DRAW_FRAMEBUFFER,
               GL_COLOR_ATTACHMENT0,
               GL_TEXTURE_2D,
               textureId, 0 );
4.指定渲染的附加颜色
glDrawBuffers(GLsizei n, const GLenum* bufs)
  
例如你可以使用4种颜色输出建立一个FBO对象
const GLenum attachments[] = { GL_COLOR_ATTACHMENT0,
                                                   GL_COLOR_ATTACHMENT1,
                                                   GL_COLOR_ATTACHMENT2,
                                                   GL_COLOR_ATTACHMENT3
                                                   };
glDrawBuffers ( , attachments );
通过GL_MAX_COLOR_ATTACHMENTS你可以查询支持最多的颜色数,支持最小的数目是4.
5.声明和使用着色器的输出
layout(location = ) out vec4 fragData0;
layout(location = ) out vec4 fragData1;
layout(location = ) out vec4 fragData2;
layout(location = ) out vec4 fragData3;
完整代码
int InitFBO ( ESContext *esContext )
{
UserData *userData = esContext->userData;
int i;
GLint defaultFramebuffer = ;
const GLenum attachments[] =
{
GL_COLOR_ATTACHMENT0,
GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2,
GL_COLOR_ATTACHMENT3
}; glGetIntegerv ( GL_FRAMEBUFFER_BINDING, &defaultFramebuffer ); // Setup fbo
glGenFramebuffers ( , &userData->fbo );
glBindFramebuffer ( GL_FRAMEBUFFER, userData->fbo ); // Setup four output buffers and attach to fbo
userData->textureHeight = userData->textureWidth = ;
glGenTextures ( , &userData->colorTexId[] );
for (i = ; i < ; ++i)
{
glBindTexture ( GL_TEXTURE_2D, userData->colorTexId[i] ); glTexImage2D ( GL_TEXTURE_2D, , GL_RGBA,
userData->textureWidth, userData->textureHeight,
, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); // Set the filtering mode
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glFramebufferTexture2D ( GL_DRAW_FRAMEBUFFER, attachments[i],
GL_TEXTURE_2D, userData->colorTexId[i], );
} glDrawBuffers ( , attachments ); if ( GL_FRAMEBUFFER_COMPLETE != glCheckFramebufferStatus ( GL_FRAMEBUFFER ) )
{
return FALSE;
} // Restore the original framebuffer
glBindFramebuffer ( GL_FRAMEBUFFER, defaultFramebuffer ); return TRUE;
}
fsh代码
#version es
precision mediump float;
layout(location = ) out vec4 fragData0;
layout(location = ) out vec4 fragData1;
layout(location = ) out vec4 fragData2;
layout(location = ) out vec4 fragData3;
void main()
{
// first buffer will contain red color
fragData0 = vec4 ( , , , );
// second buffer will contain green color
fragData1 = vec4 ( , , , );
// third buffer will contain blue color
fragData2 = vec4 ( , , , );
// fourth buffer will contain gray color
fragData3 = vec4 ( 0.5, 0.5, 0.5, );
}
OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)的更多相关文章
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)
		http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ... 
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解(二)
		我们可以使用帧缓冲对象来实现离屏渲染.帧缓冲对象支持下列操作 1.只使用OpenGL ES 函数创建帧缓冲区对象. 2.使用EGL context创建多个FBO. 3.创建离屏颜色.深度.模板渲染缓冲 ... 
- OpenGL ES 3.0之VertexAttributes,Vertex Arrays,and Buffer Objects(九)
		顶点数据,也称为顶点属性,指每一个顶点数据.指能被用来描述每个顶点的数据,或能被所有顶点使用的常量值.例如你想绘制一个具有颜色的立方体三角形.你指定一个恒定的值用于三角形的所有三个顶点颜色.但三角形的 ... 
- Beginning OpenGL ES 2.0 with GLKit Part 1
		Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ... 
- OpenGL ES 2.0 渲染管线 学习笔记
		图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ... 
- OpenGL ES 3.0 Graphics Pipeline
		一:OpenGL ES 3.0 Graphics Pipeline 渲染管道如下图 1.Vertex Buffer/Arrays Objects的数据由应用程序传进来 2.由上图可以看到Textur ... 
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
		在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ... 
- 《OpenGL® ES™ 3.0 Programming Guide》读书笔记1 ----总览
		OpenGL ES 3.0 Graphics Pipeline OpenGL ES 3.0 Vertex Shader Transform feedback: Additionally, OpenGL ... 
- 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)
		在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ... 
随机推荐
- ubuntu中chown设置文件权限
			参考文献: http://yanwen.org/doc/chown.html http://www.cppblog.com/deercoder/articles/110129.html 可以通过ls ... 
- 如何用visio(word)绘制图片表格
			1.用visio是插入excel表格,但是不能差如公示了,修改的话也是进入了excel修改. 2.在word里修改即可,word表格可以插入公式,然后阿银玉兰或者转给pdf截图就好 
- 报错:Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
			在保存数据的时候报这个错误,知道是验证错误,但到底是哪个属性验证错误呢? →打断点,运行,观察程序出错的地方→在出错的部分添加try...catch语句块→添加监视,输入((System.Data.E ... 
- 报错:System.Data.Entity.Validation.DbEntityValidationException: 对一个或多个实体的验证失败
			使用MVC和EF,在保存数据的时候报错:System.Data.Entity.Validation.DbEntityValidationException: 对一个或多个实体的验证失败.有关详细信息, ... 
- C# 连接Oracle数据库,免安装oracle客户端
			一.方案1 首先下面的内容,有待我的进一步测试和证实.18.12.20 被证实了,还需要安装Oracle客户端,或者本机上安装oracle数据库软件. 18.12.20 1.下载Oracle.Mana ... 
- Tomcat 负载均衡 及Session共享
			原文:https://www.sunjianhua.cn/archives/tomcat-high-availability.html 一.安装java环境 二.安装tomcat(apache-tom ... 
- 对ORM的支持 之 8.4 集成JPA ——跟我学spring3
			8.4 集成JPA JPA全称为Java持久性API(Java Persistence API),JPA是Java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有Hibernate. ... 
- Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析
			http://blog.csdn.net/u014231734/article/details/41913775 情况说明: 之前下载了 Android Studio 1.0rc2候选版,那时候把 S ... 
- Android之对TabActivity的见解,个人觉得不错
			http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html answer1991 无法停止我内心的狂热,对未来的执着. Andr ... 
- Java中线程池,你真的会用吗?
			在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ... 
