最近玩玩Android的openGL,做了點注釋,有用看看,沒有了無視
Java代碼
public class GL1 extends Activity {
private GLSurfaceView mGLSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLSurfaceView = new GLSurfaceView(this);
mGLSurfaceView.setRenderer(new One());
setContentView(mGLSurfaceView);
}
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
}
}
/**
* 渲染器
*
* @author yaoyuan
*
*/
class One implements Renderer {
private Square square;
public One() {
square = new Square();
}
/**
* 初始化視圖
*/
public void onDrawFrame(GL10 gl) {
/*
* 清空緩沖區預設值
*
* GL_COLOR_BUFFER_BIT 顏色緩沖區
*
* GL_DEPTH_BUFFER_BIT 深度緩沖區
*
* GL_STENCIL_BUFFER_BIT 模板緩沖區
*/
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
//乘一個翻譯矩陣代替當前的矩陣
gl.glTranslatef(0.0f, 0.0f, -6.0f);
//畫圖形
square.draw(gl);
}
/**
* 視圖改變時調用
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
if (height == 0) {
height = 1;
}
gl.glViewport(0, 0, width, height);
/**
* 指定當前的矩陣模式
*
* GL_MODELVIEW 模型視圖 GL_PROJECTION 投影 GL_TEXTURE 紋理
*/
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// 設置一個透視投影矩陣
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
/**
* 視圖創建時調用
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
/*
* 設置陰影模式 1.GL_FLAT 扁平 2.GL_SMOOTH 平滑
*/
gl.glShadeModel(GL10.GL_SMOOTH);
// 指定顏色緩沖區值
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 指定深度緩沖區值
gl.glClearDepthf(1.0f);
// 可用GL服務端功能
gl.glEnable(GL10.GL_DEPTH_TEST);
/*
* 深度緩存比較
*
* GL_NEVER 不通過
*
* GL_LESS 如果傳入的深度值小于存儲深度的值,通過
*
* GL_EQUAL 如果傳入的傳遞深度值等于存儲的深度值,通過
*
* GL_LEQUAL 如果傳入的深度值小于或等于存儲的深度值,通過
*
* GL_GREATER 如果傳入的深度值大于存儲深度值更大,通過
*
* GL_NOTEQUAL 如果傳入的深度值不等于存儲深度值,通過
*
* GL_GEQUAL 如果傳入的深度值大于或等于存儲深度值,通過
*
* GL_ALWAYS 始終通過
*/
gl.glDepthFunc(GL10.GL_LEQUAL);
// 指定特定于實現的提示
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}
}
/**
* 圖形
*
* @author yaoyuan
*
*/
class Square {
private FloatBuffer vertexBuffer;
private float vertices[] = {
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f
};
public Square() {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
}
public void draw(GL10 gl) {
// 定義前、后面對(GL_CW順時針、GL_CCW逆時針)
gl.glFrontFace(GL10.GL_CW);
// 定義一個定點坐標數組
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
/*
* 啟用客戶端功能
*
* GL_COLOR_ARRAY 當glDrawArrays、glDrawElements被調用時,顏色數組可以被讀寫
*
* GL_NORMAL_ARRAY 當glDrawArrays、glDrawElements被調用時,普通數組可以被讀寫
*
* GL_TEXTURE_COORD_ARRAY 當glDrawArrays、glDrawElements被調用時,踐理?酵可以被讀寫
*
* GL_VERTEX_ARRAY 當glDrawArrays、glDrawElements被調用時,矩陣數組可以被讀寫
*/
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 從數組數據中渲染圖元
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
// 禁用客戶端功能
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}