OpenGL ES 基础知识笔记


1. SurfaceView在游戏中的使用:
    SurfaceView继承自View,但它与View不同,View是在UI的主线程中更新画面,而
    SurfaceView是在一个新线程中更新画面。View的特性决定了其不适合做动画,因为
    如果更新画面事件过长,那么住UI线程就会被正在画的函数阻塞。所以android通常用
    SurfaceView显示动画效果。

    SurfaceView主要有三个方法:
    1. public abstract void surfaceCreated(SurfaceHolder holder);
    在SurfaceView创建时调用该函数
    2. public abstract void surfaceChanged(SurfaceHolder holder);
    在SurfaceView改变时调用该函数
    3. public abstract void surfaceDestroyed(SurfaceHolder holder);
    在SurfaceView销毁前调用该函数

    abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),
    表示其为抽象成员。它不可以和 static 、virtual 一起使用。声明为 abstract
    成员可以不包括实现代码,但只要类中存在未实现的抽象成员,那么它的对象就不能
    被实例化。abstract通常用来强制继承类必须实现基类的某一抽象成员。

2. OpenGL ES: OpenGL for Embedded Systems

3. 设置三角形自定义卷绕顺序:
    glFrontFace(GL_CCW);    //设置逆时针(CCW:CounterClockWise)为正面
    glFrontFace(GL_CW);    //设置顺时针(CW:ClockWise)为正面

4. glDrawArrays(int mode, int first, int count)            //绘制函数
   glDrawElements(int mode, int count, int type, Buffer indices)//绘制函数
    glDrawArrays创建一个集合图元序列,使用数组中从first开始,到first+count-1结束
    的数组元素。mode为绘制模式。
    glDrawElements使用count个元素定义一个图元序列,type为indices(索引)数组中的
    数据类型,mode为绘制模式,indices数组存储顶点的索引值。

5. 渲染及绘制模式:
    渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的联系
    这个关系通过绘制模式给出。常用的绘制模式有
    GL_POINTS :把每个顶点作为一个点处理。顶点n定义里点n,共绘制n个点。
    GL_LINES :把没两个顶点作为一个独立的线段,n个顶点定义n/2个线段。如果n是
        奇数,则忽略最后一个顶点。
    GL_LINE_STRIP :绘制从第一个顶点到最后一个顶点依次相连的一组线段,n个顶点共绘制
        n-1条线段。
    GL_LINE_LOOP :绘制从第一个顶点到最后一个顶点依次相连的线段,然后最后一个顶点与
        第一个顶点相连。n个顶点共绘制n条线段。
    GL_TRIANGLES :把没三个顶点作为一个独立的三角形,n个顶点共绘制n/3个三角形。
    GL_TRIANGLE_STRIP :绘制一组相连的三角形,n个顶点共绘制n-2个三角形
    GL_TRIANGLE_FAN    :绘制一组相连的三角形,三角形是由第一个顶点及以后所给定的顶点组成
        ,每个三角形中都有第一个顶点。n个顶点共绘制n-2个三角形。

6. 设置着色模式
    gl.glShadeModel(GL10.GL_SMOOTH);    //设置着色模式为平滑着色
    gl.glShadeModel(GL10.GL_FLAT);        //设置着色模式为不平滑着色
    在不平滑着色模式下,三角形三个顶点中最后一个顶点的颜色决定三角形的颜色。

7. 背面剪裁:
    gl.glEnable(GL10.GL_CULL_FACE);        //设置打开背景剪裁
    gl.glDisable(GL10.GL_CULL_FACE);    //设置关闭背景剪裁

8. 投影方式(透视投影/正交投影):
    float ratio = (float)320/480;            //透视投影的比例
    gl.glFrustumf(-ratio, ratio, -1, 1, 1f, 10);    //计算产生透视投影矩阵
    gl.glOrthof(-ratio, ratio, -1, 1, 1, 10);    //计算产生正交投影矩阵

9. 加载单位变换矩阵:
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    此工作将清除虚拟世界中的一切平移、旋转、缩放或其他变化,并将观察者置于原点。

