有两种类型的“帧缓存关联图像”:纹理图像(texture images)和渲染缓存图像(renderbuffer images)。如果纹理对象的图像数据关联到帧缓存,OpenGL执行的是“渲染到纹理”(render to texture)操作。如果渲染缓存的图像数据关联到帧缓存,OpenGL执行的是离线渲染(offscreen rendering)

void glGenFramebuffers(GLsizei n, GLuint * ids);

第一个是要创建的帧缓存的数目,第二个是指向存储一个或者多个ID的变量或数组的指针。它返回未使用的FBO的ID。ID为0表示默认帧缓存,即window系统提供的帧缓存。当创建成功的时候,会在第二个参数 framebuffer 中生成 n 个之前没有使用过的 framebuffer objects 的 name。然后这些 name 会被标记为已使用。只创建FBO的name,bind之后才真正创建FBO

void glBindFramebuffer(GLenum target, GLuint id);

第一个参数target应该是GL_FRAMEBUFFER,第二个参数是FBO的ID号即framebuffer objects 的 name。id为0即默认的window提供的帧缓存,即解绑当前FBO。
新创建的 framebuffer object 是一个空间为 0,且初始状态为默认值的 framebuffer object,一个FBO有一个color attachment挂载点、一个depth attachment挂载点、一个stencil attachment挂载点。
同一时间一个 thread 的一 个 context 中只能有一个 framebuffer被使用,因此之后关于 framebuffer 的操作会直接操作
FBO可以通过调用glDeleteFramebuffers()来删除GL_FRAMEBUFFER ,而不会在使用 framebuffer object name 了
系统帧缓存和FBO区别为:FBO的attachment可以修改,FBO的buffer无法像framebuffer那样可以被swap到屏幕上,要先弄到framebuffer再swap,

渲染缓存对象(Renderbuffer Object)
另外,渲染缓存是为离线渲染而新引进的。它允许将一个场景直接渲染到一个渲染缓存对象中,而不是渲染到纹理对象中。渲染缓存对象是用于存储单幅图像的数据存储区域。该图像按照一种可渲染的内部格式存储。它用于存储没有相关纹理格式的OpenGL逻辑缓存,比如模板缓存或者深度缓存。

void glGenRenderbuffers(GLsizei n, GLuint * ids//renderbuffers);
void glDeleteRenderbuffers(GLsizei n, const Gluint* ids//renderbuffers)

renderbuffer就是FBO上关联的一块buffer或texture

void glBindRenderbuffer(GLenum target, GLuint renderbuffer);

target参数应该是GL_RENDERBUFFER
新创建的 renderbuffer object 是一个空间为 0,格式为GL_RGBA4,red, green, blue, alpha, depth, and stencil的像素位均为0,且初始状态为默认值的 renderbuffer object,作为当前GPU使用的RBO

void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);

渲染缓存被创建,没有任何数据存储区域,用该函数分配空间
第一个参数必须是GL_RENDERBUFFER。第二个参数可以是用于颜色的(GL_RGB,GL_RGBA,etc.),用于深度的(GL_DEPTH_COMPONENT),或者是用于模板的格式(GL_STENCIL_INDEX)。因为RBO是将作为FBO的color/depth/stencil attachment。第三四个参数Width和height是渲染缓存图像的像素维度,即RBO的尺寸。width和height必须比GL_MAX_RENDERBUFFER_SIZE_EXT小

FBO本身没有图像存储区,必须帧缓存关联图像(纹理或渲染对象)关联到FBO。(一个纹理可以被关联到多个FBO上,图像存储区可以被多个FBO共享。)FBO的buffer可以是RBO,还可以是texture

void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);

把一幅纹理图像(texture)关联到一个FBO。
第一个参数一定是GL_FRAMEBUFFER_,第二个参数是关联纹理图像的关联点,FBO的3个挂载点之一。一个帧缓冲区对象可以有多个颜色关联点(GL_COLOR_ATTACHMENT0, …, GL_COLOR_ATTACHMENTn),L_DEPTH_ATTACHMENT, 和GL_STENCIL_ATTACHMENT。第三个参数textureTarget在多数情况下是GL_TEXTURE_2D。第四个参数是纹理对象的ID号,(textureId被设置为0,那么纹理图像将会被从FBO分离)。最后一个参数是要被关联的纹理的mipmap等级
如果纹理对象在依然关联在FBO上时被删除,那么纹理对象将会自动从当前绑定FBO上分离。然而,如果它被关联到多个FBO上然后被删除,那么它将只被从绑定的FBO上分离,而不会被从其他非绑定的FBO上分离。

void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);

把渲染缓存对象关联到FBO
前两个参数和glFramebufferTexture2D()一样。第三个参数只能是GL_RENDERBUFFER,最后一个参数是渲染缓存对象的ID号

GLenum glCheckFramebufferStatus(GLenum target);

