opengl es 基礎教程1

一、什麼是 OpenGL?
   OpenGL 是個專業的3D程序接口,是一個功能強大,調用方便的底層3D圖形庫。 OpenGL  的前身是 SGI 公司爲其圖形工做站開的 IRIS GL。IRIS GL 是一個工業標準的3D圖形軟件接口,功能雖然強大可是移植性很差,因而 SGI 公司便在 IRIS GL 的基礎上開發  OpenGL  。具體詳細的介紹請  點擊這裏 。

二、OpenGL 的發展歷程
  1992年7月 發佈了  OpenGL 1.0 版本,並與微軟共同推出 Windows NT 版本的  OpenGL 。
  1995年  OpenGL 1.1 版本面市,加入了新功能,並引入了紋理特性等等。
  一直到 2009年8月Khronos小組發佈了 OpenGL 3.2,這是一年以來 OpenGL進行的第三次重要升級。
具體特色及功能、  OpenGL 現狀、發展歷程、 OpenGL 規範、編程入門請  點擊這裏 。

三、OpenGL  ES 簡介
      Android 3D  引擎採用的是 OpenGL ES OpenGL ES 是一套爲手持和嵌入式系統設計的3D 引擎API ,由Khronos 公司維護。在PC 領域,一直有兩種標準的3D API 進行競爭, OpenGL   DirectX 。通常主流的遊戲和顯卡都支持這兩種渲染方式,DirectX Windows 平臺上有很大的優點,可是  OpenGL  具備更好的跨平臺性。
因爲嵌入式系統和PC 相比,通常說來,CPU 、內存等都比PC 差不少,並且對能耗有着特殊的要求,許多嵌入式設備並無浮點運算協處理器,針對嵌入式系統的以上特色,Khronos 對標準的  OpenGL  系統進行了維護和改動,以指望知足嵌入式設備對3D 繪圖的要求。

四、Android OpenGL ES 簡介
Android 系統使用  OpenGL  的標準接口來支持3D 圖形功能,android 3D  圖形系統也分爲 java  框架和本地代碼兩部分。本地代碼主要實現的  OpenGL  接口的庫,在 Java  框架層,javax.microedition.khronos.opengles  是 java 標準的  OpenGL  包,android.opengl 包提供了  OpenGL  系統和 Android GUI  系統之間的聯繫。

 五、Android 支持 OpenGL 列表
  • 一、GL
  • 二、GL 10
  • 三、GL 10 EXT
  • 四、GL 11
  • 五、GL 11 EXT
  • 六、GL 11 ExtensionPack
咱們將使用 GL10 這個類開始接觸  OpenGL ,探索3D 領域。

