国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)之OpenGL繪制2D圖形的方法分析

2019-10-22 18:28:30
字體:
供稿:網(wǎng)友

本文實例講述了Android開發(fā)之OpenGL繪制2D圖形的方法。分享給大家供大家參考,具體如下:

Android為OpenGL ES支持提供了GLSurviceView組建,這個組建用于顯示3D圖形。GLSurviceView本身并不提供繪制3的圖形的功能,而是由GLSurfaceView.Renderer來完成了SurviceView中3D圖形的繪制。

歸納起來,在android中使用OpenGL ES需要3個步驟。

1. 創(chuàng)建GLSurviceView組件,使用Activity來顯示GLSurfaceView組件。

2. 為GLSurviceView組件創(chuàng)建GLSurviceView.Renderer實例,實現(xiàn)GLSurviceView.Renderer類時需要實現(xiàn)該接口里的3個方法。

(1) abstract void onDrawFrame(GL 10 gl):Renerer對象調(diào)用該方法繪制GLSurviceView的當(dāng)前幀。

(2) abstract void onSurfaceChanged(GL 10 gl,int width,int height):當(dāng)GLSurfaceView的大小改變時回調(diào)該方法。

(3) abstract void onDrawFrame(GL 10 gl,EGLConfig config):當(dāng)GLSurfaceView被創(chuàng)建時回調(diào)該方法。

3. 調(diào)用GLSurfaceView組件的setRebderer()方法指定Renderer對象,該Renderer對象將會完成GLSurfaceView里3D圖像的繪制。

從上面的介紹不難看出,實際上繪制3D圖像的難點不是如何使用GLSurface組件,二是如何實現(xiàn)Renderer類。實現(xiàn)Render類時需要實現(xiàn)3個方法。這3個方法都有一個GL形參,它就代表了GLOpenES的“繪制畫筆”,我們可以把它想象成Swing 2D繪圖中的Graphics,也可以想象成Android 2D繪圖中的Canvas組件——當(dāng)我們希望renderer繪制3D圖形時,實際上是調(diào)用GL10的方法來進(jìn)行繪制的。

當(dāng)Survice View被創(chuàng)建時,系統(tǒng)會回調(diào)Renderer對象的onSurfaceCreated()方法,該方法將可以對OpenGL ES執(zhí)行一些無需任何改變的初始化,例如如下初始化代碼:

