问题1
什么是EGL, 有什么用? 怎么用? 为什么要用?
目前我还不能很好的回答这几个问题, 只是知道了, 在android平台, 至少可以跳过这个问题, 也就是不关注egl而直接通过GLSurfaceView来实现一些opengl绘制.
具体的示例可以参考谷歌官方:https://developer.android.com/training/graphics/opengl/environment
而至于直接使用egl来初始化环境的例子, 可以参考我的GitHub项目:https://github.com/shaopx/MediaPlayerTest
其中的EglImpl1Activity.java .
这个示例来自系列博文:https://www.jianshu.com/p/9db986365cda 建议先看看这个浅显易懂的系列.
其中提到, 如果不想opengl环境随着页面销毁而自动销毁, 那么可以尝试使用egl自己初始化opengl环境, 也许这个理由对我们上面的问题是一个回答. 但是目前我还不能确定.
问题2.
各种示例中眼花缭乱的gl版本是怎么回事? 在onDrawFrame(GL10 gl10)
生命周期回调方法中的参数是GL10 类型的, 而大部分示例, 包括谷歌官方的示例目前都是直接这么使用opengl的:
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
....
那到底怎么使用才是最正确的? 却别又是什么? 为什么会有GL10 和GLES20的区别? 为什么会有对象实例的调用和静态方法调用两种?
目前看, GL10 gl10参数基本没用了, 太老了. 只所以留下来, 可能是为了兼容老版本程序吧.
现在不只有GLES20, 还有GLES30, 甚至还有GLES31 它们对应的支持版本查看:https://developer.android.com/guide/topics/graphics/opengl
而关于实例调用和静态方法调用, 不管使用哪种调用方法, 效果基本是一样的, 据说静态方法调用更高效:
https://stackoverflow.com/questions/2759734/difference-between-gl10-and-gles10-on-android
所以以后就直接使用静态方法调用吧.
问题3
安卓平台的系统UI绘制 最终是如何跟opengl关联的?
------ 简单说, 是在SurfaceFlinger中与egl关联的, 当然应用程序也可以通过使用GLSurfaceView直接与opengl交互.
是不是可以认为, 如果我实在受不了android的这套view框架, 那我可以通过自定义GlsurfaceView 来搭建自己的view系统. 这会我的measure, layout就不用在ui线程了.
问题4
如何对camera中的数据直接从后台进行处理, 而不是渲染到可视控件上.
这对于一些监控类的程序好像是个功能点, 目前还没搞清楚. 隐约感觉到需要使用egl创建一个pbuffer类型的输出, 然后从其中读取数据, 保存到文件. 但是怎么把camera数据导向到pbuffer类型的输出, 怎么处理YUV类型的数据 都还没想清楚.
问题5
编写顶点着色器时, 如果加上#version 300 es , 会编译失败, 无法生成顶点着色器对象. 这个文件头不是标准的吗?
in 和 out参数描述符也会导致失败, 不明白为什么 ---- 目前glsl的版本必须在3.3以上才能支持in out , 看来安卓平台仍然不支持这个版本. 这几个版本指标好乱啊.