六、一步一步實現本身的 Renderer 類
在 Android 中咱們使用 GLSurfaceView 來顯示  OpenGL 視圖,該類位於 android.opengl 包裏面。它提供了一個專門用於渲染3D 的接口 Renderer 。接下來咱們就來一步步構建本身的 Renderer 類。
  • 一、爲 Renderer 類趕回命名空間
    import  android.opengl.GLSurfaceView.Renderer;
     
  • 二、新建一個類來實現 Renderer 接口,代碼以下:
    public   class  ThreeDGl  implements  Renderer 
    {
    }
     
  • 三、如上代碼所寫,程序實現了 Renderer 類,則必須重寫如下方法
    public   void  onDrawFrame(GL10 gl) 
    {
    }
    public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height)
    {}
    public   void  onSurfaceCreated(GL10 gl, EGLConfig config)
    {}
     
  • 四、當窗口被建立時須要調用 onSurfaceCreate ,咱們能夠在這裏對 OpenGL 作一些初始化工做,例如:
                     //  啓用陰影平滑
            gl.glShadeModel(GL10.GL_SMOOTH);
            
            
    //  黑色背景
            gl.glClearColor( 0 0 0 0 );
            
            
    //  設置深度緩存
            gl.glClearDepthf( 1.0f );                            
            
    //  啓用深度測試
            gl.glEnable(GL10.GL_DEPTH_TEST);                        
            
    //  所做深度測試的類型
            gl.glDepthFunc(GL10.GL_LEQUAL);                            
            
            
    //  告訴系統對透視進行修正
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
     
    glHint 用於告訴 OpenGL 咱們但願進行最好的透視修正,這會輕微地影響性能,但會使得透視圖更好看。
    glClearColor 設置清除屏幕時所用的顏色,色彩值的範圍從 0.0f~1.0f 大小從暗到這的過程。
    glShadeModel 用於啓用陰影平滑度。陰影平滑經過多邊形精細地混合色彩,並對外部光進行平滑。
    glDepthFunc 爲將深度緩存設想爲屏幕後面的層,它不斷地對物體進入屏幕內部的深度進行跟蹤。
    glEnable 啓用深度測試。
  • 五、當窗口大小發生改變時系統將調用 onSurfaceChange 方法,能夠在該方法中設置 OpenGL 場景大小 ,代碼以下:
    // 設置OpenGL場景的大小
    gl.glViewport( 0 0 , width, height);
     
  • 六、場景畫出來了,接下來咱們就要實現場景裏面的內容,好比:設置它的透視圖,讓它有種越遠的東西看起來越小的感受,代碼以下:
    // 設置投影矩陣
            gl.glMatrixMode(GL10.GL_PROJECTION);
            
    // 重置投影矩陣
            gl.glLoadIdentity();
            
    //  設置視口的大小
            gl.glFrustumf( - ratio, ratio,  - 1 1 1 10 );
            
    //  選擇模型觀察矩陣
            gl.glMatrixMode(GL10.GL_MODELVIEW);    
            
    //  重置模型觀察矩陣
            gl.glLoadIdentity();    
     
    gl.glMatrixMode(GL10.GL_PROJECTION); 指明接下來的代碼將影響 projection matrix (投影矩陣),投影矩陣負責爲場景增長透視度。
     gl.glLoadIdentity(); 此方法至關於咱們手機的重置功能,它將所選擇的矩陣狀態恢復成原始狀態,調用  glLoadIdentity(); 以後爲場景設置透視圖。
    gl.glMatrixMode(GL10.GL_MODELVIEW);   指明任何新的變換將會影響 modelview matrix (模型觀察矩陣)。
    gl.glFrustumf(-ratio, ratio, -11110); 此方法,前面4個參數用於肯定窗口的大小,然後面兩個參數分別是在場景中所能繪製深度的起點和終點。

  • 七、瞭解了上面兩個重寫方法的做用和功能以後,第三個方法 onDrawFrame 從字面上理解就知道此方法作繪製圖操做的。嗯,沒錯。在繪圖以前,須要將屏幕清除成前面所指定的顏色,清除嘗試緩存而且重置場景,而後就能夠繪圖了, 代碼以下:
    //  清除屏幕和深度緩存
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT  |  GL10.GL_DEPTH_BUFFER_BIT);
    //  重置當前的模型觀察矩陣
    gl.glLoadIdentity();
     
  • 八、Renderer 類在實現了上面的三個重寫以後,在程序入口中只須要調用
    Renderer render = new  ThreeDGl( this );
        
    /**  Called when the activity is first created.  */
        @Override
        
    public   void  onCreate(Bundle savedInstanceState) {
            
    super .onCreate(savedInstanceState);
            GLSurfaceView gview
    = new  GLSurfaceView( this );
            gview.setRenderer(render);
            setContentView(gview);
        }
     
    便可將咱們繪製的圖形顯示出來。
下面分享一段使用Renderer類繪製的三角形和四邊形的代碼:
 
OpenGL 參考代碼
package  com.terry;

import  java.nio.IntBuffer;

import  javax.microedition.khronos.egl.EGLConfig;
import  javax.microedition.khronos.opengles.GL10;

import  android.opengl.GLSurfaceView.Renderer;

