Android OpenGLES 笔记-----------ONE

首先这里有一篇不错的文章是我好友terry的http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html

大家还可以到http://www.cnblogs.com/vernon/articles/1877728.html查看关于GLSurfaceView

哎,其实看完了上面,我还是云里雾里的,搞不懂,到底要怎么把图形画出来,怎么让图形进行旋转等动画....

SO.....Let's go on...

}


首先,写一个类实现Renderer接口,并实现它的三个抽象方法 

public class GLReader implements Renderer{

private int one = 0x10000;

//三角形的三个顶点

private IntBuffer triggerBuffer=IntBuffer.wrap(new int[]{

0,one,0,
//上顶点

-one,-one,0,
//做顶点

one,-one,0
//右顶点

});

//四边形的四个顶点

private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{

one,one,0,

-one,one,0,

one,-one,0,

-one,-one,0});

/**

* 所有绘图的工作放到此方法里

*/

@Override

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.glEnableClientState(GL10.GL_VERTEX_ARRAY);

/**

* 设置顶点数据

* 参数:

* 1、顶点尺寸----这里使用的是xyz坐标系,所以是3


* 2、顶点类型----这里是固定的,所以用GL_FIXED


* 3、步长         


* 4、顶点缓存----即顶点数组

*/

gl.glVertexPointer(3,GL10.GL_FIXED, 0, triggerBuffer);

/**

* 绘制顶点

* 参数:

* 1、绘制的模式----我们使用GL_TRIANGLES来表示绘制三角形

* 2、开始位置

* 3、要绘制的顶点计数

*/

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

 

//重置当前的模型观察矩阵

gl.glLoadIdentity();

 

//右移1.5,进入6.0

gl.glTranslatef(1.5f, 0.0f, -6.0f);

//设置四边形顶点数据

gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);

//绘制顶点(注意参数一不同)

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

 

//取消顶点设置

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

/**

* 当窗口大小发生改变是调用此方法

* 不管窗口大小是否已经改变,此方法至少执行一次

* 所以在此方法中设置OpenGL场景的大小

*/

@Override

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();

}

/**

* 窗口创建时调用此方法

* 此方法内做初始化的操作

*/

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

//对透视进行修正

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

//背景:黑色

gl.glClearColor(0, 0, 0, 0);

//启动阴影平滑

gl.glShadeModel(GL10.GL_SMOOTH);

 

//设置深度缓存

gl.glClearDepthf(1.0f);

//启用深度测试

gl.glEnable(GL10.GL_DEPTH_TEST);

//所做深度测试的类型

gl.glDepthFunc(GL10.GL_LEQUAL);

}

}

        代码注释写的很清楚,值得一提的是在onSurfaceChanged()里

                // 设置视口的大小
                gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
                // 选择模型观察矩阵
                gl.glMatrixMode(GL10.GL_MODELVIEW);        

        顺序不能写反,否则会出问题,至于什么问题,自己试下就知道了,我也是偶然发现的      
view plaincopy to clipboardprint?
package com.zjc.test;  
import android.app.Activity;  
import android.opengl.GLSurfaceView;  
import android.os.Bundle;  
public class MainActivity extends Activity {  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
//        setContentView(R.layout.main);  
        GLReader reader=new GLReader();  
        GLSurfaceView glview=new GLSurfaceView(this);  
        glview.setRenderer(reader);  
        setContentView(glview);   
    }  
}  

 没什么好说的,基本上都是固定的,要记得 setContentView(R.layout.main)是无效的!

 

关于那些该死的方法和作用在这里推荐一个相当不错的网站

http://www.zeuscmd.com/tutorials/opengles/index.php

posted @ 2010-11-15 17:43  IT圈儿  阅读(959)  评论(0)    收藏  举报