最近項目中用到了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;}}