在AR云渲染服务中,有时候需要把生成的纹理保存到图片来进行调试。

那就想办法看看存成图片,很多人说用glGetTexImage这个函数可以直接读取纹理的数据,但是我们用到了opengl es 32版本,不支持这个函数,想了办法,把纹理绑定到framebuffer,然后用glReadPixels读取出来,然后在保存图片。

具体实现如下:

    private void saveRgb2Bitmap(Buffer buf, String filename, int width, int height) {BufferedOutputStream bos = null;try {bos = new BufferedOutputStream(new FileOutputStream(filename));Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);bmp.copyPixelsFromBuffer(buf);bmp.compress(Bitmap.CompressFormat.PNG, 90, bos);bmp.recycle();} catch (IOException e) {e.printStackTrace();} finally {if (bos != null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}}}private void saveTextureToImage(int textureID, int width, int height, String fileName) {int[] frameBuffer = new int[1];GLES32.glGenFramebuffers(1, frameBuffer, 0);GLES32.glBindFramebuffer(GLES32.GL_FRAMEBUFFER, frameBuffer[0]);GLES32.glFramebufferTexture2D(GLES32.GL_FRAMEBUFFER, GLES32.GL_COLOR_ATTACHMENT0, GLES32.GL_TEXTURE_2D, textureID, 0);GLES32.glDrawBuffers(1, new int[]{GLES32.GL_COLOR_ATTACHMENT0}, 0);if (GLES32.glCheckFramebufferStatus(GLES32.GL_FRAMEBUFFER) != GLES32.GL_FRAMEBUFFER_COMPLETE) {Log.e(TAG, "framebuffer not complete");return;}ByteBuffer rgbaBuf = ByteBuffer.allocateDirect(width * height * 4);rgbaBuf.position(0);GLES32.glReadPixels(0, 0, width, height, GLES32.GL_RGBA, GLES32.GL_UNSIGNED_BYTE, rgbaBuf);saveRgb2Bitmap(rgbaBuf, fileName, width, height);GLES32.glDeleteFramebuffers(1, IntBuffer.wrap(frameBuffer));GLES32.glBindFramebuffer(GLES32.GL_FRAMEBUFFER, 0);ShaderUtil.checkGlError(TAG, "glCsInit end.");}

在其他地方调用就可以了。

String destDir = mContext.getExternalFilesDir(null).getAbsolutePath();
String fileName = destDir + "/" + System.nanoTime() + ".png";
saveTextureToImage(mCsImageIDs[1], width / 2, height, fileName);

glReadPixels函数是一个非常耗时的操作,我们只能当做调试来用。

参考文献:

https://blog.piasy.com/2016/06/14/Open-gl-es-android-2-part-2/index.html

https://stackoverflow.com/questions/53993820/opengl-es-2-0-android-c-glgetteximage-alternative

https://www.khronos.org/opengl/wiki/GLAPI/glGetTexImage

