(1)构建OpenGL ES运行环境

来源:互联网 发布:跳跃网络 中青宝 编辑:程序博客网 时间:2024/05/16 00:30

Android 包含了支持高性能2D和3D图形的开放图形库,具体来说就是OpenGL ES API。OpenGL是一种跨平台图形API,用于指定一个标准的3D图形硬件处理的软件接口。
OpenGL ES是一种适用于嵌入式设备的OpenGL规范。Android支持OpenGL ES API的几个版本:
OpenGL ES 1.0 and 1.1 - This API specification is supported by Android 1.0 and higher.
OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher.
OpenGL ES 3.0 - This API specification is supported by Android 4.3 (API level 18) and higher.
OpenGL ES 3.1 - This API specification is supported by Android 5.0 (API level 21) and higher.
Android 通过NDK和Framework API来实现对OpenGL的支持,Android框架提供了GLSurfaceView和GLSurfaceView.Renderer这两个基础类,来创建和操作OpenGL ES API,
为了使你的应用程序可以使用OpenGL ES API来绘制图形,你必须创建一个Android框架层的View容器,因此Android框架提供了GLSurfaceView作为OpenGL绘制所在的容器,而实际的图形渲染是在GLSurfaceView.Renderer发生的。
GLSurfaceView几乎是Android提供给OpenGL绘制的唯一容器,对于全屏或近似全屏的图形View来说,这是一种比较合理的方案,如果开发者只是想在布局中的一小部分整合OpenGL ES图形,则可以考虑看一下TextureView。事实上你也可以使用SurfaceView来构建OpenGL ES ,但是那可能需要你写更多的代码。
这篇文章将描述如何在一个简单应用的Activity里完成GLSurfaceView和GLSurfaceView.Renderer的最小实现。

(1)在Manifest中声明使用OpenGLES

为了能使用OpenGLES 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" />

(2)为OpenGLES Graphics创建一个Activity

使用OpenGLES Graphics的Activity和普通Activity没有什么不同,主要差别是该Activity的布局里有绘制OpenGLES图形的容器GLSurfaceView。代码如下:

public class OpenGLES20 extends Activity {    private GLSurfaceView mGLView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //创建一个GLSurfaceView实例然后设置为activity的ContentView.        mGLView = new MyGLSurfaceView(this);        setContentView(mGLView);    }}

(3)构建定制的GLSurfaceView类

GLSurfaceView是专门用于绘制OpenGLES图形的,它本身做的事情很少,主要由GLSurfaceView.Renderer来控制图形的渲染操作,事实你可以直接使用GLSurfaceView类,而不用自定义,但一般不建议这样做,
本demo实现了图形的拖动显示,因此定制了自己的GLSurfaceView类。关键代码如下:

class MyGLSurfaceView extends GLSurfaceView {    public MyGLSurfaceView(Context context) {        super(context);        // 创建一个OpenGL ES 2.0 context        setEGLContextClientVersion(2);        // Set the Renderer for drawing on the GLSurfaceView        mRenderer = new MyGLRenderer();        setRenderer(mRenderer);        // Render the view only when there is a change in the drawing data        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);    }}

1.当使用OpenGLES 2.0时,你必须在GLSurfaceView构造器中调用setEGLContextClientVersion(2),它说明了你将要使用2.0版的API。
2.设置Render模式为GLSurfaceView.RENDERMODE_WHEN_DIRTY,表示只在绘制数据发生改变时才绘制view。此设置会阻止绘制GLSurfaceView的帧,直到你调用了requestRender(),这样会非常高效。Render模式默认值为GLSurfaceView.RENDERMODE_CONTINUOUSLY,Render接口的onDrawFrame()方法每隔16ms都会回调一次完成刷新绘制。

(4)实现Render接口类

这个接口类控制着在GLSurfaceView上的绘制,Render类有三个被Android系统回调的接口方法,它们用以描述在GLSurfaceView上绘制什么以及如何绘制,从而你可以定义自己的实现来达到想要的绘制效果。
onSurfaceCreated()- 仅调用一次,用于设置view的OpenGLES环境。
onDrawFrame()- 每次View被重绘时被调用。
onSurfaceChanged()- 如果view的几和形状发生变化了就调用,例如当竖屏变为横屏时。

至此,使用Android OpenGL ES的准备工作都已经完成,下面章节就可以直接使用OpenGL来绘制图形了。

0 0
原创粉丝点击