public void OnSurfaceCreated(GL10 gl,EGLConfig config){  //關(guān)閉抗抖動  gl.glDisable(GL10.GL_DITHER);  //設(shè)置系對透視進(jìn)行修正  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);  gl.glClearColor(0, 0, 0, 0);  //設(shè)置陰影平滑模式  gl.glShadeModel(GL10.GL_SMOOTH);  //啟用深度測試  gl.glEnable(GL10.GL_DEPTH_TEST);  //設(shè)置深度測試的類型  gl.glDepthFunc(GL10.GL_LEQUAL);}

GL10就是OpenGL ES的繪制接口,雖然這里看到的是一個GL10,但實際上它也是GL11的實例,讀者可通過(gl instanceof GL11)判斷它是否為GL11接口的實例。

上面的方法中用到了GL10的一些初始化方法,關(guān)于這些方法的說明如下:

(1) GlDisable(int cap):該方法用于禁用OpenGL ES某個方面的特性。該方法中第一行代碼用于關(guān)閉抗抖動,這樣可以提高性能。
(2)glHint(int target,int mode):該方法用于對OpenGL ES某方面的修正。
(3)clearColor(float red,float green,float blue,float alpha):該方法設(shè)置清屏所用的顏色,四個參數(shù)分別設(shè)置紅、綠、藍(lán)、透明度值:0為最小值,1為最大值。例如設(shè)置gl.glClearColor(0,0,0,0);就是用黑色清屏。
(4)glShadeModel(int mode):該方法用于設(shè)置OpenGL ES的陰影模式。此處設(shè)為陰影平滑模式。
(5)glEnable(int cap):該方法與glDisable(int cap)方法相對,用于啟用OpenGL ES某方面的特性,此處用于啟動OpenGL ES的深度測試,就是讓OpenGL ES負(fù)責(zé)跟蹤每個物體在Z軸上的深度,這樣就可以避免后面的物體遮擋前面的物體。

當(dāng)SurviceView組建的大小發(fā)生變化時,系統(tǒng)會回調(diào)Renderer對象的onSurfaceChanged()方法,因此該方法通常用于初始化3D場景。例如如下初始化代碼:

public void onSurfaceChanged(GL10 gl,int width,int height){  //設(shè)置3D視窗的大小和位置  gl.glViewport(0,0,width,height);  //將當(dāng)前矩陣模式設(shè)為投影矩陣  gl.glMatrixMode(GL10.GL_PROJECTION);  //初始化單位矩陣  gl.glLoadIdentity();  //計算透視視窗的寬度、高度比  float ratio = (float)width/height;  //調(diào)用此方法設(shè)置透視視窗的空間大小  gl.glFrustumf(-ratio,ratio,-1,1,1,10);}

上面的方法用到了GL10的一些初始化方法,關(guān)于這些方法的說明如下:

1、 glViewport(int x,int y,int width,int height):設(shè)置3D視窗的位置與大小。其中前兩個參數(shù)指定該視窗的位置,后兩個參數(shù)指定該視窗的寬,高。

2、glMatrixMode(int mode):設(shè)置視圖的矩陣模型。通??山邮蹽L10.GL_PROJECTION、GL10.GL_MODELVIEW兩個常量值。

當(dāng)調(diào)用glMatrixMode(GL 10.GL_PROJECTION);代碼后,指定將屏幕設(shè)為透視圖,這意味著越遠(yuǎn)的東西看起來越小;當(dāng)調(diào)用glMatrixMode(GL 10. GL_MODELVIEW);代碼后,即將當(dāng)前矩陣模式設(shè)為模式視圖矩陣,這意味著任何新的變換都會影響該矩陣中的所有物體。

3、glLoadIdentity():相當(dāng)于reset()方法,用于初始化單位矩陣。

4、glFrustumf(float left,float right,float bottom,float top,float zNear,float zFar):用于設(shè)置透視投影的空間大小。前兩個參數(shù)用于設(shè)置X軸上的最小坐標(biāo)值、最大坐標(biāo)值;中間兩個參數(shù)用于設(shè)置Y軸上的最小坐標(biāo)值、最大坐標(biāo)值;后兩個參數(shù)用于設(shè)置Z軸上的最小坐標(biāo)值、最大坐標(biāo)值。

例如我們調(diào)用如下代碼:

gl.glFrustumf(-0.8,0.8,-1,1,1,10);

這意味著如果有一個二維矩形,它的四個頂點的坐標(biāo)分別為:(-0.8,1)、(0.8,1)、(0.8,-1),(-0.8,-1),這個矩陣將會占滿整個視窗。

GLSurfaceView上的所有3D圖形都是由Renderer的onDrawFrame(GL10 gl)方法繪制出來的,重寫該方法時就要把所有3D圖形都繪制出來,該方法通常以如下形式開始:

public void onDrawFrame(GL10 gl){  //清除屏幕緩存和深度緩存  gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);  ...}

希望本文所述對大家Android程序設(shè)計有所幫助。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嵊泗县| 阳曲县| 正宁县| 阆中市| 罗甸县| 邢台县| 乡宁县| 新宾| 辽宁省| 青河县| 旬邑县| 高陵县| 新津县| 醴陵市| 枣阳市| 海林市| 台东县| 普宁市| 滕州市| 尼勒克县| 萨迦县| 三明市| 苍梧县| 康平县| 克东县| 南昌市| 云霄县| 宁阳县| 潢川县| 武汉市| 乌兰浩特市| 资源县| 大余县| 兴海县| 乌拉特中旗| 中卫市| 富蕴县| 中卫市| 福泉市| 松滋市| 滨州市|