OpenGL es 初识

在Android下的第一个OpenGL es 2.0的项目,我们从最简单开始。使用OpenGL es改变屏幕的颜色。

虽然简单,但是我看的了好多资料基本都没有讲这些基础,上来就画个三角形,搞得看完了。我发现什么都没有记住,到时在复制粘贴。

既然是要做最好,肯定要和别人不一样,基础其实很重要的。

一、创建OpenGL es项目

接下你将学习OpenGL es 2.0对Android入门,是一些比较简单的内容,你可以很全面的了解OpenGL es在Android下使用。

1.检查手机是否支持OpenGL es 2.0

  • OpenGL ES 1.0和1.1 - Android 1.0及更高版本支持此API规范。
  • OpenGL ES 2.0 - Android 2.2(API级别8)及更高版本支持此API规范。
  • OpenGL ES 3.0 - Android 4.3(API级别18)及更高版本支持此API规范。
  • OpenGL ES 3.1 - Android 5.0(API级别21)及更高版本支持此API规范。

我们学习的是OpenGL 2.0 ,可以看出OpenGL es 2.0 对Android 手机的要求,并不高。现在4.4的系统谷歌都推荐放弃了。

但是,我们写的App都是在别人手机上,我怎么知道,他(她)的手机支持呢?

有两种办法解决,这个问题。

(1)在AndroidManifest 下声明

你需要在清单列表(AndroidManifest.xml)声明,你需要使用OpenGL es和版本。

<uses-feature android:glEsVersion = “0x00020000” android:required = “true” />

glEsVersion = “0x00020000” : 指告诉系统这个应用程序需要OpenGL ES 2.0,0x00020000就是openGL的版本。

如果你需要OpenGL es 3.0 你只需要把 0x00020000改为0x00030000,依次类推。

提问:你有没有想过在AndroidManifest声明有什么用?

原因:

在Android中AndroidManifest是不会被反编译的,应用市场可以直接通过分析AndroidManifest来知道。

这个App需要什么权限,需要什么版本的系统支持。

这里是用来过滤不支持opneGL es 2.0的手机的,应用市场会对不支持的隐藏。(Google Play就是这样,别的不知道)

(2)在代码检查

在一些特点的开发中,我们需要它安装到设备上去,也需要知道我这个设备是否支持OpenGL es 2.0,则需要代码检查。

 private boolean isOpenGL() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
            return false;
        }
        return true;

    }

具体怎么使用看开发场景了,大部分我们只需要在AndroidManifest简单声明一下。

因为基本99.8%的手机都支持了。点击可以查看Google的统计

(3)我需要使用3.0又怕不支持,怎么办?

还有一种情况,在不支持OpenGL es 3.0的时候使用OpenGL 2.0 。

其实谷歌也告诉我们怎么做了。

这里我就不讲直接指向Google的资料。如果访问不到,请自己百度,我就不费力讲这里了。

二、OpenGL es 2.0的基础知识

准备工作,做完了,我们还需要了解基础知识。

1.简单说明

举个例啊,在现实你要画画需要一张纸和一个笔才可以,在Android下也是这样。

GLSurfaceView 就是这张纸。当然你也可以使用TextureViewSurfaceView,但是这都是以后的事了。

Renderer :就是笔。Renderer是渲染器负责进行OpenGL调用以渲染帧。

2.具体说明

(1)GLSurfaceView 

GLSurfaceView:SurfaceView的一种实现,它使用专用表面来显示OpenGL渲染。

你需要使用它邦定Activity的生命周期,防止发生错误。

(2)Renderer  渲染器

GLSurfaceView.Renderer在使用OpenGL ES的应用程序中实现类或渲染器是事情开始变得有趣的地方。此类控制GLSurfaceView与其关联的内容。

  • onSurfaceCreated() - 调用一次以设置视图的OpenGL ES环境。
  • onSurfaceChanged() - 如果视图的几何图形发生更改,则调用此方法。(例如,设备的屏幕方向更改)
  • onDrawFrame() - 为每次重绘视图调用。(我们大多操作在这个方法)

注意点:

onSurfaceCreated()    这个方法不只是第一次创建才会被调用。当你返回主页面在进入是同样会调用,注意使用哦!

GLSurfaceView 会在一个单独的线程里调用Renderer渲染,如果需要通讯要转到主线程。

三、简单实战

接下我们要进入实战接待。当然很简单,就当是简单的了解吧!

我会把之前的步骤也演示出来,确保你得到的效果和我一致。

1. AndroidManifest.xml  

对,声明需要OpenGL es 2.0 ,还是以2.0 为准。

  <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

2.MainAcitvity

我直接加载的是GLSurfaceView,还有Shwo就是只是简单的工具类,在这只是个Toast。

下面会有我的项目的Demo,它在GitHub上。

   private MyGLSurfaceView mMyGLSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMyGLSurfaceView = new MyGLSurfaceView(this);
        if (isOpenGL()) {
            setContentView(mMyGLSurfaceView);
        } else {
           Show.showToast("没有找到OpenGL 2.0");
            // 你也可以在这设置别的布局
            setContentView(R.layout.activity_demo);
        }
    }

    private boolean isOpenGL() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
            Show.showToast("该设备不支持OpenGL es 2.0");
            return false;
        }
        return true;

    }

    @Override
    protected void onPause() {
        super.onPause();
        mMyGLSurfaceView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMyGLSurfaceView.onResume();
    }

3. MyGLSurfaceView

  private MyRenderer mMyRenderer;

    public MyGLSurfaceView(Context context) {
        super(context);
        // 创建OpenGL版本
        setEGLContextClientVersion(2);
        //  创建自己的渲染器
        mMyRenderer = new MyRenderer();
        // 设置渲染器以在GLSurfaceView上绘图
        setRenderer(mMyRenderer);
        // 渲染器仅在创建曲面或requestRender()调用曲面时渲染。
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    }

setEGLContextClientVersion () 必须设置

setRenderMode()   通常设置两种参数,分别是RENDERMODE_WHEN_DIRTYRENDERMODE_CONTINUOUSLY

RENDERMODE_WHEN_DIRTY:   连续调用渲染器以重新渲染场景。

RENDERMODE_CONTINUOUSLY:渲染器仅在创建曲面或requestRender()调用曲面时渲染。

这里是为节约内存。

3.MyRenderer

这个类才是最关键的,基本操作在这里进行。

 class MyRenderer implements GLSurfaceView.Renderer {
    
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Show.showLog("onSurfaceCreated");
        // 设置清屏颜色
        // 第一个参数红色、黄色、蓝色、透明度
        GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

    }

    //onSurfaceChanged。surface大小改变的回调。比如横竖屏切换
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Show.showLog("onSurfaceChanged");
        // 设置在屏幕上的绘制窗口大小。
        GLES20.glViewport(0, 0, width, height);

    }

    //onDrawFrame。每一次绘制帧的时候调用的方法。
    @Override
    public void onDrawFrame(GL10 gl) {
        Show.showLog("onDrawFrame");
        //清屏,每次调用就会执行
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }
}

简单的功能,注释其实已经很清楚了,你现在不要急着想知道特别清楚。这里只是让你大概了解一下OpenGL es,效果就是在手机上显示给蓝色。这个例子很简单,我希望你能自己写出来,并在收手机上运行出来。

这章基本把一些特别基础的讲完了,希望你有所收获。这章的Demo对应的Demo目录的demo下面的代码,功能很简单,我就不贴gitHub的地址了,等下长在贴吧!

猜你喜欢

转载自blog.csdn.net/qq_41346910/article/details/87600603