Android下使用NDK(C++)+GLES2.0进行后台绘图,保存到bitmap并交给java层处理 5

前段时间为了这个问题纠结了很久,总算找到了还算不错的解决方法,现总结如下。

首先要明白我说的是一个什么东西:

我们要使用OpenGL进行后台处理,但并不需要实时显示到我们app的窗口上,而仅仅存储在Bitmap中。涉及的应用场景有很多比如:你需要做一个图像处理的app,你希望界面上最多有个image view之类的东西显示待处理/处理好的图片。所以你不可能会为了后台处理而在前台界面上挂上一个glSurfaceView或者glTextureView之类的东西上去。

因为对Android并不熟悉,我在谷歌和百度上查找了很久,甚至跑到stackoverflow.com上去提问,总算找到可行的方案:PBufferSurface 和 PixmapSurface

但是找到的方案都没有例子,大概像这样用的人比较少,描述到它们的时候都是一句话带过,所以本文将详细描述一下。

安卓下使用EGL来创建context。首先是khronos官方文档描述: eglCreatePbufferSurface 以及 eglCreatePixmapSurface

看了这两个函数,你大概就明白了。那么我们应该使用哪个呢?

首先要明白你的需求,假如你是要处理图像的话,显然不管你用哪个,你最终都必须绘制到FBO里面再取出来的。为什么? 因为你在创建context的时候是不知道你要处理的图像的大小的(……如果你要每次加载图片就重新初始化,那……我不管了)。所以就算你用了pixmap surface,直接绘制的话也会因为图像大小而纠结不已。

所以本文直接选择了pbuffer,效率比pixmap更高。

那么我们要做的就很简单了,首先使用adt创建一个demo吧,在主activity的onCreate方法前面加上: @SuppressLint(“NewApi”).  如果已经加了的话就不用管了。

为了便于管理,我们新建一个java文件把所有的初始化写到一个class里面:

然后在创建的时候调用 initEGL, 使用后台绘图之前调用enableEGL即可。

当然,也许你还是可能会遇到各种各样的问题,所以给出一个完整的demo以供参考:

点击跳转到demo下载页面。 <– 如果打不开,请把地址的https换成http,谷歌的服务器比较扯蛋。

来一张demo效果图吧。界面上只有一个button和一个imageView。

OpenGLBackDraw