android平台opengl es读取纹理数据并保存图片相关推荐

  1. Android平台OpenGL ES图像处理(improving)

    在Android平台一般使用OpenGL ES进行图像处理.在OpenGL ES中编写算法,实现效果,最后将处理的结果传输给 CPU,然后生成最终的照片. 直播中的美颜,对性能有很高的要求,无法使用特 ...

  2. opengl android 纹理贴图 代码,Android 使用opengl es的纹理贴图白屏问题请教。

    各位大侠好: 我在使用open gl es的做显示的时候,发现一个问题,请各位帮助一下,谢谢. 环境:opengl es 1.x,2D的模式显示纹理图片. 在LG-P990,HTC-C510E上显示附 ...

  3. android opengl图片,Android平台openGL ES实现全景图片

    全景又被称为3D实景,是一种新兴的富媒体技术,其与视频,声音,图片等传统的流媒体最大的区别是"可操作,可交互". 全景分为虚拟现实和3D实景两种.虚拟现实是利用maya等软件,制作 ...

  4. Android Studio OpenGL ES绘制三棱锥/四面体的多纹理贴图 每个面使用一张图片渲染

    本文参考了王刚的<疯狂Android讲义(第3版)>P554-P559 要求:利用OpenGL ES绘制一个三棱锥,并对每个面进行纹理贴图,每个面使用不同的图片进行渲染. 环境:Andro ...

  5. 适用于ios和android,适用于iOS和Android的OpenGL ES差异

    我有一个适用于iOS和 Android的OpenGL ES应用程序.大多数代码是很久以前由另一个人编写的,现在我必须维护它. OpenGL的使用看起来相当简单(游戏是2D,只使用纹理精灵以简单的方式) ...

  6. 安卓平台OpenGL ES的调用

    安卓平台OpenGL ES的调用 开发游戏如果直接使用OpenGL是比较痛苦的,最好的办法是使用封装好的引擎,但很有必要了解在安卓java代码直接调用OpenGL的渲染方法 固定渲染管线只可通过配置实 ...

  7. android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础

    效果图:...... 编写Dad.java *在Dad构造器中创建和设置场景渲染器为主动渲染,并设置重写触屏时间回调方法以记录触控笔坐标,改变三角形坐标系的位置,使三角形能够在场景中转动 *为声明场景 ...

  8. android opengl es 圆锥纹理贴图

    效果图: 底面: 侧面: 底面圆核心代码: //初始化顶点数据的方法public void initVertexData(){// 顶点坐标数据的初始化================begin=== ...

  9. Android 硬件 OpenGL ES 模拟设计概述

    简介 Android 平台的 OpenGL ES 模拟由多个组件实现,它们是: 一些宿主机的 "翻译器" 库.它们实现了由 Khronos 定义的 EGL,GLES 1.1 和 G ...

最新文章

  1. css布局中的百分比布局
  2. 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理
  3. 地图容器自适应浏览器是什么意思_Web移动端实现自适应缩放界面的方法汇总
  4. Matrix Subtraction(小米icpc邀请赛第一场)
  5. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
  6. http网站转换成https网站
  7. 阿里、华为、美团,大厂面试算法题,这些你会吗?
  8. 【Linux】七种文件类型
  9. 山东财经大学计算机体系结构考试题,2016年山东财经大学计算机科学与技术学院数据库系统原理与程序设计复试笔试仿真模拟题...
  10. 安卓app开发工具_手机APP开发会涉及到哪些知识点呢?
  11. AcWing 蓝桥杯C++ AB组辅导课学习记录(Python,备战蓝桥杯)Day31 - Day60
  12. 给大家讲解一下 AIDL原理分析
  13. SAP中税码、税率、税务科目的几个表及其中的勾稽关系
  14. mysql数据库 数据查询闯关(头哥)
  15. 如何用SPSS计算个人BMI值?
  16. matlab ps液化,photoshop液化工具崩溃怎么办 ps液化工具崩溃解决方法
  17. 解决win10系统网络连接正常,但是网页打不开的问题
  18. 技术分享 | 黑盒测试方法论—边界值
  19. Python实践 - 网络爬虫笔记 - 1、对 URL 的 get 请求
  20. 告别CSDN,转去博客园(http://www.cnblogs.com/organic/)

热门文章

  1. Unity面试题ABC(Yanlz+A经典面试题+C#问题+Unity问题+...+F高薪就业+...+立钻哥哥+...)
  2. Java Swing 经典小游戏《飞机大战》———— (一)获取素材,创建窗口,添加滚动背景,双缓冲
  3. 第三届北京·顺义张镇灶王文化节即将开幕
  4. 第一本Docker书pdf
  5. win7之下魔兽不能全屏
  6. IOS开发之——更换Storyboard
  7. MacOS上使用ffmpeg利用显卡加速批量压缩视频
  8. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST
  9. dminit方式初始化实例时出现创建文件夹失败问题该如何处理?/初始化实例失败/fail to init db。
  10. Cover Letter Response Letter