本文译自:http://developer.android.com/training/graphics/opengl/environment.html
为了在Android应用程序中使用OpenGL ES来绘制图形,你必须创建一个View容器。比较直接方法之一就是实现GLSurfaceView和GLSurfaceView.Renderer类。GLSurfaceView是用OpenGL来绘制图形的View容器,并且GLSurfaceView.Renderer控制其中的描画处理。有关这两个类的更多信息,请看OpenGL ES开发指南。
GLSurfaceView只是把OpenGL ES图形合并到你的应用程序中的一种方法。对于全屏或接近全屏的图形View,这是一个相当好的选择。想要把OpenGL ES图形作为布局的一小部分的开发者,需要看一下TextureView类。实际上,开发者也可以使用SurfaceView类来构建OpenGL ES的View容器,但是它需要编写相当多的额外代码。
本文向你介绍,如何在一个简单的Activity中完成GLSurfaceView和GLSurfaceView.Renderer类的最小实现。
在清单中声明要使用OpenGLES
为了在应用程序使用OpenGL ES2.0 API,必须在清单文件中添加以下声明:
<uses-featureandroid:glEsVersion="0x00020000"android:required="true"/>
如果你的应用程序使用了纹理压缩,你还必须要声明你所支持的压缩格式,以便不支持这些格式的设备不会去运行你的应用程序:
<supports-gl-textureandroid:name="GL_OES_compressed_ETC1_RGB8_texture"/>
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
有关更多的纹理压缩格式的信息,请看OpenGL开发指南
给OpenGL ES图形创建一个Activity
使用OpenGL ES的Android应用程序具有跟其他Android应用程序的用户接口一样的Activity。主要的差异是放入Activity布局中的内容。在普通的应用程序布局中,你可能要放入TextView、Button和ListView等,但在使用OpenGL ES的应用程序中,你要放入布局中的是GLSurfaceView类。
下列代码示例显示了使用GLSurfaceView作为主View的一个Activity的最小实现:
publicclassOpenGLES20extendsActivity{
private GLSurfaceView mGLView;
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
// Create aGLSurfaceView instance and set it
// as theContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
注意:OpenGL ES2.0需要Android2.2(API Level 8)以上的版本,因此要确保你的Android工程目标的API版本。
构建GLSurfaceView对象
GLSurfaceView是一个用于描画OpenGL ES图形的专用View,它自己本身并不绘制图形。实际的图形绘制是由这个View上的GLSurfaceView.Renderer类来控制的。在构建GLSurfaceView对象时需要很少的代码,这可能会误导你跳过对它的扩展,并创建一个未经修改的GLSurfaceView实例,但不要这么做。为了获取触碰事件,你需要扩展这个类。
以下是扩展GLSurfaceView类最少的必要代码,为了快速实现,通常只在使用它的Activity中创建一个内部类:
classMyGLSurfaceViewextendsGLSurfaceView{
public MyGLSurfaceView(Context context){
super(context);
// Set theRenderer for drawing on the GLSurfaceView
setRenderer(new MyRenderer());
}
}
在使用OpenGL ES2.0时,必须在扩展的GLSurfaceView类的构造器中添加以下调用,以指定你要使用2.0的API:
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
注意:如果你使用的是OpenGL ES2.0 API,一定要确保在应用程序的清单中加以声明。
除了GLSurfaceView实现以为,另外的一个选项就是,使用setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY)方法,把渲染的方式设置成只有描画数据发生变化时才绘制View:
// Render the view only when there is a change in thedrawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
这样设置的结果会让GLSurfaceView框架直到调用requestRender()方法后才执行重绘处理,这会让这个实例应用程序更加高效。
构建Renderer类
在使用OpenGL ES的应用程序内部,要把握好GLSurefaceView.Renderer类或渲染器的实现时机。这个类控制了跟其关联的GLSurfaceView类上的描画。为了在GLSurfaceView上执行绘图处理,Android系统会调用渲染器中的三个方法:
onSurfaceCreated()---View的OpenGL ES环境一旦被建立,就会调用这个方法。
onDrawFrame()---View的每次重绘都会调用这个方法。
onSurfaceChanged()---如果View的几何形状发生改变,如设备的屏幕方向改变时,就会调用这个方法。
以下是OpenGL ES渲染器的一个非常基本的实现,除了在GLSurfaceView中绘制一个灰色的边框之外,不做任何事情:
publicclassMyGL20RendererimplementsGLSurfaceView.Renderer{
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set thebackground frame color
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redrawbackground color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
到此,我们使用OpenGL创建了一个显示灰色屏幕的、简单的Android应用程序。它没有任何有趣的代码,但通过这些类,奠定了用OpenGL来绘制图形的基础。
注意:你可能会想,在使用OpenGL ES2.0的API时,这些方法为什么会有一个GL10参数?这主要是为了让2.0的API简单重用这些方法的签名,以便让Android框架的代码更加简单。