1. 概要
OpenGL是桌面环境下的绘制,渲染三维图形的API。
OpenGL ES是在Android环境下的OpenGL。
在Android中OpenGL需要在GLSurfaceView中渲染,渲染控制函数在GLSurfaceView.Renderer中。接下来会介绍如何创建第一个OpenGL程序
2. 配置AndroidManifest
(1)声明OpenGL ES API
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
(2)如果在APP中用到纹理,需要声明采用纹理的格式
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.firstglsurfaceview">
<uses-feature android:glEsVersion="0x00020000" />
<uses-sdk android:targetSdkVersion="11"/>
<application
android:label="@string/app_name">
<activity android:name="FirstGLActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3. 创建一个OpenGL Project
3.1 创建Activity
只需要在Activity中设置一个GLSurfaceView即可。
FirstGLSurfaceView继承于GLSurfaceView。
public class FirstGLActivity extends Activity {
private FirstGLSurfaceView mGLView;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mGLView = new FirstGLSurfaceView(getApplication());
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
}
3.2 创建GLSurfaceView
此部分需要声明OpenGL版本,设置Renderer
class FirstGLSurfaceView extends GLSurfaceView {
private final FirstGLRenderer mRenderer;
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
3.3 创建Render
GLSurfaceView.Renderer是OpenGL ES最重要的一部分,设置OpenGL环境,绘制OpenGL都是在Renderer中完成。
Render实现了GLSurfaceView.Renderer接口,需要实现3个函数:
onSurfaceCreated() - Surface创建时会触发此事件,在此事件中需要完成OpenGL的初始化工作。
onDrawFrame() - 更新OpenGL绘制的内容
onSurfaceChanged() - 当Surface大小改变时触发此事件,比如方向改变等。
如果您了解桌面环境下OpenGL编程,那么我们可以将其与GLUT创建的OpenGL程序对应起来(参见第一个OpenGL程序)。
onSurfaceCreated --- init
onDrawFrame --- display
public class FirstGLRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
4. 参考文献
[1] Google Android API, http://developer.android.com/training/graphics/opengl/environment.html