public   class  GLRender  implements  Renderer{

    
float  rotateTri,rotateQuad;
    
int  one = 0x10000 ;
    
    
// 三角形的一個頂點
     private  IntBuffer triggerBuffer = IntBuffer.wrap( new   int []{
            
0 ,one, 0 ,      // 上頂點
             - one, - one, 0 ,     // 左頂點
            one, - one, 0      // 右下點
    });
    
    
// 正方形的四個頂點
     private  IntBuffer quateBuffer = IntBuffer.wrap( new   int []{
            one,one,
0 ,
            
- one, - one, 0 ,
            one,
- one, 0 ,
            
- one, - one, 0
    });
    
    
    
private  IntBuffer colorBuffer = IntBuffer.wrap( new   int []{
            one,
0 , 0 ,one,
            
0 ,one, 0 ,one,
            
0 , 0 ,one,one
    });
    
    
    
    @Override
    
public   void  onDrawFrame(GL10 gl) {
        
//  TODO Auto-generated method stub
        
        
//  清除屏幕和深度緩存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT  |  GL10.GL_DEPTH_BUFFER_BIT);
        
//  重置當前的模型觀察矩陣
        gl.glLoadIdentity();


        
//  左移 1.5 單位,並移入屏幕 6.0
        gl.glTranslatef( - 1.5f 0.0f - 6.0f );
         
// 設置旋轉
        gl.glRotatef(rotateTri,  0.0f 1.0f 0.0f );
        
        
// 設置定點數組
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        
// 設置顏色數組
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        
        gl.glColorPointer(
4 , GL10.GL_FIXED,  0 , colorBuffer);
        
//  設置三角形頂點
        gl.glVertexPointer( 3 , GL10.GL_FIXED,  0 , triggerBuffer);
        
// 繪製三角形
        gl.glDrawArrays(GL10.GL_TRIANGLES,  0 3 );
        
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        
        
// 繪製三角形結束
        gl.glFinish();
        
        
/** ******************** */
        
/*  渲染正方形  */
        
//  重置當前的模型觀察矩陣
        gl.glLoadIdentity();
        
        
//  左移 1.5 單位,並移入屏幕 6.0
        gl.glTranslatef( 1.5f 0.0f - 6.0f );
        
        
//  設置當前色爲藍色
        gl.glColor4f( 0.5f 0.5f 1.0f 1.0f );
        
// 設置旋轉
        gl.glRotatef(rotateQuad,  1.0f 0.0f 0.0f );
        
        
// 設置和繪製正方形
        gl.glVertexPointer( 3 , GL10.GL_FIXED,  0 , quateBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 
0 4 );
        
        
// 繪製正方形結束
        gl.glFinish();

        
// 取消頂點數組
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        
        
// 改變旋轉的角度
        rotateTri  +=   0.5f ;
        rotateQuad 
-=   0.5f ;
    }

    @Override
    
public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height) {
        
//  TODO Auto-generated method stub
        
        
float  ratio  =  ( float ) width  /  height;
        
// 設置OpenGL場景的大小
        gl.glViewport( 0 0 , width, height);
        
// 設置投影矩陣
        gl.glMatrixMode(GL10.GL_PROJECTION);
        
// 重置投影矩陣
        gl.glLoadIdentity();
        
//  設置視口的大小
        gl.glFrustumf( - ratio, ratio,  - 1 1 1 10 );
        
//  選擇模型觀察矩陣
        gl.glMatrixMode(GL10.GL_MODELVIEW);    
        
//  重置模型觀察矩陣
        gl.glLoadIdentity();    
        
    }

    @Override
    
public   void  onSurfaceCreated(GL10 gl, EGLConfig config) {
        
//  TODO Auto-generated method stub
        
//  啓用陰影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
        
        
//  黑色背景
        gl.glClearColor( 0 0 0 0 );
        
        
//  設置深度緩存
        gl.glClearDepthf( 1.0f );                            
        
//  啓用深度測試
        gl.glEnable(GL10.GL_DEPTH_TEST);                        
        
//  所做深度測試的類型
        gl.glDepthFunc(GL10.GL_LEQUAL);                            
        
        
//  告訴系統對透視進行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    }

}

相關文章
相關標籤/搜索