一.初始化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卷》