1. 程式人生 > >OpenGL ES 基礎知識筆記

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<aterialfv(int face, int pname, flot[]
        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);
    }