http://www.cnblogs.com/salam/p/4957250.html

片段操作图

  

  这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式。

  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[4] = { GL_COLOR_ATTACHMENT0,

                    GL_COLOR_ATTACHMENT1,

                    GL_COLOR_ATTACHMENT2,

                    GL_COLOR_ATTACHMENT3 };

glDrawBuffers ( 4, attachments );

通过GL_MAX_COLOR_ATTACHMENTS你可以查询支持最多的颜色数,支持最小的数目是4.

5.声明和使用着色器的输出

layout(location = 0) out vec4 fragData0;
layout(location = 1) out vec4 fragData1;
layout(location = 2) out vec4 fragData2;
layout(location = 3) out vec4 fragData3;

完整代码  

 
int InitFBO ( ESContext *esContext )
{
   UserData *userData = esContext->userData;
   int i;
   GLint defaultFramebuffer = 0;
   const GLenum attachments[4] =
   {
      GL_COLOR_ATTACHMENT0,
      GL_COLOR_ATTACHMENT1,
      GL_COLOR_ATTACHMENT2,
      GL_COLOR_ATTACHMENT3
   };

glGetIntegerv ( GL_FRAMEBUFFER_BINDING, &defaultFramebuffer );

// Setup fbo
   glGenFramebuffers ( 1, &userData->fbo );
   glBindFramebuffer ( GL_FRAMEBUFFER, userData->fbo );

// Setup four output buffers and attach to fbo
   userData->textureHeight = userData->textureWidth = 400;
   glGenTextures ( 4, &userData->colorTexId[0] );
   for (i = 0; i < 4; ++i)
   {
      glBindTexture ( GL_TEXTURE_2D, userData->colorTexId[i] );

glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA,
                     userData->textureWidth, userData->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 );

glFramebufferTexture2D ( GL_DRAW_FRAMEBUFFER, attachments[i],
                               GL_TEXTURE_2D, userData->colorTexId[i], 0 );
   }

glDrawBuffers ( 4, attachments );

if ( GL_FRAMEBUFFER_COMPLETE != glCheckFramebufferStatus ( GL_FRAMEBUFFER ) )
   {
      return FALSE;
   }

// Restore the original framebuffer
   glBindFramebuffer ( GL_FRAMEBUFFER, defaultFramebuffer );

return TRUE;
}

 
fsh代码
#version 300 es
precision mediump float;
layout(location = 0) out vec4 fragData0;
layout(location = 1) out vec4 fragData1;
layout(location = 2) out vec4 fragData2;
layout(location = 3) out vec4 fragData3;
void main()
{
    // first buffer will contain red color
    fragData0 = vec4 ( 1, 0, 0, 1 );
    // second buffer will contain green color
    fragData1 = vec4 ( 0, 1, 0, 1 );
    // third buffer will contain blue color
    fragData2 = vec4 ( 0, 0, 1, 1 );
    // fourth buffer will contain gray color
    fragData3 = vec4 ( 0.5, 0.5, 0.5, 1 );
}
我们可以使用帧缓冲对象来实现离屏渲染。帧缓冲对象支持下列操作

  1.只使用OpenGL ES 函数创建帧缓冲区对象。

  2.使用EGL context创建多个FBO。

  3.创建离屏颜色、深度、模板渲染缓冲区和纹理,把它们绑定到帧缓冲区对象上。

  4.通过多种缓冲区共享颜色、深度、模板缓冲区内容。

  5.把纹理作为颜色、深度直接关联到帧缓冲区,避免使用拷贝操作。

  6.FBO与无效FBO之间的复制。

  Framebuffer and Renderbuffer Objects帧缓冲对象与渲染缓冲对象

  渲染缓冲区对象是应用程序分配的2D图像缓冲区。渲染缓冲区被用来存储颜色、深度或模板值,能作为颜色、深度或模板关联到一个帧缓冲区对象。渲染缓冲区和操作系统提供的离屏的绘制窗口pbuffer 有很多相似的地方。渲染缓冲区不能直接被GL 作为纹理使用。

  FBO是一个颜色,深度和模板纹理或渲染目标的集合。各种2D 图像能被关联到帧缓冲区对象的颜色点上。

  

  创建FBO与RBO

  

  

  使用渲染缓冲区对象

  

