Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Opengles 學習一

Android Opengles 學習一

編輯:關於Android編程

     最近項目中用到了libgdx   於是便抽空看了下opengles,關於安卓的資料也不多,不過opengles 各個平台的代碼頁都差不多,IOS的資料還是比較豐富的 ,網上找到最多的就是一個三角形旋轉。        推薦一些學習opengl先要學的東西吧,  維基百科上很清楚    矩陣  這個非常重要  基本  opengl裡面很多效果實現 都靠矩陣變化   opengl中的坐標   不同於 android 本身的坐標系     物體坐標  世界坐標      屏幕坐標映射到  世界坐標     涉及到一些算法     射線拾取 ,包圍算法 等。。。   。。        先貼代碼了     [java] public class OpenglLess1Activity extends Activity {       @Override       protected void onCreate(Bundle savedInstanceState) {           // TODO Auto-generated method stub            super.onCreate(savedInstanceState);                      GLSurfaceView view = new GLSurfaceView(this);           view.setRenderer(new OpenglLess1Render());           setContentView(view);       }   }     public class OpenglLess1Activity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState);           GLSurfaceView view = new GLSurfaceView(this);         view.setRenderer(new OpenglLess1Render());         setContentView(view); } }         [java] view plaincopyprint?import java.nio.ByteBuffer;   import java.nio.ByteOrder;   import java.nio.FloatBuffer;      import javax.microedition.khronos.egl.EGLConfig;   import javax.microedition.khronos.opengles.GL10;      import android.opengl.GLSurfaceView.Renderer;   import android.util.Log;      public class OpenglLess1Render implements Renderer {       protected float near=1;         protected float far=20;       protected float ratio;       float[] lines=new float[]{-1f,0f,0f, //頂點坐標                1.0f,0f,0f,               0f,1.0f,0f};              @Override       public void onSurfaceCreated(GL10 gl, EGLConfig config) {           // TODO Auto-generated method stub            // 對透視進行修正            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);           // 啟用陰影平滑            gl.glShadeModel(GL10.GL_SMOOTH);              gl.glClearColor(0, 0, 0, 0);           // 設置深度緩存            gl.glClearDepthf(1.0f);           // 啟用深度測試            gl.glEnable(GL10.GL_DEPTH_TEST);           // 作為深度測試的類型            gl.glDepthFunc(GL10.GL_LEQUAL);       }          @Override       public void onSurfaceChanged(GL10 gl, int width, int height) {           // TODO Auto-generated method stub               ratio = (float) width / height;              Log.e("lin","width="+width+" height="+height+" ratio="+ratio);           // 設置OpenGl場景大小            gl.glViewport(0, 0, width, height);           // 設置矩陣投影            gl.glMatrixMode(GL10.GL_PROJECTION);           gl.glLoadIdentity();           // 設置串口的大小   near,far視野的距離   假設眼睛在原點   往Z軸負方向看   超過視野距離則看不見              gl.glFrustumf(-ratio, ratio, -1, 1, near, far);           // 選擇模型觀察矩陣            gl.glMatrixMode(GL10.GL_MODELVIEW);           gl.glLoadIdentity();       }          @Override       public void onDrawFrame(GL10 gl) {           // TODO Auto-generated method stub            //清楚顏色,深度緩存            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);                      //開啟模型試圖矩陣            gl.glMatrixMode(GL10.GL_MODELVIEW);                      //加載一個基本矩陣 可以理解為重置矩陣,因為每次draw後 會保留原來的矩陣,如果不重置矩陣 ,在translate時 物體就會越離越遠            gl.glLoadIdentity();           //眼睛設的視野距離為    -1,-20的坐標,則只有在該范圍內 的物體才能看到    將物體移動到 z =-3處            gl.glTranslatef(0, 0, -3f);           //定義坐標點  數組  Specifies the number of coordinates per vertex. Must be 2, 3, or 4. The initial value is 4.               gl.glVertexPointer(3, GL10.GL_FLOAT, 0,getFloatBuffer(lines));           //啟用定點數組   跟下面disable 相互對應              gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);                      //設置畫筆顏色            gl.glColor4f(1.0F, 0F,0F,1.0F);           //繪制三角形            gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);           gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);       }                 /**       * 分配內存空間    2.2 以前的版本冒失不需要這樣實現        * 浮點變量 每個占4字節       * @param coords       * @return       */       public FloatBuffer getFloatBuffer(float[] coords) {           ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);           vbb.order(ByteOrder.nativeOrder());           FloatBuffer mFVertexBuffer = vbb.asFloatBuffer();           mFVertexBuffer.put(coords);           mFVertexBuffer.position(0);           return mFVertexBuffer;       }   }     import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;   import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;   import android.opengl.GLSurfaceView.Renderer; import android.util.Log;   public class OpenglLess1Render implements Renderer { protected float near=1;   protected float far=20; protected float ratio; float[] lines=new float[]{-1f,0f,0f, //頂點坐標 1.0f,0f,0f, 0f,1.0f,0f};   @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub // 對透視進行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 啟用陰影平滑 gl.glShadeModel(GL10.GL_SMOOTH);   gl.glClearColor(0, 0, 0, 0); // 設置深度緩存 gl.glClearDepthf(1.0f); // 啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); // 作為深度測試的類型 gl.glDepthFunc(GL10.GL_LEQUAL); }   @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub   ratio = (float) width / height;   Log.e("lin","width="+width+" height="+height+" ratio="+ratio); // 設置OpenGl場景大小 gl.glViewport(0, 0, width, height); // 設置矩陣投影 gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); // 設置串口的大小   near,far視野的距離   假設眼睛在原點   往Z軸負方向看   超過視野距離則看不見   gl.glFrustumf(-ratio, ratio, -1, 1, near, far); // 選擇模型觀察矩陣 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); }   @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub //清楚顏色,深度緩存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   //開啟模型試圖矩陣 gl.glMatrixMode(GL10.GL_MODELVIEW);   //加載一個基本矩陣 可以理解為重置矩陣,因為每次draw後 會保留原來的矩陣,如果不重置矩陣 ,在translate時 物體就會越離越遠 gl.glLoadIdentity(); //眼睛設的視野距離為    -1,-20的坐標,則只有在該范圍內 的物體才能看到    將物體移動到 z =-3處 gl.glTranslatef(0, 0, -3f); //定義坐標點  數組  Specifies the number of coordinates per vertex. Must be 2, 3, or 4. The initial value is 4.   gl.glVertexPointer(3, GL10.GL_FLOAT, 0,getFloatBuffer(lines)); //啟用定點數組   跟下面disable 相互對應   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   //設置畫筆顏色 gl.glColor4f(1.0F, 0F,0F,1.0F); //繪制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }     /** * 分配內存空間    2.2 以前的版本冒失不需要這樣實現  * 浮點變量 每個占4字節 * @param coords * @return */ public FloatBuffer getFloatBuffer(float[] coords) { ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4); vbb.order(ByteOrder.nativeOrder()); FloatBuffer mFVertexBuffer = vbb.asFloatBuffer(); mFVertexBuffer.put(coords); mFVertexBuffer.position(0); return mFVertexBuffer; } }                  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved