Android---构建一个OpenGL ES环境

本文译自:http://developer.android.com/training/graphics/opengl/environment.html

为了在Android应用程序中使用OpenGL ES来绘制图形,你必须创建一个View容器。比较直接方法之一就是实现GLSurfaceViewGLSurfaceView.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.2API 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.0API

// 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.0API时,这些方法为什么会有一个GL10参数?这主要是为了让2.0API简单重用这些方法的签名,以便让Android框架的代码更加简单。

你可能感兴趣的:(Android---构建一个OpenGL ES环境)