为了在安装程序中使用OPEN GL ES绘制图形,你必须为它们创建一个VIEW容器。
其中一个直接了当的方式是实现一个GLSurfaceView
和一个GLSurfaceView.Renderer。
GLSurfaceView是一个VIEW容器,为了使用OPEN GL 绘制图形的容器。GLSurfaceView.Renderer
控制在VIEW里绘制什么。为了获取更多信息参考OPENGL ES开发指导书。
GLSurfaceView仅仅是一条路在你的应用程序里。为了一个全屏的或几乎全屏的图形视图,这个是可行的选择。
若开发者想要绘制一个OPENGL ES图形在一片小的区域,应该使用TextureView。实际上,自己动手的开发者,
可以使用TextureView建立一个OPENGL ES VIEW,但是需要额外写不少代码。
这节课解释在一个简单的程序中如何完成最小实现的
GLSurfaceView
和GLSurfaceView.Renderer。
一 在MAINFEST里声明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" />更多的纹理格式压缩,参考OPEN GL 开发者手册
二 为OPENGL ES图形创建一个活动
使用OPENGL ES的安卓程序有活动,就像任何其他程序使用一个用户接口。和其他程序主要的不同是为你的活动你放置什么到LAYOUT中。与此同时,
在许多程序中你可以使用TextView,Button,ListView,在你的APP里,你也可以增加一个GLSurfaceView。
下面的示例代码显示一个最小实现的活动。
public class OpenGLES20 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); } }
三 建立一个GLSurfaceView对象
GLSurfaceView是一个特殊的VIEW,在它里面可以绘制OPENGL ES图形。它本身没有做太多。对象的真实绘制时在GLSurfaceView.Renderer中被控制。
只是在这个VIEW中显示。实际上,这个对象的代码如此之少,你可能试图跳过它,只需创建一个不能修改的GLSurfaceView实例,但是不这样做。
你需要扩展这个类,为了捕获一个触摸事件,这个事件处理在后面的章节学习。
GLSurefaceView必要的代码是很少的,所以快速实现,它通常只是创建一个内部类而使用它:
class MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context){ super(context); // Set the Renderer for drawing on the GLSurfaceView setRenderer(new MyRenderer()); } }当你使用OPENGL ES2.0时,你必须增加另外一个调用你的GLSurfaceView构造,
// Create an OpenGL ES 2.0 context setEGLContextClientVersion(2);注意:若你使用OPEN GL2.0API你必须在你的程序MANIFEST中声明,更多的讯息查看 Declare OpenGL ES Use in the Manifest
另外一个可选的增加项到你的GLSurfaceView实现是设置一个REANDER 模式去仅仅绘制VIEW,当一个
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);当你调用requestRender()函数时,此设置可以防止 GLSurfaceView框架从新绘制,对这个示例程序是非常有效的。
四 构建一个RENDERER类
GLSurfaceView.Renderer类,这个类控制在GLSurfaceView上绘制什么,在renderer理由三种方法被安卓系统调用,绘制什么和在GLSurfaceView上
如何绘制。
onSurfaceCreated()函数--一次调用设置一个VIEW的OPENGL ES环境;
onDrawFrame()函数--每次调用重新绘制VIEW
onSurfaceChanged()函数--如果几何图形的视图发生改变,例如,设备屏幕方向发生变化,则被调用
这里有一个基本的OPEN GL ES RENDERER的实现,和在GLSurfaceView绘制灰色背景相比,它不做任何事情
public class MyGL20Renderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Set the background frame color GLES20.glClearColor(0.5f, 0.5f, 0.5f, 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); } }
from:http://developer.android.com/training/graphics/opengl/environment.html#renderer