基本的概念:
3d图像的最下的单位是point,vertex,
他们代表三维空间的一个点并且用来构建复杂的物体

主要几下开发的步骤:
1.通常用一组浮点数来表示点,eg:一个正方形

    float vertices[] = {
    -1.0f, 1.0f, .0f, //左上
    -1.0f, -1.0f, .0f, //左下
    1.0f, -1.0f, .0f, //右下
    1.0f, 1.0f, .0f, //右上
    };

2.  为了提高性能,通常需要将浮点数组存放入一个字节缓冲区中 ,所以:
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); //申请内存
    
    vbb.order(ByteOrder.nativeOrder()); //设置字节顺序,其中ByteOrder.nativeOrder()是获取本机字节顺序
   
    FloatBuffer vertexBuffer = vbb.asFloatBuffer(); //转换为float型
   
    vertexBuffer.put(vertices); //添加数据
       
        vertexBuffer.position(); //设置缓冲区起始位置
       
3.  因为OpenGLES的很多函数功能的使用状态是处于关闭的。

    启用和关闭这些函数可以用glEnableClientState、glDisableClientState来完成。


            // 指定需要启用定点数组
           
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            // 说明启用数组的类型和字节缓冲,类型为GL_FLOAT
           
            gl.glVertexPointer(3, GL10.GL_FLOAT, , vertexBuffer);
           
            // 不再需要时,关闭顶点数组
           
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);



多边形:
                可以通过glFrontFace函数来交换“正面”和“反面”的概念。
                glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
                glFrontFace(GL_CW); // 设置CW方向为“反面”,CW即ClockWise,顺时针

渲染:
       渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的关系。
       这个关系通过绘制模式给出。
       常用到得绘制模式有GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、
       GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。



绘制图形步骤:

1.定义顶点并且转换存储在字节缓冲中;

2.我们使用顶点数组绘制图形,而opengles是默认关闭这个开关的,所以我们要启用它。
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

3.设置绘制的颜色。以下为设置红色

gl.glColor4f(1.0, 0.0, 0.0, 1.0); //R,G,B,A

4.由于我们使用顶点数组,我们必须通知OpenGL顶点的数组在什么地方。需使用函数:

gl.glVertexPointer(

3,//每个顶点的坐标的维数,这里为3xyz

GL10.GL_FIXED,//顶点坐标值的类型为GL_FIXED

0,//数组中数据的偏移值

mVertexBuffer//顶点坐标数据数组

);

5.开始绘图

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0, 9);

函数原型 voidglDrawArrays(int mode, int first, int count)

mode为绘制式,有GL_POINTS、GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP等。
first为数据在数组中的起始位置,读取数据的个数

视图与透视:
                        我们生活在一个三维的世界——如果要观察一个物体,我们可以:
                            1、从不同的位置去观察它。(视图变换)
                            2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
                            3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。
                            另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
                            4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
                            这些,都可以在OpenGL中实现。

                            OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,
                            都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。

1、模型变换和视图变换

                        即设置3D模型的位移,旋转等属性。由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,
                        应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
                        glMatrixMode(GL_MODELVIEW);
                        通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:
                        glLoadIdentity();
                        然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到三个函数:
                        glTranslate*,(*表示这个函数分为float型的glTranslatef和int型的glTranslatex)
                        把当前矩阵和一个表示移动物体的矩阵相乘。
                        三个参数分别表示了在三个坐标上的位移值。
                        glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。
                        物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
                        glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。


2、投影变换
                        投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。
                        (注意,从现在起,坐标可以不再是-1.0到1.0了!)
                        OpenGL支持两种类型的投影变换,即透视投影和正投影。
                        投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
                        glMatrixMode(GL_PROJECTION);
                        通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
                        glLoadIdentity();
                       
                        透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,
                        两条铁轨似乎在远处相交了。
                        使用glFrustum函数可以将当前的可视空间设置为透视投影空间。   
3、视口变换
                        当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:
                        应该把像素绘制到窗口的哪个区域呢?
                        通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。