一旦关联图像(纹理和渲染缓存)被关联到FBO上,在执行FBO的操作前必须检查FBO的状态:完整或不完整。如果帧缓冲区状态是不完整的,那么任何绘制命令(glBegin(),glCopyTexImage2D()等等)都会失败
FBO完整性准则有:
(1)帧缓存关联图像的宽度和高度必须非零。
(2)如果一幅图像被关联到一个颜色关联点,那么这幅图像必须有颜色可渲染的内部格式(GL_RGBA, GL_DEPTH_COMPONENT, GL_LUMINANCE, etc)。
(3)如果一幅被图像关联到GL_DEPTH_ATTACHMENT,那么这幅图像必须有深度可渲染的内部格式(GL_DEPTH_COMPONENT,GL_DEPTH_COMPONENT24, etc)。
(4)如果一幅被图像关联到GL_STENCIL_ATTACHMENT,那么这幅图像必须有模板可渲染的内部格式(GL_STENCIL_INDEX,GL_STENCIL_INDEX8, etc)。
(5)FBO至少有一幅图像关联。
(6)被关联到FBO的缩影图像必须有相同的宽度和高度。
(7)被关联到颜色关联点上的所有图像必须有相同的内部格式。

OpenGL ES FBO相关推荐

  1. OpenGL ES之离屏渲染的帧缓冲区对象FBO的说明和使用

    一.什么是 FBO ? FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO). FBO 本身不能用于渲染,只有添加 ...

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

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

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

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

  4. 【OpenGL ES】帧缓冲区对象FBO

    1.FBO 使用OpenGL ES,一般要通过EGL来配置本地窗口系统,关于EGL的介绍可参照"[OpenGL ES]EGL简介"http://blog.csdn.net/ieea ...

  5. 以OpenGL/ES视角介绍gfx-hal(Vulkan) Framebuffer接口使用

    文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录) 草稿状态 以OpenGL/ES Framebuffer角度看,如果用gfx-hal(Vulkan)接口实现类似OpenGL/ES ...

  6. Android下Opengl ES实现单屏幕双眼显示

    http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在 ...

  7. 与context的关系_你还不知道 OpenGL ES 和 EGL 的关系?

    什么是 EGL EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信: 查询绘图表面的可用类型和配置: 创 ...

  8. 浅谈OpenGL、OpenGL ES

    最近研究安卓系统屏幕绘制这部分时,可谓是绞尽脑汁- 偶然得到家人的指点有了思路上的突破,实现了想要的功能.本篇文章结合<OpenGL编程指南>书籍的基础上,简单介绍一下OpenGL的结构. ...

  9. Android opengl es 3.0 + ndk 绘画涂鸦项目

    前言 写一个opengl es 3.0 + ndk 的绘画涂鸦项目,命名为白板哈哈哈,记录自己遇到的问题,顺便学到的知识整合一遍,算是对自己一段时间的总结. 项目地址:Whiteboard 如果对你有 ...

  10. OpenGL ES SDK for Android - 3

    Bloom 使用OpenGL ES 3.0的绽放效果. 绽放效果:强度从非常弱变为非常强烈. 该应用程序显示了bloom实现. 它绘制了以二维5x5阵列排列的立方体,只有对角线的阵列才绽放. 绽放效果 ...

最新文章

  1. python基础:python扩展包的安装方式
  2. Mac上 如何快速玩起rocksdb
  3. Pycharm Anaconda 安装dlib
  4. HttpsURLConnection 返回 400
  5. plsql视图添加表字段_教你不到两分钟,快速创建数据透视图
  6. android gradle fail,Android Studio更新后,Android Gradle CompilationFailedException
  7. 牛客 小a与星际探索 bfs
  8. 自适应输出表格(ASP版)
  9. scala学习笔记一------初步了解scala
  10. 【滤波器】基于matlab GUI高通+低通+带通+带阻FIR滤波器设计【含Matlab源码 699期】
  11. 我的所有的浏览器被hao123 挟持了,终极解决方案
  12. NVIDIA NCCL 源码学习(二)- bootstrap网络连接的建立
  13. 大数据和云计算技术周报(第102期)
  14. padding不会撑开盒子的情况
  15. 智能路由和SD-WAN孰优孰劣
  16. Thread--线程创建的三种方式
  17. Cloudera Manager中安装部署Livy服务
  18. 挑战5G测试 思博伦Vertex信道仿真器助力5G研发
  19. echars 3D地图为区域自定义颜色
  20. 移动视频监控业务技术分析

热门文章

  1. LATEX 快速入坑系列
  2. 安装出现Kernel not compiled with GPU support
  3. GROMACS Tutorial 6-Free Energy Calculations
  4. 代码写过300张可视化,为什么建议你用报表工具开发数据大屏?
  5. Pandoc 安装与使用
  6. android支付宝sdk流程,支付宝SDK
  7. Rectangling Panoramic Images via Warping算法要点分析
  8. MQ消息队列(一)什么是消息队列
  9. Latex + vscode + SumatraPdf配置的一些历程
  10. 理解 Joomla 的几个概念 - 读《Aprees.Begging.Joomla.From.Novice.to.Professional》