opengl简单用法(一)
最近在学习opengl,一路心酸溢于言表,(哭泣中)
首先让我们认识认识opengl是什么东东
opengl就是一个3D图形库,所以你想在安卓手机上绘制一个炫酷的3D图形用opengl来实现就方便得多了。
由于学习opengl不久,今天就用opengl来绘制一个简单的三角形和矩形.
code之前先让我们看看opengl绘制图形比较重要的几个类
GLSurfaceView,其实就是一个view,用来装载你绘制的图形的,一般会继承这个类添加一些额外的东西(比如添加一些监听事件)
GLSurfaceView.Renderer,这是一个非常重要的类,哦呸,是接口,里面有三个函数,可以说是三个生命周期函数。
1、onSurfaceCreated:当GLSurfaceView被创建的时候调用,按道理讲只会被调用一次,所以一般在这个函数中初始化一些数据和基本设置
2、onSurfaceChanged:当View发生改变的时候会被调用,刚开始view的宽高都是0,然后占满整个屏幕,所以GLSurfaceView被创建时调用一次,当屏幕发生变化时也会被调用(比如屏幕从竖屏变为横屏)
3、onDrawFrame:这个函数非常重要,图形的绘制都在这个函数中进行,这就意味着这个函数会被回调很多次,可以设置函数的调用时机(手动调用和自动调用)
RENDERMODE_CONTINUOUSLY:自动调用
RENDERMODE_WHEN_DIRTY:手动调用,GLSurfaceView.setRenderMode(int mode),设置,GLSurfaceView.requestRender()实现手动刷新
绘制三角形:

public class GLTriensRender implements GLSurfaceView.Renderer { 
 //初始化绘制的三角形的坐标数组 
 private float[] verts = new float[]{0f, 1f, 0f, 
 -1f, -1f, 0f, 
 1f, -1f, 0f}; 
 //定义三角形顶点的缓存 
 private FloatBuffer mVertsBuffer; 
 @Override 
 public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
 gl.glClearColorx(0, 0, 0, 1); 
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
 //注意,必须要用ByteBuffer来初始化FloatBuffer 
 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(verts.length * 4); 
 byteBuffer.order(ByteOrder.nativeOrder()); 
 mVertsBuffer = byteBuffer.asFloatBuffer(); 
 mVertsBuffer.put(verts); 
 mVertsBuffer.position(0); 
 }
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);
    float ratio = (float) 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 onDrawFrame(GL10 gl) {
    //清除颜色和深度缓存
    gl.glClear(GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();
    gl.glTranslatef(-1.5f,0f,-6f);
    gl.glColor4f(1f,0f,0f,0f);
    gl.glVertexPointer(3,GL10.GL_FLOAT,0,mVertsBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);
    gl.glFinish();
}

public class OpenGLView extends GLSurfaceView{ 
 private GLTriensRender renderer; 
 public OpenGLView(Context context) { 
 super(context); 
 renderer = new GLTriensRender(); 
 setRenderer(renderer); 
 requestLayout(); 
 } 
 }


我们可以看到出现了一个红色的三角形.
绘制矩形就得定义一个矩形的数组

private float[] verts = new float[]{-1f, -1f, 0f, 
 1f, -1f, 0f, 
 -1f, 1f, 0f, 
 1f, 1f, 0f};


注意顺序很重要:左下、右下、左上、右上
gl.glDrawArrays(GL10.GL_TRIANGLES,0,3)改成gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);就能看到一个红色的矩形
继续学习中,后面还会出更多的学习心得!