OpenGL-ES 学习(8) ---- FBO

news2024/11/23 3:38:55

目录

      • FBO OverView
      • FBO 优点
      • 使用FBO的步骤

FBO OverView

FBO(FrameBuffer Object) 指的是帧缓冲对象,实际上是一个可以添加缓冲区容器,可以为其添加纹理或者渲染缓冲区对象(RBO)
FBO(FrameBuffer Object) 本身不能用于渲染,只有添加了纹理或者纹理缓冲区之后才可以作为渲染目标,而且它仅且提供了三类附着,分别是颜色附着,模板附着和深度附着

和顶点缓冲区不同,FBO 不能通过共享上下文的方式进行共享

在 opengl-es 可以通过共享上下文方式进行共享的资源有:

  • 纹理
  • shader
  • program 着色器程序
  • buffer 类对象,比如 VBO,EBO,RBO 等

不能通过共享上下文方式进行共享的资源有:

  • VAO 顶点数组对象(非Buffer类对象)
  • FBO 帧缓冲对象(非Buffer类对象)

这里需要说明的是,在不可以共享的资源中,FBOVAO属于资源管理型对象,FBO负责管理几种缓冲区,本身不占用资源,VAO负责管理VBO或者EBO,本身也不占用资源
RBO(Render Buffer Object) 是渲染缓冲区对象,是一个由应用程序分配的2D图像缓冲区,渲染缓冲区可以用于分配和存储颜色、深度或者模板值,可以用作FBO中的颜色、深度和模板附着
如果要使用FBO作为渲染目标,首先要为FBO添加连接对象,比如颜色附着需要连接纹理或者渲染缓冲区对象的颜色缓冲区

FrameBuffer object

FBO 优点

默认情况下,opengl-es通过绘制到窗口系统提供的帧缓冲区,然后将帧缓冲区对应的区域复制到纹理来实现渲染到纹理,但是此方法只有在纹理尺寸小于或等于帧缓冲区尺寸才有效

另一种方式是使用连接到纹理的 Pbuffer 来实现渲染到纹理,但是与上下文和窗口系统提供的可绘制表面切换开销也很大,因此,引入了帧缓冲区对象 FBO 来解决此问题
opengl-es 的场景中,有一些成绩不需要渲染到屏幕,比如在后台利用GPU实现一些图像转换,缩放等操作,这个时候就可以使用FBO
相对于渲染到屏幕,FBO渲染不改变图像的分辨率,在图像处理算法中比较常用

FBO(FrameBuffer object) 渲染是渲染到离屏的Buffer中,可以使用glReadPixels的方式将渲染后图像读出来

使用FBO的步骤

  • 创建一个 FBO 并且创建一个2D 纹理用于连接 FBO 的颜色附着
  • glBindFramebuffer 绑定FBO
  • glDrawElements 进行绘制
  • glBindFramebuffer 解绑FBO

如果要等待绘制完成需要添加如下步骤:

  • glFinish 等待绘制完成
  • 可以通过 glReadPixels 将绘制的内容保存下来

参考代码如下:

static int initInternal(ESContext* esContext) {
    UserData *userData = esContext->userData;

    ......

    // gen bo & bind to texture
    glGenFramebuffers(1, &userData->FrameBufferObject);
    glBindFramebuffer(GL_FRAMEBUFFER, userData->FrameBufferObject);

    // Add color attachement
    glGenTextures(1, &userData->textureIdFbo );
    glBindTexture(GL_TEXTURE_2D, userData->textureIdFbo);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, test_width, test_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, userData->textureIdFbo, 0);

    // Add depth attachement
    glGenRenderbuffers(1, &userData->textureIdDepth);
    glBindRenderbuffer(GL_RENDERBUFFER, userData->textureIdDepth);
    glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT16, test_width, test_height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, userData->textureIdDepth);
  
    // 检查 FBO 完整性
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE) {
        printf("Framebuffer not complete: %d\n", status);
        return GL_FALSE;
    }
    userData->dumpCount = 0;
    return GL_TRUE;
}

