萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> Android開發之OpenGL ES 基礎

Android開發之OpenGL ES 基礎

  OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和游戲主機等嵌入式設備而設計。

  該API由Khronos集團定義推廣,Khronos是一個圖形軟硬件行業協會,該協會主要關注圖形和多媒體方面的開放標准。

  在Android中搭建一個3D開發的基本框架:

  一、導入opengl es庫:

  [java]

  import javax.microedition.khronos.egl.EGLConfig;

  import javax.microedition.khronos.opengles.GL10;

  import javax.microedition.khronos.egl.EGLConfig;

  import javax.microedition.khronos.opengles.GL10;

  二、加入渲染支持:

  在Android中,GLSurfaceView包含了一個專門用於渲染3D的接口Renderer,來顯示OpenGL視圖:

  1、導入支持庫:

  [java]

  import android.opengl.GLSurfaceView;

  import android.opengl.GLSurfaceView.Renderer;

  import android.opengl.GLSurfaceView;

  import android.opengl.GLSurfaceView.Renderer;

  2、創建一個GLRender類實現Renderer接口:

  [java] view plaincopyprint?public class GLRender implements Renderer

  {

  }

  public class GLRender implements Renderer

  {

  }

  3、實現GLRender類中的3個抽象方法:

  [java]

  public void onDrawFrame(GL10 gl)

  public void onSurfaceChanged(GL10 gl, int width, int height)

  public void onSurfaceCreated(GL10 gl, EGLConfig config)

  public void onDrawFrame(GL10 gl)

  public void onSurfaceChanged(GL10 gl, int width, int height)

  public void onSurfaceCreated(GL10 gl, EGLConfig config)

  ① onSurfaceCreated 在窗口被創建時被調用,需要做一些必要的初始化工作:

  [java] view plaincopyprint?public void onSurfaceCreated(GL10 gl, EGLConfig config)

  {

  // 啟用陰影平滑

  gl.glShadeModel(GL10.GL_SMOOTH);

  // 黑色背景,設置清除屏幕時所用的顏色-->> (R, G, B, A) 取值: 0.0f-1.0f 。

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

  }

  public void onSurfaceCreated(GL10 gl, EGLConfig config)

  {

  // 啟用陰影平滑

  gl.glShadeModel(GL10.GL_SMOOTH);

  // 黑色背景,設置清除屏幕時所用的顏色-->> (R, G, B, A) 取值: 0.0f-1.0f 。

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

  } ②onSurfaceChanged 當窗口大小發生改變時被調用,不管窗口的大小是否已經改變,在程序開始時至少運行一次。

  在這個裡面,我們要設置OpenGL的場景大小:

  [java]

  public void onSurfaceChanged(GL10 gl, int width, int height)

  {

  float ratio = (float) width / height;

  //設置OpenGL場景的大小

  gl.glViewport(0, 0, width, height);

  //設置投影矩陣 -->> 增加透視.

  gl.glMatrixMode(GL10.GL_PROJECTION);

  //重置投影矩陣 -->> 恢復成原始狀態.

  gl.glLoadIdentity();

  // 設置視口的大小 -->> 前4個參數確定窗口的大小,後2個參數分別是在場景中所能繪制深度的起點和終點。

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

  // 選擇模型觀察矩陣

  gl.glMatrixMode(GL10.GL_MODELVIEW);

  // 重置模型觀察矩陣

  gl.glLoadIdentity();

  }

  public void onSurfaceChanged(GL10 gl, int width, int height)

  {

  float ratio = (float) width / height;

  //設置OpenGL場景的大小

  gl.glViewport(0, 0, width, height);

  //設置投影矩陣 -->> 增加透視.

  gl.glMatrixMode(GL10.GL_PROJECTION);

  //重置投影矩陣 -->> 恢復成原始狀態.

  gl.glLoadIdentity();

  // 設置視口的大小 -->> 前4個參數確定窗口的大小,後2個參數分別是在場景中所能繪制深度的起點和終點。

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

  // 選擇模型觀察矩陣

  gl.glMatrixMode(GL10.GL_MODELVIEW);

  // 重置模型觀察矩陣

  gl.glLoadIdentity();

  }③onDrawFrame 在窗口內進行繪圖操作。 在繪圖之前,需要將屏幕清楚成前面指定的顏色,清楚深度緩存並且重置場景,

  然後就可以繪圖了:

  [java]

  public void onDrawFrame(GL10 gl)

  {

  // 清除屏幕和深度緩存

  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  // 重置當前的模型觀察矩陣

  gl.glLoadIdentity();

  // 具體的繪圖操作開始 。。。

  }

  public void onDrawFrame(GL10 gl)

  {

  // 清除屏幕和深度緩存

  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  // 重置當前的模型觀察矩陣

  gl.glLoadIdentity();

  // 具體的繪圖操作開始 。。。

  }

  三、在主程序調用我們寫好的接口:

  調用GLSurfaceView類的setRenderer方法將我們自己構建的GLRender類設置為默認的Renderer,

  然後,通過setContentView方法使Activity顯示一個GLSurfaceView即可。

  [java]

  Renderer render = new GLRender();

  GLSurfaceView glView = new GLSurfaceView(this);

  glView.setRenderer(render);

  setContentView(glView);

  Renderer render = new GLRender();

  GLSurfaceView glView = new GLSurfaceView(this);

  glView.setRenderer(render);

  setContentView(glView);

  到這裡,我們的基本框架就搭建好了。

copyright © 萬盛學電腦網 all rights reserved