android 离屏渲染 简单书,Android OpenGL ES 8.FrameBuffer离屏渲染

作用

FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理。

理解

FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Texture犹如画纸,我们在上面画东西,画完后,我们可以拿Texture去绘制到其他地方上面。

(本文重点:这个是我个人对FBO的理解,也是帮助我去使用它的方式。如果有更好的理解方式,可以留言沟通。)

代码

本章案例效果是在屏幕外绘制一张图片,并保存到本地。

由于GL运行需要EGL环境,而GLSurfaceView已经帮我们构建了这样的一个环境,所以我们此次也是在GLSurfaceView上运行,但是不绘制到屏幕上。

案例为试验效果,只绘制一帧,所以就放到onDrawFrame上运行,读者之后可以根据自己的需求,处理好相关的生命周期。

public void onDrawFrame(GL10 glUnused) {

GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// 1. 创建FrameBuffer、纹理对象

createEnv();

// 2. 配置FrameBuffer相关的绘制存储信息,并且绑定到当前的绘制环境上

bindFrameBufferInfo();

// 3. 更新视图区域

GLES20.glViewport(0, 0, mTextureBean.getWidth(), mTextureBean.getHeight());

// 4. 绘制图片

drawTexture();

// 5. 读取当前画面上的像素信息

readPixels(0, 0, mTextureBean.getWidth(), mTextureBean.getHeight());

// 6. 解绑FrameBuffer

unbindFrameBufferInfo();

// 7. 删除FrameBuffer、纹理对象

deleteEnv();

}

以上就是关键代码,相比之前其他章节,这里多出了1、2、6、7这几个关键步骤。

步骤1. 创建FrameBuffer、纹理对象

private int[] mFrameBuffer = new int[1];

private int[] mTexture = new int[1];

private void createEnv() {

// 1. 创建FrameBuffer

GLES20.glGenFramebuffers(1, mFrameBuffer, 0);

// 2.1 生成纹理对象

GLES20.glGenTextures(1, mTexture, 0);

// 2.2 绑定纹理对象

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture[0]);

// 2.3 设置纹理对象的相关信息:颜色模式、大小

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,

mTextureBean.getWidth(), mTextureBean.getHeight(),

0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);

// 2.4 纹理过滤参数设置

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

// 2.5 解绑当前纹理,避免后续无关的操作影响了纹理内容

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

}

创建纹理和之前的没有差别,而创建Framebuffer也很简单。

步骤2. 配置FrameBuffer相关的绘制存储信息,并且绑定到当前的绘制环境上

private void bindFrameBufferInfo() {

// 1. 绑定FrameBuffer到当前的绘制环境上

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBuffer[0]);

// 2. 将纹理对象挂载到FrameBuffer上,存储颜色信息

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,

GLES20.GL_TEXTURE_2D, mTexture[0], 0);

}

这里先将FrameBuffer绑定到当前的绘制环境上,所以,在没解绑之前,所有的GL图形绘制操作,都不是直接绘制到屏幕上,而是绘制到这个FrameBuffer上!

若想要解绑,想直接绘制到屏幕上,则可以通过GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);实现。

第二步是将FrameBuffer和纹理对象相关联,纹理存储绘制到FrameBuffer上的颜色信息,代码也很简单。

步骤6. 解绑FrameBuffer

private void unbindFrameBufferInfo() {

// 解绑FrameBuffer

GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

}

解绑,之后的绘制操作都是直接绘制到屏幕上。

步骤7. 删除FrameBuffer、纹理对象

private void deleteEnv() {

GLES20.glDeleteFramebuffers(1, mFrameBuffer, 0);

GLES20.glDeleteTextures(1, mTexture, 0);

}

注意

FrameBuffer每次绘制都会得到一个水平镜像翻转的视图,要处理这个问题,可以在绘制的时候添加一个翻转矩阵,或者,用FrameBuffer绘制2次。

总结

