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);就能看到一个红色的矩形
继续学习中,后面还会出更多的学习心得!