ARCore:OpenGL ES环境搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p106786860/article/details/78609954

估计大部分Anroid开发的同学,对OpenGL ES的了解可能也仅仅停留在三维图形的渲染,入门模板代码的编写阶段。在ARCore开发中,如果你选择使用Android+OpenGL ES的开发技术栈,就需要大家深入的学习和了解OpenGL ES技术了。那么接下来我们就分如下主题和大家来唠唠:

一、OpenGL ES概述


1. Open GL是做什么的?

  • 高效、简洁的开放图形库接口,跨编程语言、跨平台的编程接口规范,主要用于三维图形编程;
  • 遵照接口,不同平台上有不同的实现,思想完全一致,方法名称和使用也基本一致;

2. OpenGL ES和OpenGL是什么关系?

  • OpenGL ES(OpenGL for Embedded System)是Open GL三维图形API的子集,针对手机、PAD和游戏主机等嵌入式设备;
  • 相对于Open GL来说更轻量级,减少了许多不必要的数据类型,去掉了不必须的功能,对代价大的功能做了限制;
  • OpenGL ES中没有四边形、多边形、无论多复杂的图形都是由点、线和三角形组成的,也去除了glBegin/glEnd等方法;

3. OpenGL ES在ARCore中的作用?
OpenGL ES在ARCore中,结合ARCore对环境的理解,返回的位置和光线等信息,完成2d或者3d图像的渲染。

二、OpenGL ES环境搭建


进行ARCore开发的第一步就是建立一个OpenGL ES环境,主要由如下几个步骤:
1. 创建GLSurfaveView或者其子类,调用setContentView()设置为Activity显示视图。
2. 获取GLSurfaveView或其子类的实例,在Activity中的onResume()和onPause()方法中处理相应的生命周期方法。
3. 设置GLSurfaveView的配置,如渲染器,渲染模式,EGLContext是否保存和GLContextClient版本等;
4. 实现GLSurfaveView.Render接口,重写onSurfaceCreate(),onDrawFrame()和onSurfaceChanged()方法;

三、案例源码解析


相信大家对OpenGL ES应该有了初步的了解。那么接下来我们将会依照ARCore官方提供的Demo的源代码,给大家逐步讲解ARCore是如何开发的。

1. 创建GLSurfaceView实例
java_arcore_hello_ar\app\src\main\res\layout\activity_main.xml

<RelativeLayout... ... >
    <!-- 在activity_main布局中,添加一个GLSurfaceView视图,渲染OpenGL-->
    <android.opengl.GLSurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="top" />
</RelativeLayout>

2. 获取GLSurfaceView实例,处理生命周期
com\google\ar\core\examples\java\helloar\HelloArActivity.java

public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    ... ...
    // 渲染器在这里被创建,并且在GLSurfaceView被创建的时候初始化
    private GLSurfaceView mSurfaceView;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSurfaceView = (GLSurfaceView) findViewById(R.id.surfaceview);
        ... ...      
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (CameraPermissionHelper.hasCameraPermission(this)) { 
            ... ... 
            //恢复渲染线程,如果有必要的话重新创建OpenGL上下文,它和onPause对应
            mSurfaceView.onResume();
        } else {
            CameraPermissionHelper.requestCameraPermission(this);
        }
    }
    @Override
    public void onPause() {
        super.onPause();
        //暂停渲染线程
        mSurfaceView.onPause();
        ... ... 
    }
}

3.设置GLSurfaceView的配置
com\google\ar\core\examples\java\helloar\HelloArActivity.java

public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    ... ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ... ...
        //控制当GLSurfaceView暂停和恢复的时候是否保存EGLContext。如果设置为true,然后EGLContext在GLSurfaceView被暂停的时候被保存。如果设置为false,EGL Context在GLSurfaceView暂停的时候会被释放,然后在GLSurfaceView恢复的时候重建
        mSurfaceView.setPreserveEGLContextOnPause(true);

        //通知EGLContext客户端版本选择的默认的EGLContextFactory和默认的EGLConfigChooser。如果这个方法被调动,它必须在setRender(Render)被调用之前。这个方法仅仅影响默认EGLContextFactory和默认EGLConfigChooser的行为。
        mSurfaceView.setEGLContextClientVersion(2);

        //一个给定的Android设备可能支持多个EGLConfig渲染配置。可用的配置可能在有多少个数据通道和分配给每个数据通道的比特数上不同。默认情况下,GLSurfaceView选择的EGLConfig有RGB_888像素格式,至少有16位深度缓冲和没有模板。安装一个ConfigChooser,它将至少具有指定的depthSize和stencilSize的配置,并精确指定指定的redSize、greenSize、blueSize和alphaSize。
        mSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        //设置GLSurfaceView相关联的渲染器,还将启动将调用渲染器的线程,从而开始渲染。这个方法在GLSurfaceView生命周期内应该且仅仅能被调用一次。
        mSurfaceView.setRenderer(this);

        //设置渲染模式,当渲染模式是RENDERMODE_CONTINUOUSLY,渲染器被反复调用以重绘屏幕。当设置模式是RENDERMODE_WHEN_DIRTY的时候,渲染器只有在surface被创建的时候,或者当requestRender()的时候被调用,默认为READERMODE_CONTINUOUSLY。使用RENDERMODE_WHEN_DIRTY,当视图不需要更新时,允许GPU和CPU空闲。可以提升电池生命和整体的系统性能。
        mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }
}

4.实现GLSurfaveView.Render接口
com\google\ar\core\examples\java\helloar\HelloArActivity.java

//通过HelloArActivity实现GLSurfaceView.Renderer接口的方式创建Render类
public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    ... ... 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ... ...
        //设置GLSurfaceView相关联的渲染器,还将启动将调用渲染器的线程,从而开始渲染。这个方法在GLSurfaceView生命周期内应该且仅仅能被调用一次。
        mSurfaceView.setRenderer(this);
        ... ... 
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //当OpenGL环境被设置,Surface被创建的时候,GLSurfaceView会调用这个方法
        //设置清空屏幕用色颜色
        GLES20.glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
        ... ... 
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        //每次Surface尺寸变化的时候(如横屏、竖屏来回切换),被GLSurfaceView调用
        //告诉OpenGL可以从来渲染的surface的大小
        GLES20.glViewport(0, 0, width, height);
        ... ... 
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        //当绘制一帧时,这个方法会被GLSurfaceView调用
        //清空屏幕上颜色,用之前glClearColor()调用定义色颜色填充整个屏幕,不能加载前面帧的任何像素
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
    }
}

好了,到这里为止我们就完成了一个OpenGL ES环境搭建的过程。我们创建GLSurfaceView实例,为OpenGL ES配置渲染表面,处理Activity声明周期事件和创建Render类。


1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
1024工场服务号

2.完整和持续更新的《使用Android打开AR的开发大门—ARCore》文档,欢迎大家阅读!
https://www.kancloud.cn/p3243986735/arcore_develop/457951
这里写图片描述

猜你喜欢

转载自blog.csdn.net/p106786860/article/details/78609954