一.初始化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的对应关系如下:
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);
}
}
真机运行效果:
说明:以上内容参考自《OpenGL ES应用开发实践指南 Android卷》