一.初始化OpenGL

1.创建GLSurfaceView实例

private GLSurfaceView glSurfaceView;

2.检查系统是否支持OpenGL ES 2.0:通过ActivityManager来获取设备的配置信息,再通过reqGlEsVersion变量来检查设备OpenGL ES的版本号,如果reqGlEsVersion比0x20000大即表明设备支持OpenGL ES 2.0。

final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);       
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        final boolean supportEs2 = configurationInfo.reqGlEsVersion >= 0x20000;        
        if(supportEs2 == true){
            Toast.makeText(FirstOpenGLProjectActivity.this,"此设备支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(FirstOpenGLProjectActivity.this,"此设备不支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            return;
        }
谷歌官方的Android版本及OpenGL ES API的对应关系如下:

android getExternalStorageDirectory 29版本问题 android:glesversion_opengl es

3.为OpenGL ES 2.0配置渲染表面

glSurfaceView.setEGLContextClientVersion(2);
glSurfaceView.setRenderer(new FirstOpenGLProjectRenderer());

4.处理Android Activity生命周期的事件,通过重写这两个方法,surface视图才能正确暂停并继续后台渲染进程,同时释放和继续使用OpenGL上下文。

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

        if(rendererSet == true){
            glSurfaceView.onPause();
        }
    }

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

        if(rendererSet){
            glSurfaceView.onResume();
        }
    }

二.创建Renderer类

1.新建渲染器,需要实现Renderer的接口.

●onSurfaceCreated():在Surface被创建的时候调用.
●onSurfaceChanged():在Surface尺寸变化时调用,主要是横竖屏切换的时候.
●onDrawFrame():绘制一帧图像的时候被调用.
public class FirstOpenGLProjectRenderer implements Renderer {

    @Override
    public void onSurfaceCreated(GL10 glUnused, javax.microedition.khronos.egl.EGLConfig config){
        glUnused.glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 glUnsed,int width,int height){
        glUnsed.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 glUnsed){
        glUnsed.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}

三.完整代码示例:

FirstOpenGLProjectActivity.java:

package com.example.firstopenglproject;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class FirstOpenGLProjectActivity extends AppCompatActivity {

    private GLSurfaceView glSurfaceView;
    private boolean rendererSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glSurfaceView = new GLSurfaceView(this);

        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        final boolean supportEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
        if(supportEs2 == true){
            Toast.makeText(FirstOpenGLProjectActivity.this,"此设备支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            glSurfaceView.setEGLContextClientVersion(2);
            glSurfaceView.setRenderer(new FirstOpenGLProjectRenderer());
        }else{
            Toast.makeText(FirstOpenGLProjectActivity.this,"此设备不支持OpenGL ES 2.0",Toast.LENGTH_SHORT).show();
            return;
        }
        setContentView(glSurfaceView);
    }

    /**
     * onPause()与onResume()这两个方法非常重要,有了这两个方法,surface视图才能正确暂停并继续后台渲染线程
     * 同时释放和继续使用OpenGL上下文
     */

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

        if(rendererSet == true){
            glSurfaceView.onPause();
        }
    }

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

        if(rendererSet){
            glSurfaceView.onResume();
        }
    }
}

FirstOpenGLProjectRenderer.java:

package com.example.firstopenglproject;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class FirstOpenGLProjectRenderer implements Renderer {

    @Override
    public void onSurfaceCreated(GL10 glUnused, javax.microedition.khronos.egl.EGLConfig config){
        glUnused.glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 glUnsed,int width,int height){
        glUnsed.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 glUnsed){
        glUnsed.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}

真机运行效果:

android getExternalStorageDirectory 29版本问题 android:glesversion_opengl_02

说明:以上内容参考自《OpenGL ES应用开发实践指南 Android卷》