OpenGL ES
简介
OpenGL- ES 是免授权费的, 跨平台的,功能完善的2D和3D图形应用程序接口API,主要针对多种嵌入式系统专门设计 - 包括控制台、移动电话、手持设备、家电设备和汽车。它由精心定义的桌面OpenGL子集组成,创造了软件与图形加速间灵活强大的底层交互接口。 OpenGL ES 包含浮点运算和定点运算系统描述以及EGL针对便携设备的本地视窗系统规范。OpenGL ES 1.X 面向功能固定的硬件所设计并提供加速支持、图形质量及性能标准。OpenGL ES 2.X 则提供包括遮盖器技术在内的全可编程3D图形算法。
OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的。
在Android中一般用SurfaceView来绘制2D图形,3D的OpenGL 视图则用GLSurfaceView来显示,通过实现Renderer接口来渲染3D图形。
所以我们首先来建立一个实现了Renderer接口的类,代码有详细注释:
- publicclassGLRenderimplementsRenderer{
- privatefloatrotateTri;
- privateintone=0x10000;
- //三角形的一个顶点
- privateIntBuffertriggerBuffer=BufferUtil.fBuffer(newint[]{
- 0,one,0,//上顶点
- -one,-one,0,//左顶点
- one,-one,0//右下点
- });
- privateIntBuffercolorBuffer=BufferUtil.fBuffer(newint[]{
- one,0,0,one,
- 0,one,0,one,
- 0,0,one,one
- });
- publicvoidonDrawFrame(GL10gl){
- //清除屏幕和深度缓存
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
- //重置当前的模型观察矩阵
- gl.glLoadIdentity();
- //左移1.5单位,并移入屏幕6.0
- gl.glTranslatef(-1.5f,0.0f,-6.0f);
- //设置旋转
- gl.glRotatef(rotateTri,0.0f,1.0f,0.0f);
- //设置定点数组
- gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
- //设置颜色数组
- gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
- gl.glColorPointer(4,GL10.GL_FIXED,0,colorBuffer);
- //设置三角形顶点
- gl.glVertexPointer(3,GL10.GL_FIXED,0,triggerBuffer);
- //绘制三角形
- gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);
- //取消顶点数组
- gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
- //绘制三角形结束
- gl.glFinish();
- }
- publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
- floatratio=(float)width/height;
- //设置OpenGL场景的大小
- gl.glViewport(0,0,width,height);
- //设置投影矩阵
- gl.glMatrixMode(GL10.GL_PROJECTION);
- //重置投影矩阵
- gl.glLoadIdentity();
- //设置视口的大小
- gl.glFrustumf(-ratio,ratio,-1,1,1,10);
- //选择模型观察矩阵
- gl.glMatrixMode(GL10.GL_MODELVIEW);
- //重置模型观察矩阵
- gl.glLoadIdentity();
- }
- publicvoidonSurfaceCreated(GL10gl,EGLConfigarg1){
- //启用阴影平滑
- gl.glShadeModel(GL10.GL_SMOOTH);
- //黑色背景,银灰色
- gl.glClearColor(1,1,1,0);
- //设置深度缓存
- gl.glClearDepthf(1.0f);
- //启用深度测试
- gl.glEnable(GL10.GL_DEPTH_TEST);
- //所作深度测试的类型
- gl.glDepthFunc(GL10.GL_LEQUAL);
- //告诉系统对透视进行修正
- gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
- }
- }
在MainActivity中:
- publicclassMainActivityextendsActivity{
- Rendererrender=newGLRender();
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- GLSurfaceViewgview=newGLSurfaceView(this);
- gview.setRenderer(render);
- setContentView(gview);
- }
- }
如果顶点数组报错: must user a native order idrect buffer
就将数组转化一下:
- publicstaticIntBufferfBuffer(int[]a){
- ByteBuffermbb=ByteBuffer.allocateDirect(a.length*4);
- //数组排列用nativeOrder
- mbb.order(ByteOrder.nativeOrder());
- floatBuffer=mbb.asIntBuffer();
- floatBuffer.put(a);
- floatBuffer.position(0);
- returnfloatBuffer;
- }
运行效果如下: