Android和opengl es

244 阅读2分钟

opengl es 

是专门面向嵌入式系统的 openglApi的子集,可以为Android提供3d图形的实现同样适用于2d的视频与图像。拥有强大的渲染和特效处理功能,opengl本身只是协议规范\

3D图形学基础

3D:即三纬,长宽高三个纬度,我们计算机中的3d说白了也是在2d屏幕制造出的三维错觉\

图形管线

任何复杂图形都是由一定数量的基础几何图形,通过一系列手法加工出来
opengl es ,他只支持3种基本的:点point,线line,三角形triangle

Android中的opengl es 

代码路径
java层sdk:frameworks/base/opengl
JNI:frameworks/base/core/jni
c++:frameworks/navite/opengl
mesa3D引擎库:external\meas3d\

Android采用了opengl es包含

  • opengl es 
  • egl
  • Mesa 3d 他是兼容opengl 协议的3d图形处理软件库\

图形渲染—api

egl和opengl

egl是图形渲染api,主要提供了:

  • 创建renderaing surfaces
  • 创造图形环境
  • 同步应用程序和本地平台渲染api
  • 提供了对显示设备的访问
  • 提供了对渲染配置的管理

egl.cfg

系统是根据这个文件的解析结果来选择图形渲染方式的
流程:

  1. egl.cfg是否存在
  • 格式:0  1 mali
  • 第一个数字代表显示屏编号,默认为0
  • 第二个代表是硬件库1还是软件库0
  • 第三个代表库的名称
  1. opengl函数执行

egl接口解析

eglGetdispaly:获取默认显示屏
eglGeterror:获取失败原因
eglInitialize:初始化
eglGetconfig:获取一个最佳的config
eglGetconfigattrib:获取config的具体属性值
eglChooseconfig:配置提供的config
eglCreatewindowsurface:创建window
eglCreatebuffersurface:离屏的渲染区,不需要通过swap buffer最终输出到屏幕
eglCreatecontext:为opengl提供统一的运行环境
eglMakecurrent:设置当前surface

搭建open gl环境

  1. 直接使用SDK提供的EGL和GLES类
  2. GLSurfaceView 继承自SurfaceView 主要特性
  •  管理EGLDisplay
  • 管理surface
  • 会创建新线程来处理渲染,不会阻塞ui
  • 用户可以自定义渲染方式, 使用基本步骤
  1. 创建GLSurfaceView
  2. 初始化opengl Es环境:默认情况下已经创建好了
  3. 设置Renderer
  4. 设置Renderermode
  5. 状态处理:使用GLSurfaceView要注意生命周期,activity的pause 和resume要通知到它

GLSurfaceView创建

构造函数调用了super的,并且init了,在init中有获取holder,并且添加了callback,callback中有surface create、change、destroy方法 这里的Surface View申请的surface和view树中通过view root申请的不是同一个

Surface view申请Surface流程

接收到viewroot attchtowindow后通过viewroot获取iwindowsession,在update window时通这个调用relayout获取新的surface,然后通知callback surfacecreate 并且唤醒等待线程,guardedrun方法是是否渲染的核心。

GLtracer是分析GLopne的利器