本章使用FrameBuffer实现了离屏渲染,并且将FrameBuffer上的绘制信息保存成Bitmap到本地(此处省略,详细可以看GitHub工程),而FrameBuffer除了这个作用外,还可以将离屏渲染好的图片再绘制到屏幕上,而不用绘制到本地,毕竟我们绘制后得到一个Texture,那就有发挥的空间。比如我们要做的效果是屏幕上画一个背景,背景上有朵花,一共2张图,但背景要做滤镜处理,而花不用,那么,我们可以将背景通过FrameBuffer去做滤镜处理,然后得到一个纹理,直接绘制到屏幕上,而花直接绘制,那么就得到想要的效果了。具体留给读者作为练习题。

后记

该篇文章是差不多半年前就写好的文章,不过觉得写得比较简陋,缺少一些图片来生动形象地去描述这个概念,也怕自己的局限误导了读者。不过由于有读者好奇追问,所以就勉强放上来。文中若有疏漏、误导,请指出。

阅读资料

其他

本系列课程所有相关代码请参考我的GitHub项目⭐GLStudio⭐,喜欢的请给个小星星。😃

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

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

相关文章

双11实时物流订单实践

简介:随着双11的开启,物流业也迎来了年度大考。2021年双11期间,递四方作为物流仓储服务方,布局仓库和分拣点超40个,50w平米作业场地,单日订单峰值达千万级别,海量购物订单由递四方配送到家&…

阿里云徐立:面向容器和 Serverless Computing 的存储创新

简介:以上为大家分享了阿里云容器存储的技术创新,包括 DADI 镜像加速技术,为容器规模化启动奠定了很好的基础,ESSD 云盘提供极致性能,CNFS 容器网络文件系统提供极致的用户体验。 作者:徐立 云原生的创新…

云数引领下,桑达股份2021年营收427.04亿元,同比增长33.21%

4月21日,桑达股份发布2021年年度报告。据年报披露,2021年,桑达股份聚焦“数字与信息服务”和“产业服务”两大赛道,云计算与存储、数据创新、数字政府与行业数字化服务和高科技产业工程服务四大主责主业,全年实现营业收…

乐佰小迪智能机器人_云知声 AI 陪伴教育机器人方案亮相广州国际玩具展

近年来,儿童硬件市场呈现出持续爆发态势。数据显示,2018 年国内玩具市场零售规模约为 680亿元,消费需求旺盛。同时,在消费升级的大环境下,伴随新兴教育理念的崛起,以陪护教育机器人、儿童智能玩具为代表的新…

鸿蒙2.0beta报名,鸿蒙OS 2.0 Beta版系统在哪报名-报名方法介绍

鸿蒙OS系统一直以来深受大家的关注,最近全新推出了鸿蒙OS 2.0 Beta版,那么鸿蒙OS 2.0 Beta版在哪报名呢?小编为大家分享一下关于鸿蒙OS 2.0 Beta版的报名方法介绍,对鸿蒙OS 2.0 Beta版感兴趣的不要错过了。鸿蒙OS 2.0 Beta版系统报…

不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版发布

简介:随着业务的发展,微服务拆分越来越复杂,微服务的治理也成了一个比较令人头疼的问题。有没有更加简单且高效的方法来解决微服务治理的难题? 作者:十眠 随着业务的发展,微服务拆分越来越复杂&#xff0…

曦智科技沈亦晨入选2022达沃斯世界经济论坛“全球青年领袖”

日前,达沃斯世界经济论坛公布了2022年“全球青年领袖”名单,曦智科技创始人兼首席执行官沈亦晨博士获选,他将与来自全球42个国家的其他109位青年领袖一起,加入到为期三年的领导力培训项目中,从不同领域为全球发展发挥更…

python读取oracle数据到hvie parquet_创建Hive表来从parquet / avro模式读取parquet文件

We are looking for a solution in order to create an external hive table to read data from parquet files according to a parquet/avro schema.in other way, how to generate a hive table from a parquet/avro schema ?thanks :)解决方案Try below using avro schema:…

如何利用 “集群流控” 保障微服务的稳定性?

简介:应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应保护、集群流控等多个维度来帮…

android悬浮窗跑马灯,边缘闪光跑马灯

边缘闪光跑马灯拥有详细的体型以及消息分享功能,用户收到手机短信或者电话的时候会用非常炫酷的方式提醒你,还有自然的设置方式,看起来非常优秀的亮度功能,拥有动感的光线以及酷炫特效。软件特色1.靠谱好玩的提醒功能以及消息分享…

