天天看點

OPENGL、EGL

一、            OPENGL概述:

在OPENGL庫中,有五個類,為:Cube、CubeRenderer、OpenGLDemo、OpenGLScreen和Renderer。其中,

1.1 Renderer是定義的接口;

1.2 CubeRenderer是Renderer接口的具體實作;

1.3  OpenGLDemo是程式的入口;

1.4  OpenGLScreen是程式進入後所顯示的螢幕;

1.5  Cube是3D模型的定義;

1.6  另外,CubeRenderer負責從Cube中擷取資料,然後将資料進行轉換和顯示。

1.7  在Blackberry用頂點數組法畫圖時,坐标原點是在正中間。

二、            OPENGL初始化:

OpenGLDemo應用程式的初始化過程如下:

2.1OpenGLDemo應用程式以OpenGLDemo類作為入口,在該類的靜态main方法裡建立了一個OpenGLDemo執行個體。

2.2 在OpengLDemo的構造函數裡首先判斷目前裝置是否支援OpenGL,如果不支援OpenGL則彈出對話框提示使用者并退出應用程式,如果支援OpenGL才繼續執行初始化過程。

2.3 在裝置支援OpenGL情況下建立一個OpenGLScreen執行個體。

2.4 在建立OpenGLScreen執行個體的過程中建立了一個CubeRender執行個體。

2.5 将第3步建立的OpenGLScreen執行個體顯示出來。

2.6 調用OpenGLDemo的EnterEventDispatcher()方法進行事件循環。

2.7 部分代碼如下:

//檢測是否支援OpenGL

if(GLUtils.isSupported()){

      // 如果支援OpenGL則建立OpenGLScreen執行個體并顯示該執行個體

OpenGLScreenscreen = newOpenGLScreen(newCubeRenderer());

pushScreen(screen);

}

2.8、 EGLBoolean eglBindAPI(EGLenum api);

       api:Specifiesthe client API to bind, one of EGL_OPENGL_API, EGL_OPENGL_ES_API, orEGL_OPENVG_API.

       If api is EGL_OPENGL_API, the currentrendering API is set to the OpenGL API.

       If api is EGL_OPENGL_ES_API, the currentrendering API is set to the OpenGL ES API.

       If api is EGL_OPENVG_API, the currentrendering API is set to the OpenVG API.

       If an error occurs, the current renderingAPI is unchanged.

三、OpenGL中的一些函數及作用(此欄的函數,是按照程式中使用的順序排列)

3.1 清屏函數

原型:void glClear(intmask);

清屏函數,參數為清屏方式,有areGL_COLOR_BUFFER_BIT , GL_DEPTH_BUFFER_BIT , GL_ACCUM_BUFFER_BIT , andGL_STENCIL_BUFFER_BIT 四種。

3.2 矩陣變換的設定和目前矩陣的設定(暫時無法了解):

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

3.3 變換坐标系的函數:

glTranslatef(x, y, z);

沿着 X, Y 和 Z 軸移動。

3.3.1         X坐标軸從左至右,Y坐标軸從下至上,Z坐标軸從裡至外。

3.3.2   OpenGL螢幕中心的坐标值是X和Y軸上的0.0f點。

3.3.2         中心左面的坐标值是負值,右面是正值。

3.3.4         注意:

移向螢幕頂端是正值,移向螢幕底端是負值。

移入螢幕深處是負值,移出螢幕則是正值。

沿着 X, Y 和 Z 軸移動。

注意:

在glTranslatef(x, y, z)中,當您移動的時候,您并不是相對螢幕中心移動,而是相對與目前所在的螢幕位置。其作用就是将你繪點坐标的原點在目前原點的基礎上平移一個(x,y,z)向量。

         3.4 旋轉函數:

                   gl.glRotatef(_angle,1.0f, 1.0f, 0.0f);

                   3.4.1 第一個參數是旋轉的角度(度);

                   3.4.2 其他參數是旋轉中心;

         3.5 開啟OpenGL數組繪圖功能

                   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

                 gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

       gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

其中第一句用于啟動頂點數組支援,第二句用于啟動法向量數組的支援,第三句用于啟動紋理數組的支援

         3.6視窗變換函數

                   glViewport;

