OpenGL(Open Graphics Library)定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于二维和三维图像,是一个底层图形库。OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL API 的子集。
一、创建一个OpenGL ES的环境:
为了画一个图形,首先要创建一个view容器。一个直接的方式就是实现GLSurfaceView和GLSurfaceView.Renderer这两个接口。一个GLSurfaceView用来当做画布,GLSurfaceView.Renderer用来控制在画布上画什么。
用GLSurfaceView当做画布只是实现OpenGL ES画图的一种方式。全屏或者接近全屏的画图view用GLSurfaceView是好选择。如果只是在layout的一部分上用OpenGL ES画图可能用TextureView好一些。还有一种是用SurfaceView,但是需要写很多的代码。
下面展示用GLSurfaceView和GLSurfaceView.Renderer实现画图。
第一步:首先在Manifest中声明对OpenGL的使用。
<uses-feature android:glEsVersion="0x00020000" android:required="true" />声明要使用OpenGL ES 2.0API
如果应用中使用了texture compression,必须声明你的APP中要使用的压缩格式
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />第二步:为OpenGL ES Graphics创建一个Activity
创建的activity中要用到GLSurfaceView这个控件。
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); } }第三步:创建一个GLSurfaceView控件
GLSurfaceView只是用来充当画布,不能自己完成绘制。控制绘制的是渲染器GLSurfaceView.Renderer。不要直接使用GLSurfaceView这个类,为了实现监听触摸事件等,要继承这个类。
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 需要声明调用的是2.0API,如下:
// Create an OpenGL ES 2.0 context setEGLContextClientVersion(2);在继承了GLSurfaceView的类中,这里指MyGLSurfaceView,另外一个可选项是当只有绘制的数据有改变时才渲染。
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);这个设置能防止GLSurfaceView重新绘制,直到requestRender()这个方法被调用。
第四步:创建一个Renderer类
继承GLSurfaceView.Renderer类创建渲染器类。调用下面三个方法指明怎样在GLSurfaceView中画图像:
onSurfaceCreated()调用一次设置view的OpenGL ES环境
onDrawFrame()每次重新绘制都要调用
onSurfaceChanged()view的几何形状变化后都要调用,例如当设备的屏幕方向改变之后。
下面的例子示例了如何在一个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); } }