static int drawLoopInternal(ESContext* esContext) {
    ... 
    
    // dump fbo buffer
    glFinish();
    if(userData->dumpCount < 10) {
        glBindFramebuffer(GL_FRAMEBUFFER, userData->FrameBufferObject);
        unsigned char* data = (unsigned char*)malloc(sizeof(unsigned char)*test_width*test_height*4);
        if(data == NULL) {
            printf("malloc data failed \n");
            return 0;
        }
     
        glReadPixels(0, 0, test_width, test_height, GL_RGBA, GL_UNSIGNED_BYTE, data);
        sprintf(fileName,"./dumpfile/output_%d.ppm", userData->dumpCount);
        saveImagePPM(fileName, data, test_width, test_height);
        printf("save %s success!\n", fileName);
        free(data);
        userData->dumpCount++;
    } else {
        printf("dump finished! exit!\n");
        exit(0);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JS】如何给fetch添加超时功能

前言 Ajax有两种方式实现请求&#xff0c;分别是xhr和fetch&#xff0c;前者有超时功能&#xff0c;fetch则不然。下文尝试给fetch添加超时功能。 实现 使用终止器&#xff0c;在controller.abort()时便会在使用其signal信号的fetch函数发送一个终止信号&#xff0c;请求就会…

PTA 求整数的位数及各位数字之和

对于给定的正整数N&#xff0c;求它的位数及其各位数字之和。 输入格式&#xff1a; 输入在一行中给出一个不超过109的正整数N。 输出格式&#xff1a; 在一行中输出N的位数及其各位数字之和&#xff0c;中间用一个空格隔开。 输入样例&#xff1a; 321输出样例&#xff…

maven进阶(超详细)

多模块开发 1.抽取entity模块 将先前的SSMProject01项目中的entity文件夹抽取出来&#xff0c;成为一个独立的模块 在SSMProject01项目中引入maven_03_entity 首先找到maven_03_entity的pom文件 直接引入SSMProject01 尝试编译&#xff08;compile&#xff09;SSMProject01项…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Vue自己实现监视数据、Vue.set创建属性、Vue监视数据的原理

目录 1. 自己实现监视数据2. 使用Vue.set创建一个数据属性3. Vue监视数据的原理 1. 自己实现监视数据 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body&g…

【blender小技巧】如何拆分模型、合并和删除模型,删除多余骨骼

文章目录 前言进入面选择模式选取全部面拆分模型1、选中项——单独拆分2、按材质——按材质拆分3、按按松散块 合并模型删除模型某一块删除多余骨骼1、手动删除2、使用CATS插件的Fix Model 最终效果完结 前言 有时候&#xff0c;我们得到的模型是一个整体&#xff0c;想修改其…

VUE使用过程中的问题记录

现象1&#xff1a;npm run dev卡住不动 现象 问题原因&#xff1a; template 里面放一个元素我放了两个&#xff0c;改成一个好了

手机录音怎么降噪提取人声?四种高效提取人声的软件介绍!

手机录音怎么降噪提取人声&#xff1f;在日常生活中&#xff0c;手机录音成为了我们记录声音和音乐的重要工具。然而&#xff0c;录音时常会受到背景噪音的干扰&#xff0c;这不仅影响了音质&#xff0c;也使得人声的提取变得困难。为了帮助您更好地处理录音文件&#xff0c;我…

SAP Withholding Tax

SAP系统中的Withholding Tax&#xff08;预扣税&#xff09;配置是一个详细的过程&#xff0c;涉及到多个步骤和组件。以下是一些关键步骤和配置要点的概述&#xff1a; 定义业务地点&#xff1a;为公司所拥有的每个税务扣除账户号码&#xff08;TAN&#xff09;创建业务地点 。…

TPM管理培训:线上VS线下,哪种方式更胜一筹?

线上和线下的TPM管理培训各有优势&#xff0c;无法简单地评判哪种更胜一筹&#xff0c;而是要根据具体需求和实际情况来选择&#xff0c;深圳天行健TPM管理咨询公司解析如下&#xff1a; - 线上机构的优势 1.灵活性高&#xff1a;学员可以在任何有网络的地方进行学习&#xff…

SD卡数据恢复怎么做?一键恢复全攻略来了!

在数字时代&#xff0c;SD卡是我们用来存照片、视频和重要文件的小帮手。但有时候&#xff0c;如果不小心删了东西、误格式化了卡&#xff0c;或者设备出了点小问题&#xff0c;SD卡里的数据就可能找不到了。这时候&#xff0c;一款好用的SD卡数据恢复软件就能帮我们找回丢失的…

深入浅出消息队列----【如何保证消息不丢失?】

深入浅出消息队列----【如何保证消息不丢失&#xff1f;】 消息流转链路生成且发送消息流程存储流程消费流程 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 消息流转链路 消息从…

斯坦福大学研究人员,推荐的课题申报AI提示词分享

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 斯坦福大学心血管医学部研究人员创建了一个 GitHub 仓库&#xff0c;以汇集和整理使用AI帮助科研人员撰写更具竞争力的基金申请书。 以下是该Github仓库分享的好用的基金文本撰…

碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台

目录 0 专栏介绍1 基于多边形的碰撞检测2 碰撞检测仿真平台搭建2.1 多边形实例2.2 外部服务接口2.3 Rviz插件化 3 案例演示3.1 功能介绍3.2 绘制多边形 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战…

Ryzen 9000X3D还没来,先等来了R5 7600X3D

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; R5 7600X3D或于下月初推出&#xff0c;6核12线程102MB缓存 昨天我们刚刚聊过Ryzen 9000在欧洲部分地区开售即打折的“骚操作”&#xff0c;上周我们也曾分享过R9 9900X和R9 9950X首周在德不过50…

智慧水务平台主要帮助水司解决哪些问题,是如何解决的?

在快速发展的现代社会&#xff0c;水资源管理与服务面临着前所未有的挑战。传统水务管理模式已难以满足日益增长的需求与高标准的服务要求。正是基于此&#xff0c;我们隆重推出“智慧水务平台”&#xff0c;专为水司量身定制&#xff0c;一键式解决运营中的各类难题&#xff0…

easy click安卓版纯本地离线文字识别插件

目的 easy click是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。easy click也包含图色功能&#xff0c;识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下更优…

EasyExcel_通过模板导出(多sheet、列表、图片)

文章目录 前言一、EasyExcel是什么&#xff1f;二、模板样式调整三、使用步骤1.引入jar包2.方法示例2.1 Controller&#xff1a;2.2 Service&#xff1a;2.3 ServiceImpl:2.4 合并策略&#xff1a;2.5 对应DTO 总结 前言 产品今天提了个需求&#xff0c;大概是这样的&#xff…

中秋节月饼销售利用106短信群发平台业绩翻倍案例分析

在中秋节这一传统佳节&#xff0c;月饼作为节日的标志性食品&#xff0c;其销售市场竞争尤为激烈。为了在众多品牌中脱颖而出&#xff0c;不少月饼销售企业开始探索创新的营销方式。其中&#xff0c;利用106短信群发平台进行精准营销&#xff0c;成为众多企业实现业绩翻倍的有效…

C\C++ Sqlite3使用详解

C\C++ Sqlite3使用详解 一、源码下载二、sqlite3接口说明C++2.1 项目创建以及sqlite3使用2.1 连接数据库2.2 sqlite创建表2.2.1 示例代码2.2.2 注意事项2.3 sqlite插入数据2.3.1 示例代码2.3.2 注意事项2.4 sqlite数据删除2.5 sqlite数据查询一、源码下载 下载地址: https://…