注意在使用glBindRenderbuffer 绑定缓冲区前,glGenRenderbuffers 不要求去分配渲染缓冲区对象名字。虽然调用glGenRenderbuffers 是一个好的习惯,那仍然有很多应用程序在编译时为它们的缓冲区指定常量。应用程序能指定一个不使用的渲染缓冲区对象名字去执行glBindRenderbuffer。我们建议使用glGenRenderbuffers 返回的名字替代应用程序自己指定缓冲区名字。

  一旦渲染缓冲区对象被绑定,我们能指定渲染缓冲区内的存储的图像的尺寸和格式

  

  使用FBO

  

  

 

OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)的更多相关文章

  1. OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)

    片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓冲: OpenGL ES •• Color buffer颜色缓冲 •• Depth bu ...

  2. OpenGL ES 3.0之Fragment buffer objects(FBO)详解(二)

    我们可以使用帧缓冲对象来实现离屏渲染.帧缓冲对象支持下列操作 1.只使用OpenGL ES 函数创建帧缓冲区对象. 2.使用EGL context创建多个FBO. 3.创建离屏颜色.深度.模板渲染缓冲 ...

  3. OpenGL ES 3.0之VertexAttributes,Vertex Arrays,and Buffer Objects(九)

    顶点数据,也称为顶点属性,指每一个顶点数据.指能被用来描述每个顶点的数据,或能被所有顶点使用的常量值.例如你想绘制一个具有颜色的立方体三角形.你指定一个恒定的值用于三角形的所有三个顶点颜色.但三角形的 ...

  4. 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, ...

  5. OpenGL ES 2.0 渲染管线 学习笔记

    图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ...

  6. OpenGL ES 3.0 Graphics Pipeline

    一:OpenGL ES 3.0 Graphics Pipeline  渲染管道如下图 1.Vertex Buffer/Arrays Objects的数据由应用程序传进来 2.由上图可以看到Textur ...

  7. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  8. 《OpenGL® ES™ 3.0 Programming Guide》读书笔记1 ----总览

    OpenGL ES 3.0 Graphics Pipeline OpenGL ES 3.0 Vertex Shader Transform feedback: Additionally, OpenGL ...

  9. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

随机推荐

  1. JAVA Eclipse 教程

    http://www.runoob.com/eclipse/eclipse-tutorial.html

  2. java对象内存大小评估

    Java对象的内存布局:对象头(Header).实例数据(Instance Data)和对齐填充(Padding).无论是32位还是64位的HotSpot,使用的都是8字节对齐.也就是说每个java对 ...

  3. golang之http

    go获取html页面 package main import ( "fmt" "io/ioutil" "net/http" "ne ...

  4. MatserDetail自动展开

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windo ...

  5. P1489 猫狗大战

    P1489 猫狗大战 题目描述 新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只 ...

  6. 【python】正则表达式相关

    注意:Python3.X 的print要有括号, Python 2.x的不需要 放上学习时写的例子: import re m = re.match(r'(\w+) (\w+)(?P<sign&g ...

  7. Codeforces 702D Road to Post Office(模拟 + 公式推导)

    题目链接:http://codeforces.com/problemset/problem/702/D 题意: 一个人要去邮局取东西,从家到达邮局的距离为 d, 它可以选择步行或者开车,车每走 k 公 ...

  8. POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16625   Accepted: 5383 Descri ...

  9. Codeforces #447 Div2 E

    #447 Div2 E 题意 给出一个由有向边构成的图,每条边上有蘑菇,假设有 \(n\) 个蘑菇,那么第一次走过这条边可以获得 \(n\) 个蘑菇,第二次 \(n-1\),第三次 \(n-1-2\) ...

  10. P2819 图的m着色问题

    题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m ...