OpenGL即Open Graphics Library(开放的图形库接口),主要用于三维图形编程。
OpenGL ES:OpenGL的子集,嵌入式开放图形库接口。OpenGL ES提供了GLSurfaceView组件。
GLSurfaceView用于显示3D图像,本身并不提供绘制3D图形的功能,绘制功能由GLSurfaceView.Renderer来完成。
使用OpenGL ES 的步骤如下:
1、创建GLSurfaceView组件(也可继承该组件),并使用Activity显示GLSurfaceView组件;
GLSurfaceView glSurfaceView=new GLSurfaceView(this);
2、为GLSurfaceView创建GLSurfaceView.Renderer实例,并实现GLSurfaceView.Renderer接口的三个方法:
其中,GL10代表OpenGL的绘制画笔
MyRenderer implements Renderer{
//onSurfaceCreated方法主要用于执行一些初始化操作
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glDisable(GL10.GL_DITHER);// gl.glDisable用于禁用OpenGL某方面的特性,该处表示关闭抗抖动,可以提高性能
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);//该方法用于修正,本处用于设置对透视进行修正
gl.glClearColor(0, 0, 0, 0);//设置OpenGL清屏所用的颜色,四个参数分别代表红、绿、蓝和透明度值,范围为0-1,此处表示黑色
gl.glEnable(GL10.GL_DEPTH_TEST);//启用某方面的性能,此处为启动深度测试,负责跟踪每个物体在Z轴上的深度,避免后面的物体遮挡前面的物体
gl.glDepthFunc(GL10.GL_LEQUAL);//设置深度测试的类型,此处为如果输入的深度值小于或等于参考值,则通过
gl.glShadeModel(GL10.GL_SMOOTH);//设置阴影模式为平滑模式
}
//当SurfaceView大小改变时回调,通常用于初始化3D场景
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);//设置3D视窗的位置与大小
gl.glMatrixMode(GL10.GL_PROJECTION);//设置矩阵模式为投影矩阵,这意味着越远的东西看起来越小,GL10.GL_MODELVIEW:模型视图矩阵:任何新的变换都会影响 该矩阵中的所有物体
float ratio=(float)width/height;
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//设置透视投影的空间大小,前两个参数用于设置X轴的最小值与最大值,中间两个参数用于设置y轴的最小值最大值 ,后两个参数用于设置Z轴的最小值最大值
}
//用于绘制3D图形
@Override
public void onDrawFrame(GL10 gl) {
//清楚屏幕缓存和深度缓存(一般为必须设置的)
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//启用顶点坐标数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//启用顶点颜色数组
gl.glMatrixMode(GL10.GL_MODELVIEW);设置矩阵模式为模型视图矩阵
gl.glLoadIdentity();//相当于reset()方法,用于初始化单位矩阵
gl.glTranslatef(-0.32f, 0.35f, -1.1f);//移动绘图中心
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleFloatBuffer);//设置顶点的位置数据,第一个参数指定多少个元素确定一个顶点,通常为3;第二个参数指定顶点坐标 值的 类型,triangleFloatBuffer是一维数组,形如,(x1,y1,z1,x2,y2,z2,...),用于指定顶点坐标值
gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);//设置顶点的颜色数据
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//根据顶点绘制平面图形,第一个参数表示绘制图形的类型,GL10.GL_TRIANGLES:绘制简单的三角形,GL10.GL_TRIANG LE_STRIP:沿着给出的顶点数据绘制三角形来形成平面图形。OpenGL只能绘制三角形组成3D图形;第二个参数指定从哪个顶点开始,第三个参数表示顶点的数量
gl.glFinish();//绘制结束
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}
注:输入顶点数组时,数组中每个顶点的顺序不同,可能会导致画出的图形不一样
3、使用setRenderer方法为GLSurfaceView添加Renderer。