当前位置:操作系统 > 安卓/Android >>

使用Android OpenGL ES 2.0绘图之一:构建一个OpenGL ES环境

  为了能够在Android应用程序中使用OpenGL ES绘制图形,你必须创建一个视图作为容器。而更直接的做法是从GLSu易做图ceView和 GLSu易做图ceView.Renderer各派生一个实现类。GLSu易做图ceView作为使用OpenGL绘制的容器,GLSu易做图ceView.Renderer将用于控制绘图的动作。对这些类的更多信息,请参阅OpenGL ES开发人员指南。

        使用GLSu易做图ceView几乎是整合OpenGL ES到你的应用中的唯一方式。对于一个需要全屏或近乎屏幕图形视图,它是一个合理的选择。如果开发人员只是期望借助OpenGL ES在某个布局中一小部分绘图,则应该考虑使用TextureView。如果觉得自己是“大牛”,完全可以使用Su易做图ceView建立一个OpenGL ES视图,但这样做需要编写相当多的额外的代码。
        这一节将介绍如何在一个简单应用的activity中完成一个最小的GLSu易做图ceView和GLSu易做图ceView.Renderer的实现。
一、在Manifest文件中声明使用OpenGL ES
        为了能够使用OpenGL ES 2.0 API,你必须在manifest文件中添加以下声明:
[html] 
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> 

<uses-feature android:glEsVersion="0x00020000" android:required="true" />        如果你的应用需要使用纹理压缩功能,还要声明设备需要支持什么样的压缩格式:
[html] 
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> 
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" /> 

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />        更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。
二、为OpenGL ES图形创建一个Activity
        这个Activity跟任何其他的应用程序中的Activity一样,也有一个用户界面。唯一的区别是在它的布局文件中存放的视图不是TextView、Button和ListView,而是一个GLSu易做图ceView。
        下面的代码演示了使用GLSu易做图ceView作为主视图的Acitivity的核心代码:
[java
public class OpenGLES20 extends Activity { 
 
    private GLSu易做图ceView mGLView; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
 
        //创建一个GLSu易做图ceView对象,并将其设置为当前Activity的ContentView  
        mGLView = new MyGLSu易做图ceView(this); 
        setContentView(mGLView); 
    } 

public class OpenGLES20 extends Activity {

    private GLSu易做图ceView mGLView;

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

        //创建一个GLSu易做图ceView对象,并将其设置为当前Activity的ContentView
        mGLView = new MyGLSu易做图ceView(this);
        setContentView(mGLView);
    }
}        注:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以请确保你的Android项目的运行目标的API等级不低于8或更高。
三、构造一个GLSu易做图ceView对象
        事实上GLSu易做图ceView并没有提供很多功能,实际上绘制对象的任务都在GLSu易做图ceView.Renderer中进行。所以GLSu易做图ceView中代码也非常少,甚至可以直接使用GLSu易做图ceView。但最好别这样做,因为你需要扩展这个类来响应触摸事件。
        通常在当前Activity中以内部类的方式创建GLSu易做图ceView,这样实现起来非常快,核心代码如下:
[java] 
class MyGLSu易做图ceView extends GLSu易做图ceView { 
 
    public MyGLSu易做图ceView(Context context){ 
        super(context); 
 
        //为了在GLSu易做图ceView中绘制图形而设置Renderer  
        setRenderer(new MyRenderer()); 
    } 

class MyGLSu易做图ceView extends GLSu易做图ceView {

    public MyGLSu易做图ceView(Context context){
        super(context);

        //为了在GLSu易做图ceView中绘制图形而设置Renderer
        setRenderer(new MyRenderer());
    }
}        当使用OpenGL ES 2.0时,你必须在GLSu易做图ceView构造器中调用另外一个方法,它指定了你将要使用2.0版的API:
[java] 
// 创建一个OpenGL ES 2.0 context  
setEGLContextClientVersion(2); 

// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);        注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明。有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。
        另一个可以添加到你的GLSu易做图ceView中可选操作是设置渲染模式为仅当绘制数据发生改变时才绘制view。该渲染模式常量是GLSu易做图ceView.RENDERMODE_WHEN_DIRTY。
[java] 
// 只有在绘制数据改变时才绘制view  
setRenderMode(GLSu易做图ceView.RENDERMODE_WHEN_DIRTY); 

// 只有在绘制数据改变时才绘制view
setRenderMode(GLSu易做图ceView.RENDERMODE_WHEN_DIRTY);        该设置可以防止GLSu易做图ceView帧重绘,直到调用requestRender()方法。这样的绘制机制更高效。
四、构造一个Renderer类
        Renderer类负责控制在GLSu易做图ceView中绘制任务,并提供三个回调方法供Android系统调用,用来计算在GLSu易做图ceView中绘制什么以及如何绘制。
1.onSu易做图ceCreated():仅调用一次,可用来设置view的OpenGL ES环境。
2.onDrawFrame():每次View被重绘时被调用。
3.onSu易做图ceChanged():如果view的几和形状发生变化了就调用,例如当竖屏变为横屏时。
        下面是一个OpenGL ES renderer的最基本的实现,仅在GLSu易做图ceView上画了一个灰色的背景:
[java] 
public class MyGL20Renderer implements GLSu易做图ceView.Renderer { 
 
    public void onSu易做图ceCreated(GL10 unused, EGLConfig config) { 
        //设置背景色  
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
    } 
 
    public void onDrawFrame(GL10 unused) { 
        // 重绘背景色  
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    } 
 
    public void onSu易做图ceChanged(GL10 unused, int width, int height) { 
        GLES20.glViewport(0, 0, width, height); 
    } 

public class MyGL20Renderer implements GLSu易做图ceView.Renderer {

    public void onSu易做图ceCreated(GL10 unused, EGLConfig config) {
        //设置背景色
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    }

    public void onDrawFrame(GL10

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,