阿里巴巴服务网格技术三位一体战略背后的思考与实践

简介:本文分享了阿里巴巴服务网格技术三位一体战略背后的思考和实践,关于阿里云服务网格 ASM 的一些产品功能,包括最近发布的一些功能。 作者:宗泉、宇曾 阿里巴巴三位一体战略 阿里云内部很早就提出了开源、自研、商业化三位一…

antd的tooltip如何调整间距_Word字符间距不会调?那就试试这些技巧

Word字符间距,你会调整吗?本期Word妹与大家分享4种字符间距调整技巧。1、取消数字或字母之间的距离数字或字母间距太大了主要是因为在全角状态下输入的,这时可以点击开始——字体——更改大小写——半角即可。2、取消汉字与英文字母之间的距离…

如何使用 Kubernetes 监测定位慢调用

简介:本次课程主要分为三大部分,首先将介绍慢调用的危害以及常见的原因;其次介绍慢调用的分析方法以及最佳实践;最后将通过几个案例来去演示一下慢调用的分析过程。 作者:李煌东 大家好,我是阿里云的李煌…

12个可能你没见过,但非常实用的 HTML 标签

作者 | 零一来源 | 前端印象今天给大家推荐几个冷门但非常实用的 HTML 标签&#xff0c;不只是语义化&#xff0c;它们都有自己的应用场景和特殊自带功能。一、center让你实现水平居中&#xff0c;用这个标签就对了&#xff0c;标签名也非常得语义化<center>零一</cen…

双11特刊 | 全面云原生化,数据库实例独共享混部 最高降低30%成本

简介&#xff1a;2021年双十一是阿里巴巴集团的核心应用全面云化的第二年。今年在保证稳定性的前提下&#xff0c;主要探索如何利用云原生的技术优势&#xff0c;降低成本&#xff0c;提升资源利用率。在今年大促中&#xff0c;针对核心集群采用独享共享实例混部&#xff0c;统…

python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...

Python学习教程&#xff1a;Python列表赋值&#xff0c;复制&#xff0c;深拷贝及5种浅拷贝详解概述在列表复制这个问题&#xff0c;看似简单的复制却有着许多的学问&#xff0c;尤其是对新手来说&#xff0c;理所当然的事情却并不如意&#xff0c;比如列表的赋值、复制、浅拷贝…

IPv6时代,中小企业该如何布局?

简介&#xff1a;IPv6要为全世界的每一粒沙子都分配一个IP&#xff0c;你的企业跟上了吗&#xff1f; 11月中旬&#xff0c;中央网信办等部门联合印发了《关于开展IPv6技术创新和融合应用试点工作的通知》&#xff0c;联合组织开展IPv6技术创新和融合应用试点工作&#xff0c;…

Gartner 发布新兴技术研究:深入洞悉元宇宙

供稿 | Gartner出品 | CSDN云计算根据Gartner预测&#xff0c;2026年全球30%的企业机构将拥有元宇宙产品和服务。元宇宙是一个由独立但相互连接的网络所组成的持久、沉浸式数字环境&#xff0c;但目前尚未确定这些网络将使用的通信协议。元宇宙能够实现持久、去中心化、可互操作…

android init.d脚本,◇添加init.d脚本支持教程贴◇

☆修改系统有风险&#xff0c;本人不承担任何后果&#xff01;&#xff01;☆【安卓2.3及以上系统通用】研究了好长时间终于找到了自己手动添加的方法,一种方法就是厨房,但没有boot.img是无法添加内核支持&#xff0c;第二种方法就是软件添加,然后再让它开机自动运行.经过我的研…

并发场景下的幂等问题——分布式锁详解

简介&#xff1a;本文从钉钉实人认证场景的一例数据重复问题出发&#xff0c;分析了其原因是因为并发导致幂等失效&#xff0c;引出幂等的概念。针对并发场景下的幂等问题&#xff0c;提出了一种实现幂等可行的方法论&#xff0c;结合通讯录加人业务场景对数据库幂等问题进行了…