美文网首页Android
open gl基础知识

open gl基础知识

作者: 傀儡世界 | 来源:发表于2017-03-02 22:08 被阅读119次

    链接:
    http://terryblog.blog.51cto.com/1764499/346996
    http://blog.csdn.net/jason0539/article/details/9164885

    1、什么是 OpenGL?
      OpenGL 是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL 的前身是 SGI 公司为其图形工作站开的 IRIS GL。IRIS GL 是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基础上开发 OpenGL 。具体详细的介绍请 点击这里
    2、OpenGL 的发展历程
      1992年7月 发布了 OpenGL 1.0 版本,并与微软共同推出 Windows NT 版本的 OpenGL
      1995年 OpenGL 1.1 版本面市,加入了新功能,并引入了纹理特性等等。
      一直到 2009年8月Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。
    具体特点及功能、 OpenGL 现状、发展历程、OpenGL 规范、编程入门请 点击这里
    3、OpenGL ES 简介
    Android 3D 引擎采用的是OpenGL ESOpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGL 和 DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是 **OpenGL **具有更好的跨平台性。
    由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的 OpenGL 系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。
    4、 Android OpenGL ES
    简介

    Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的 OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java标准的 OpenGL 包,android.opengl包提供了 OpenGL 系统和 Android GUI 系统之间的联系。
    5、Android 支持 OpenGL 列表
    1、GL
    2、GL 10
    3、GL 10 EXT
    4、GL 11
    5、GL 11 EXT
    6、GL 11 ExtensionPack

    6、GLSurfaceView
    GLSurfaceView是Android应用程序中实现OpenGl画图的重要组成部分。GLSurfaceView中封装了一个Surface。而android平台下关于图像的现实,差不多都是由Surface来实现的

    7、Renderer
    有了GLSurfaceView之后,就相当于我们有了画图的纸。现在我们所需要做的就是如何在这张纸上画图。所以我们需要一支笔。Renderer是GLSurfaceView的内部静态接口,它就相当于在此GLSurfaceView上作画的笔。我们通过实现这个接口来“作画”。最后通过GLSurfaceView的setRenderer(GLSurfaceView.Renderer renderer)方法,就可以将纸笔关联起来了。
    实现Renderer需要实现它的三个接口:onSurfaceCreated(GL10 gl, EGLConfig config)、 onSurfaceChanged(GL10 gl, int width, int height)、onDrawFrame(GL10 gl)。下面就这三个接口的具体意义做个简单的介绍。
    7.1、onSurfaceCreated
    此方法看名字就知道它是在Surface创建的时候被调用的。因此我们可以在这个函数的实现中做一些初始化的工作。它的函数原型如下:public abstract void onSurfaceCreated (GL10 gl, EGLConfig config)第二个参数在文档中没有关于它的任何public方法和域。因此我们可以不用管它。第一个参数非常重要。如果说Renderer是画笔的话,那么这个gl参数,就可以说是我们的手了。如何操作这支画笔,都是它说了算!所以我们绝大部分时候都是通过这个叫做gl的手来指挥Renderer画图的。
    7.2 onSurfaceChanged
    当GLSurfaceView大小改变时,对应的Surface大小也会改变。值得注意的是,在Surface刚创建的时候,它的size其实是0,也就是说在画第一次图之前它也会被调用一次的。(而且对于很多时候,Surface的大小是不会改变的,那么此函数就只在创建之初被调用一次而已)
    原型如下:public abstract void onSurfaceChanged (GL10 gl, int width, int height)同样的,画图的手是必需的。另外值得注意的是,它告诉了我们这张纸有多高多宽。这点很重要。因为在onSurfaceCreated的时候我们是不知道纸的宽高的,所以有一些和长宽相关的初始化工作还得在此函数中来做。
    7.3 onDrawFrame
    此函数就是真正给你画画用的。每调用一次就画一幅图。可能的疑问是这个函数什么时候会被调用呢?最开始的时候肯定是会被调用的。以后会有两种模式供你选择:
    RENDERMODE_CONTINUOUSLY
    RENDERMODE_WHEN_DIRTY
    第一种模式(RENDERMODE_CONTINUOUSLY):连续不断的刷,画完一幅图马上又画下一幅。这种模式很明显是用来画动画的;
    第二种模式(RENDERMODE_WHEN_DIRTY):只有在需要重画的时候才画下一幅。适合用来画不经常需要刷新的情况。调用GLSurfaceView的requestRender ()方法。
    这两种模式在什么地方设置呢? GLSurfaceView的setRenderMode(int renderMode)方法。可以供你设置你需要的刷新模式。

     // 清除屏幕和深度缓存
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            //来指定改变的是投影矩阵
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            // 重置当前的模型观察矩阵
            gl.glLoadIdentity();
    
          //顶点数组和颜色数组
          gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        //指定数组数据 第一个参数表示的是每个点有几个坐标。
        //例如顶点,有 x、y、z值,所以是 3;而颜色是 r、g、b、a 值,所以是 4
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VertexBuffer);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
    
        /*
        //三角形的一个顶点,顶点取值范围-1,1
        private IntBuffer triggerBuffer=IntBuffer.wrap(new int[]{
                0,1,0,     //上顶点
                -1,-1,0,    //左顶点
                1,-1,0    //右下点
        });
    */
    
        //画图 第一个参数指明了画图的类型——三角形
       //后面两个参数指明,从哪个顶点开始画,画多少个顶点。
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    
    
      //取消顶点数组
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    

    相关文章

      网友评论

        本文标题:open gl基础知识

        本文链接:https://www.haomeiwen.com/subject/jkehgttx.html