10. 一个三角形的绘制方法:
    1.索引法
    gl.glDrawElements(填充方式,索引数量,索引类型,顶点数量);
    2.顶点法
    gl.glDrawArrys(填充方式,开始点编号,顶点数量);

光照效果:
=================================================
11. 光源的开启和关闭:
    gl.glEnable(GL10.GL_LIGHTING);
    gl.glDisable(GL10.GL_LIGHTING);
    只启动Enable()是没有光的。必须得进行其他的设置。

12. 光的设置方法:
    glLightfv(int light, int pname, float[] params, int offset);
    参数light:该参数指定OpenGL ES中的灯,用GL_LIGHT0到GL_LIGHT7来表示8盏灯

13. 定向光和定位光:
    设定定向光和定位光,参数:pname应该设置成GL_POSITION。
    参数params:是一个float数组,这个数组中一共有4个值,
    在定向光中
    前3个数值表示光的方向,光的方向为从向量点处向原点处照射。如{0,1,0,0}表示沿Y轴
    负方向的光。最后的0表示此光源发出的光是定向光。
    在定位光中
    前3个数值表示光的位置坐标。如{0,1,0,1}表示位于{0,1,0}处的定位光。最后的1表示
    此光源发出的是定向光。

14. 光源的颜色设定:
    OpenGL ES允许把与颜色相关的3个不同参数(pname)GL_AMBIENT, GL_DIFFUSE,
    GL_SPECULAR与任何特定的光源相关联
    在光颜色设定中params[]数组中一共也是有4个数值,分别代表RGBA四个彩色通道。

    ambient即环境光,表示一个特定的光源在场景中所添加的环境光的RGBA强度,一般
    环境光的值偏小。
    diffuse即散射光,数值大小居中。light0的默认值为白色,其它灯的默认值为黑色。
    specular即反射光,数值大小偏大。light0的默认值为白色,其它灯的默认值为黑色。

15. GL_LIGHT0的初始化举例:
    private void initLight0(GL10 gl){
    //****打开light0
    gl.glEnable(GL10.GL_LIGHT0);
    //****设置环境光
    float[] ambientParams = {0.1f, 0.1f, 0.0f, 1.0f};
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientParams, 0);
    //****设置散射光
    float[] diffuseParams = {0.5f, 0.5f, 0.0f, 1.0f};
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseParams, 0);
    //****设置反射光
    float[] specularParams = {1.0f, 1.0f, 0.0f, 1.0f};
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularParams, 0);
    }

16. 物体的材质设置方法:
    设置材质的主要工作就是设置材质对于环境光,散射光,镜面光的反射能力,也就是说材质能
    反射什么颜色的光。例如,白色的材质能反射所有颜色的光,红色的材质只能反射红色光。
    相关属性通过方法
    public abstract void gl         params, int offset);进行设置。
    参数face:设置材质能反光的面,设置为GL10.GL_FRONT_AND_BACK,可以实现正面
    反面均可反射光线。
    参数pname:如果要设置环境光--GL10.GL_AMBIENT
          如果要设置散射光--GL10.GL_DIFFUSE
          如果要设置反射光--GL10.GL_SPECULAR
        还有一种参数,刚光反射区域 --GL10.GL_SHININESS
    高光反射区域,数值越大,高亮区域越小,越暗。

17. 初始化材质为白色的举例:
    private void initMaterialWhite(GL10 gl){
    //**** 设置环境光
    float ambientMaterial[] = {0.4f, 0.4f, 0.4f, 1.0f};
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,
         ambientMaterial, 0);
    //**** 设置散射光
    float diffusParams[] = {0.8f, 0.8f, 0.8f, 1.0f};
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,
        diffusParams, 0);
    //**** 设置反射光
    float specularMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,
         specularMaterial, 0);
    //**** 设置高光反射区域
    float shininessMaterial[] = {1.5f};
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS,
         shininessMaterial, 0);
    }

    
    
    


你可能感兴趣的:(学习笔记)