当前位置:操作系统 > 安卓/Android >>

Android OpenGL ES 基础:绘制三角形

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接口的类,代码有详细注释:
 
 
[java] 
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中: 
 
 
[java]
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 
 
就将数组转化一下:
 
 
[java]
 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;  
 
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,