Android UI OpenGL初识,SurfaceView,GLSurfaceView 和 Renderer

1. 什么是OpenGL?

翻译一下大家都明白了:Open Graphics Library,简单说就是图形库

2. OpenGL需要知道的几个概念(先粗略知道下)
  • 着色器语言
    仅适合GPU编程,对于顶点着色器和片元着色器的开发都需要用到着色器语言进行开发

  • 顶点着色器
    顶点着色器(Vertex Shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点

  • 片元着色器
    片元着色器计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。
    它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。
    一个片元着色器不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。

  • OpenGL坐标系
    OpenGL的坐标系屏幕中间为原点,横x轴(左-1右1),竖y轴(上1下-1),垂直屏幕为z轴
    在这里插入图片描述

3. OpenGL ES

(OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机等嵌入式设备而设计
请记住:在OpenGL ES的世界里,没有四边形、多边形,无论多复杂的图形都是由点、线和三角形组成的

了解了OpenGLOpenGL ES后,接下来了解Android中关联OpenGL ES的几个常用控件

4. SurfaceView

SurfaceView是Android1.0得时候就有了,继承自View ,但与View又有所不同

首先SurfaceView也是一个View,它也有自己的生命周期。因为它需要另外一个线程来执行绘制操作,所以我们可以在它生命周期的初始化阶段开辟一个新线程执行绘制,当生命周期的结束阶段我们插入结束绘制线程的操作。这些是由其内部一个SurfaceHolder对象完成的

5. GLSurfaceView 和 Renderer理解

GLSurfaceView从Android1.5(API level 3)开始加入,作为SurfaceView的补充。它可以看作是SurfaceView的一种典型使用模式。在SurfaceView基础上,它加入了EGL的管理,并自带了渲染线程(Renderer)

它得用法也非常简单,只要设置了Renderer(setRenderer)就可以了,其他得操作全都在Renderer里面执行,从而实现解耦


实际上GLSurfaceView 相当于一块画布,而Renderer是画笔,通过setRenderer把这画布、画笔关联起来

  • GLSurfaceView 画图的纸
  • Renderer相当于在此GLSurfaceView上作画的笔
  • 那么这个gl参数 (Renderer3个回调方法中参数) 就相当于手了

GlSurfaceView继承自SurfaceView。并增加了Renderer接口,提供三个回调方法

GLSurfaceView glSurfaceView = new GLSurfaceView(this);

glSurfaceView.setRenderer(new GLSurfaceView.Renderer() {

// GlSurfaceView 创建的时候回调,可以做一些参数初始化操作
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {}

// GlSurfaceView尺寸发送变化时回调,例如横竖屏切换
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {}

// 此方法频繁回调,我们可以在这个方法里面进行绘制操作
@Override
public void onDrawFrame(GL10 gl) {}
});

为了防止页面退出时,GLSurfaceView仍在绘制中,所以需要增加类似安全代码

 @Override
    protected void onPause() {
        super.onPause();
        if (glSurfaceView != null) {
            glSurfaceView.onPause();
        }
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        if (glSurfaceView != null) {
            glSurfaceView.onResume();
        }
    }
6. SurfaceTexture

SurfaceTexture从Android 3.0(API level 11)加入。和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据二次处理(如Camera滤镜,桌面特效等)

也就是说这个东西不是用来显示给用户看的, 它是一个Texture(纹理), 可以想象成一个View的中间件。通俗举个例子:Camera把视频采集的内容交给 SurfaceTexture, SurfaceTexture 在对内容做个美颜, 然后SurfaceTexture再把内容交给SurfaceViewGLSurfaceView。这就是最后呈现给用户视觉上的美颜内容了

当然实现美容效果远不止这种,Camera+GLSurfaceView + GPUImage(GPUImage 原是iOS下一个开源的基于GPU的图像处理库,提供各种图像处理滤镜,并且支持实时滤镜。GPUImage for Android是Android的实现) 一样也是可以实现美颜

7. TextureView

Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预览。4.4又用了自家的TextureView,所以从中也可以猜出新增TextureView的用意

TextureView是在4.0(API level 14)引入的,与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速的窗口中使用.(这应该是前两年使用的少的原因吧,因为并不是所有手机都支持硬件加速得)

TextureView被创建后不能直接使用,必须要添加到ViewGroup后,待SurfaceTexture准备就绪才能起作用(看TextureView的源码,TextureView是在绘制的时候创建的内部SurfaceTexture,这个就是上面说的可以对图像流数据进行二次处理的类,也就是说一个TextureView就可以实现图片的滤镜效果了,当然)

参考链接:
  1. https://blog.csdn.net/tantion/article/details/80830566
  2. 安卓 OpenGL ES 2.0 完全入门(一):基本概念和 hello world
  3. Android SurfaceTexture简析
  4. 简单了解SurfceView、GLSurfaceView、SurfaceTexture、TextTureView
  5. 直播技术笔记(1)——camera的纹理
  6. Android实现抽奖转盘
  7. https://github.com/Piasy

PS:开发笔记,后续继续完善

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初心一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值