一、 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);