Android OpenGL小结之专业名词理解

Android OpenGL小结之专业名词理解


image

出入之间,境界始大。不仅收其精微,汇其宏阔,且人情与道理兼具,生气同高致并存。入而不出,狭隘;出而不入,浮浅。故善学者,善于深思与总结。学习如此,创作如此,生活亦如此。

学习不仅仅是接受一些新知识,而且要擅于总结,把学习的新知识转化为自己的知识,才能学以致用;故把之前的OpenGL学习遇到的名词总结一番。

OpenGL ES库


OpenGL ES库是针对于嵌入式设备而裁剪的版本库,在Android端是以NDK形式存在,此库可用于GPU的图像开发,数据到图像的过程

EGL


不同产商底层驱动实现不同,为了是OpenGL在不同产商设备上能成功执行,EGL作为中间的桥梁搭建,为OpenGL提供渲染环境;EGL提供抽象显示display、渲染上下文Context以及创建3中不同的window surface;OpenGL的渲染操作必须要EGL为其提供渲染环境,Android里面常见的GLSurfaceView不用,因为其内部已经显示了EGL环境,但是如其他的SurfaceView、TextureView则需要自己去实现EGL环境

GLSL


用于指导GPU可编程管线的编程语言,与C语言类似;主要用于指导GPU管线如何去绘制图元、颜色;编写好程序后需要提交给OpenGL进行编译、链接才能使用;这里主要编写顶点着色器和片元着色器

纹理


纹理主要是用于图像数据的展示,创建纹理后,绑定图像数据textImage2D(),最后在渲染时,首先激活纹理,然后片元着色器的采样器Sampler会根据传入的纹理坐标来这个纹理数据里面取色渲染

FBO


Frame Buffer Object帧缓冲对象,在屏幕上显示的最后一步,就是将所有的任务提交给FBO,由FBO输出到屏幕上;日常开发中没有使用FBO而屏幕上却显示了,那是因为默认激活的FBO ID为0,这个ID为0的就是屏幕的FBO;所以我们可以创建ID非0的FBO,这样我们输出到FBO的图像就不会显示到屏幕;

那FBO有什么用?

  • 可以对图像预处理,如图像美颜,处理完成后再通过其他收发输出到屏幕
  • FBO突破屏幕尺寸,不在受默认FBO屏幕尺寸的限制

如何使用FBO?
详情可以点击这里,FBO提供颜色附着和深度附着,我们可以使用纹理以及renderBuffer附着到FBO上,当我们激活FBO后,正常渲染操作都会输出到FBO,然后可以通过预先附着的纹理和renderBuffer提取图像

Android与OpenGL相关的组件


SurfaceView


复杂的2D图像绘制显示,不阻塞主线程
必须在子线程中使用,并且在回调SurfaceHolder的surfaceCreated和surfaceDestroyed方法之间才能绘制
双缓冲机制,绘制完成后显示,lockCanvas获取画布进行绘制,unlockCanvasAndPost提交更新
伪代码例子:

public class MyView extends SurfaceView 
                    implements SurfaceHolder.Callback
                    ,Runnable {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        running=true;
        new Thread(this).start();
 
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        running=false;
    }
    @Override
    public void run() {
        while(shouldDrawing){
                Canvas=surfaceHolder.lockCanvas();
                //drawing
                surfaceHolder.unlockCanvasAndPost(mCanvas);
        }
    }

}

GLSurfaceView


GLSurfaceView集成与SurfaceView,集成了SurfaceView的特性,不同的是它使用了OpenGL环境来渲染,其内部已实现了EGL环境,使用方法主要是:

  • 设置Render渲染器
  • 设置渲染方式
glSurfaceView.setRenderer(renderer);
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

RENDERMODE_WHEN_DIRTY 触发式手动刷新 RENDERMODE_CONTINUOUSLY 持续刷新 固定周期刷新

  • Render渲染器,渲染具体流程
public class GLRender implements GLSurfaceView.Renderer {
    //surfaceView创建时调用
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
    }

    //surfaceView绘制时回调
    @Override
    public void onDrawFrame(GL10 gl) {
    }
}

TextureView


TextureView可用于显示图像流,来自相机或者OpenGL渲染的图像;主要是通过TexttureView方法onSurfaceTextureAvailable的参数SurfaceTexture表面纹理来实现的

TextureView与相机Camera搭配


public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
          mCamera = Camera.open();
          try {
              mCamera.setPreviewTexture(surface);
              mCamera.startPreview();
          } catch (IOException ioe) {
              // Something bad happened
          }
      }

TextureView与OpenGL搭配


  • EGL创建windowSurface以及OpenGL的渲染环境
  • 与TextureView的SurfaceTexture绑定makecurrent
  • OpenGL正常的渲染绘制
  • swapBuffer进行显示

SurfaceTexture


表面纹理SurfaceTexture,实质也是一个纹理的封装类,其内部纹理可以作为图像流的输出对象,来自相机或者解码的视频流均可以;

小测验


你理解了上面的名词解释了吗?或者你自学OpenGL觉得OK了吗?那咱们来个小测验吧!
相机美颜过程如何实现的?只需要一个大概的理解就可以,无需太详细,先不要看后面的答案!

image

问题分析:
首先,我们要拿到相机的预览数据,而且不能马上显示到屏幕,这就需要FBO;
然后,对拿到的相机数据进行美颜处理,这里处理就需要glsl的美颜算法;
最后,在将修改的数据渲染的默认的屏幕FBO上去,显示即可;
还需要注意的一点是:相机预览数据一般均是YUV格式,而OpenGL只能显示RGB图像,这里需要设置SurfaceTexture纹理特定的格式OES让其内部自动转换

image

大致如上图流程,最后一步View显示不一定非得是TextureView,也可以是GLSurfaceView和SurfaceView,那样的话涉及4和5步骤的处理方式不同;如果是GLSufaceView,直接从第4步开始,渲染到GLSurfaceView的渲染器Render即可;如果是SurfaceView,则需要在第5步骤,将前一步骤FBO里面的纹理数据glReadPixels拷贝出来,在绘制到SurfaceView的Canvas上去即可。

我的项目地址

加入公众号,我们一同成长!

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容