GLSurfaceView基础学习笔记

来源:互联网 发布:师范 校园网络电视 编辑:程序博客网 时间:2024/05/18 00:17

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);//移动绘图中心
<pre code_snippet_id="1634794" snippet_file_name="blog_20160405_2_9523416" name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleFloatBuffer);//设置顶点的位置数据,第一个参数指定多少个元素确定一个顶点,通常为3;第二个参数指定顶点坐标                   值的 类型,triangleFloatBuffer是一维数组,形如,(x1,y1,z1,x2,y2,z2,...),用于指定顶点坐标值</span> 
        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。

0 0
原创粉丝点击