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