当前位置: 代码迷 >> Android >> Android OpenGL ES 基础:作图三角形
  详细解决方案

Android OpenGL ES 基础:作图三角形

热度:80   发布时间:2016-05-01 12:53:26.0
Android OpenGL ES 基础:绘制三角形

OpenGL ES

简介

  OpenGL- ES 是免授权费的,跨平台的,功能完善的2D3D图形应用程序接口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接口的类,代码有详细注释:

public class GLRender implements Renderer {	private float rotateTri;    private int one=0x10000;    //三角形的一个顶点    private IntBuffer triggerBuffer=BufferUtil.fBuffer(new int[]{            0,one,0,     //上顶点            -one,-one,0,    //左顶点            one,-one,0    //右下点    });    private IntBuffer colorBuffer=BufferUtil.fBuffer(new int[]{            one,0,0,one,            0,one,0,one,            0,0,one,one    });    	public void onDrawFrame(GL10 gl) {		// 清除屏幕和深度缓存        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();	}	public void onSurfaceChanged(GL10 gl, int width, int height) {		float ratio = (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();	}	public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {		// 启用阴影平滑        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中:

public class MainActivity extends Activity {	Renderer render=new GLRender();	    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        GLSurfaceView gview=new GLSurfaceView(this);        gview.setRenderer(render);        setContentView(gview);    }}

如果顶点数组报错:must user a native order idrect buffer

就将数组转化一下:

public static IntBuffer fBuffer(int[] a) {		ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);		// 数组排列用nativeOrder		mbb.order(ByteOrder.nativeOrder());		floatBuffer = mbb.asIntBuffer();		floatBuffer.put(a);		floatBuffer.position(0);		return floatBuffer;	}

运行效果如下:


  相关解决方案