中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中使用OpenGL繪制一個2D圖形

發布時間:2021-03-10 16:25:00 來源:億速云 閱讀:260 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關如何在Android中使用OpenGL繪制一個2D圖形,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

具體如下:

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

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

1. 創建GLSurviceView組件,使用Activity來顯示GLSurfaceView組件。

2. 為GLSurviceView組件創建GLSurviceView.Renderer實例,實現GLSurviceView.Renderer類時需要實現該接口里的3個方法。

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

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

(3) abstract void onDrawFrame(GL 10 gl,EGLConfig config):當GLSurfaceView被創建時回調該方法。

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

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

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

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

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

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

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

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

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

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

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

2、glMatrixMode(int mode):設置視圖的矩陣模型。通常可接受GL10.GL_PROJECTION、GL10.GL_MODELVIEW兩個常量值。

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

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

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

例如我們調用如下代碼:

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

這意味著如果有一個二維矩形,它的四個頂點的坐標分別為:(-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中使用OpenGL繪制一個2D圖形有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌平区| 天等县| 七台河市| 措勤县| 博客| 平塘县| 德安县| 苏尼特右旗| 红安县| 新宁县| 玉田县| 连平县| 西青区| 全南县| 江北区| 汶上县| 怀化市| 布拖县| 商洛市| 同仁县| 澄城县| 盐池县| 石林| 搜索| 神木县| 夏津县| 万荣县| 朔州市| 文山县| 黎川县| 呼和浩特市| 丰原市| 金川县| 顺昌县| 沙田区| 大埔县| 凤城市| 成都市| 游戏| 利辛县| 老河口市|