Android OpenGL ES绘图教程之一 : 构建OpenGL ES 环境

       为了在Android应用中使用OpenGL ES绘图,首先必须要创建一个view容器。一个最简单的方法是实现GLSurfaceView和GLSurfaceView.Renderer。GLSurfaceView一个view容器,用来显示OpenGL绘制的图形,GLSurfaceView.Renderer用来控制GLSurfaceView里面图形的绘制。更多的信息,请参考 OpenGL ES 开发向导。
      GLSurfaceView是将OpenGL ES图形用到应用的一种方式,对于全屏或者接近全屏的图形view,它是个不错的选择。但是开发者如果想在layout里面一块小区域显示OpenGL ES图形,应该使用TextureView。使用SurfaceView来创建一个OpenGL ES view也是可以的,但这需要写不少的额外代码。
      本教程介绍了在一个简单的应用activity中,如何实现GLSurfaceView和GLSurfaceView.Renderer的基本部分。

  1.  在Manifest中声明使用OpenGL ES
         为了在你的应用中使用OpenGL ES 2.0 API,必须在manifest中添加下面的声明:
             <uses-feature android:glEsVersion="0x00020000" android:required="true" />
        如果应用中使用了纹理压缩,必须声明应用支持的压缩格式,以确保应用只被安装在兼容的设备上面。
            <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
           <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

        更多关于纹理压缩的格式,请参考OpenGL开发指南。

   

    2. 创建一个显示OpenGL ES图形的Activity

       显示OpenGL ES 的Android应用和其他有用户界面的应用一样,都有activity,和其他应用的一个主要区别就是activity中layout放置的内容。在大多数应用中可能会使用TextView,Button和ListView,在使用OpenGL ES的应用中,你也可以使用GLSurfaceView。
   下面的代码展示了一个activity使用GLSurface View作为它的主视图:
    public class OpenGLES20Activity extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}
   注意:OpenGL ES 2.0需要Android 2.2或者更高的版本,所以确保应用的目标API符合要求。

   3. 创建一个GLSurfaceView对象
       GLSurfaceView是用来绘制OpenGL ES图形的专用view,它自己本身没有做很多工作。真正的绘制工作是由GLSurfaceView.Renderer控制的,实际上,GLSurfaceView是用来绘制OpenGL对象的代码是那么少,你可能会尝试跳过继承它,只创建一个未修改的GLSurfaceView实例,但是不要这么做,你需要通过这个类来捕获touch事件,这将会在 Responding to Touch Events教程中讲到。
        GLSurfaceView的关键代码是很少的,所以比较快的实现是,只在activity中创建一个匿名内部类:
   class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
        super(context);

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(new MyRenderer());
    }
}
      当使用OpenGL ES 2.0时,必须在GLSurfaceView的构造函数中添加一个声明,指定你想要使用2.0的API:
   // Create an OpenGL ES 2.0 context
   setEGLContextClientVersion(2);
      另一个可选的添加到GLSurfaceView实现的方法是设置渲染模式为只有在drawing数据改变的时候才画view,使用 GLSurfaceView.RENDERMODE_WHEN_DIRTY进行设置:
   // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
      这个选项避免了GLSurfaceView被重新绘制,只有当你调用了requestRender()时才会重新绘制,这会提高应用的效率。


    4. 创建一个Renderer类

       在使用OpenGL ES的应用中,GLSurfaceView.Renderer或者renderer是事情变得有趣的地方,这个类控制了GLSurfaceView上面画什么,renderer中有三个方法被Android系统调用来确定在GLSurfaceView中画什么和怎么画:

    onSurfaceCreated() - 在设置view的OpenGL ES环境时会被调用一次
    onDrawFrame() - 在每一次重新绘制view的时候被调用
    onSurfaceChanged() - 在view的几何形状改变的时候调用,比如设备旋转屏幕。

    下面是一个简单的OpenGL ES render实现,在GLSurfaceView中画了一个灰色的背景:


  public class MyGLRenderer 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);
    }

}


       这就是全部!上面的示例代码创建了一个简单的Android应用程序,使用OpenGL显示一个灰色的屏幕。虽然这些代码没有做一些有趣的东西,但是通过创建这些类,你已经打下了使用OpenGL绘制图形元素所需要的基础。
       注意:当你使用OpenGL ES 2.0API时,你可能好奇为什么这些方法有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。
       如果你对OpenGL ES的API比较数序,你现在应该可以设置一个OpenGL ES环境并且开始绘图,但是如果你需要更多的OpenGL帮助,学习下一章教程来获得更多的帮助。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。