函數有四個參數,

3.6.1 第一個參數和第二個參數指定圖檔的左下角出現在什麼位置;

3.6.2 第三個和第四個參數用于指定生成圖檔的寬和高。

         3.7繪制頂點函數

                   glVertexPointer;

3.7.1 帶四個參數;

3.7.2 第一個參數為size,用于指定一個頂點由幾個坐标值構成,參數必須是2、3或者是4

         3.8 繪圖函數

                   voidglDrawArrays(int mode, int first, int count);

                   參數:mode:指定一個原始畫圖方式,可選:GL_POINTS ,GL_LINE_STRIP , GL_LINE_LOOP , GL_LINES , GL_TRIANGLE_STRIP , GL_TRIANGLE_FAN ,GL_TRIANGLES , GL_QUAD_STRIP , GL_QUADS , and GL_POLYGON;、

                   First:從第幾個(數組中)元素開始畫;

                   Count:Specifies the number of indices to be rendered.(經測試,應該是頂點數)

                   樣例:gl.glDrawArrays(GL10.GL_TRIANGLES, 0,_vertexCount);

              參數 mode:

         3.8.1.GL_TRIANGLES:每三個頂之間繪制三角形,之間不連接配接

         3.8.2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式繪制三角

                3.8.3. GL_TRIANGLE_STRIP連接配接并渲染。

3.8.4. GL_POINTS隻是畫出點,不連接配接,不渲染。

  3.8.5. GL_LINE_STRIP,按照點的順序,用線一次連接配接,但是不閉合。

  3.8.6. GL_LINE_LOOP:封閉線

   3.9 …(程式之中,此函數應在3.7函數之前)

                   void glVertexAttribPointer(GLuint index​, GLint size​, GLenum type​,GLboolean normalized​, GLsizei stride​, const GLvoid * pointer​);

                 voidglVertexAttribIPointer(GLuint index​, GLint size​, GLenum type​, GLsizeistride​, const GLvoid * pointer​);

                 voidglVertexAttribLPointer(GLuint index​, GLint size​, GLenum type​, GLsizeistride​, const GLvoid * pointer​);

void glVertexPointer(GLint size, GLenum type, GLsizei stride, constGLvoid * pointer);

1、參數:

3.9.1.1 index

指定要修改的頂點屬性的索引值

        3.9.1.2size

指定每個頂點屬性的元件數量。必須為1、2、3或者4。初始值為4。(夢維:如position是由3個(x,y,z)組成,而顔色是4個(r,g,b,a))

 3.9.1.3 type

指定數組中每個元件的資料類型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT。

 3.9.1.4 normalized

指定當被通路時,固定點資料值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE)。如果normalized被設定為GL_TRUE,意味着整數型的值會被映射至區間[-1,1](有符号整數),或者區間[0,1](無符号整數),反之,這些值會被直接轉換為浮點值而不進行歸一化處理。

        3.9.1.5stride

指定連續頂點屬性之間的偏移量。如果為0,那麼頂點屬性會被了解為:它們是緊密排列在一起的。初始值為0。指定了一個屬性到下一個屬性之間的步長。

        3.9.1.6pointer

指定一個指針,指向數組中第一個頂點屬性的第一個元件。初始值為0。

         2、錯誤:

3.9.2.1 GL_INVALID_ENUM錯誤:如果 type 不是可接受的值。

3.9.2.2 GL_INVALID_VALUE錯誤: 如果 index 大于等于 GL_MAX_VERTEX_ATTRIBS.

3.9.2.3 GL_INVALID_VALUE錯誤: 如果 size 不是 1, 2, 3, 或 4.

3.9.2.4 GL_INVALID_VALUE錯誤: 如果 stride 小于零.

四、BlackBerry GL程式建立:

4.1 要建立一個EGL程式,首先得建立個context以及一個window。如下:

//建立一個context

screen_context_tscreen_ctx;

screen_create_context(&screen_ctx,0);

//建立一個window

screen_window_tscreen_win;

screen_create_window(&screen_win,screen_ctx);

4.2 之後,初始化EGL,代碼如下:

         //建立一個EGL執行個體

EGLDisplayegl_disp;

egl_disp =eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(egl_disp,NULL, NULL);