Android Opengles 學習一

來源:互聯網
上載者:User

     最近項目中用到了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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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}; @Overridepublic 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);} @Overridepublic 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();} @Overridepublic 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;}}          

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.