2012年11月13日 星期二

Android:OpenGL 建立2D矩形


Square:


package com.example.opengltest2;
import ....

public class Square {
// 點的陣列
private float vertices[] = { -1.0f, 1.0f, 0.0f, // 0, 左上角
  -1.0f, -1.0f, 0.0f, // 1, 左下角
  1.0f, -1.0f, 0.0f, // 2, 右下角
  1.0f, 1.0f, 0.0f, // 3, 右上角
};

// 連接點的次序
private short[] indices = { 0, 1, 2, 0, 2, 3 };

// 點的緩衝區
private FloatBuffer vertexBuffer;

// 索引值緩衝區
private ShortBuffer indexBuffer;

public Square() {
//初始化頂點座標暫存
// 浮點數是4位元組因此需要把點陣列長度乘以4
 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
 vbb.order(ByteOrder.nativeOrder());//設定為本機平台的位元組順序
 vertexBuffer = vbb.asFloatBuffer();//轉換為float形式的緩衝,並建立實例
 vertexBuffer.put(vertices);//將頂點座標陣列放進緩衝
 vertexBuffer.position(0);////設定緩衝區的起始位置

 ////初始化構造索引資料緩衝
 // 短整數是2位元組因此需要把點陣列長度乘以2
 ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
 ibb.order(ByteOrder.nativeOrder());
 indexBuffer = ibb.asShortBuffer();
 indexBuffer.put(indices);
 indexBuffer.position(0);
}

/**
 * 畫圖函式
 *
 * @param gl
 */
public void draw(GL10 gl) {
 // 逆時鐘
 gl.glFrontFace(GL10.GL_CCW);
 // 啟動CULL_FACE
 gl.glEnable(GL10.GL_CULL_FACE);
 // 刪除多邀形的背景
 gl.glCullFace(GL10.GL_BACK);

 // 啟動點的緩衝區
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 // 指定位置和資料格式
 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

 // 以三點劃出三角形
 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
   GL10.GL_UNSIGNED_SHORT, indexBuffer);

 // 除能點的緩衝區
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 // 除能CULL_FACE
 gl.glDisable(GL10.GL_CULL_FACE);
}

}

OpenGLRenderer

package com.example.opengltest2;
import ...

public class OpenGLRenderer implements Renderer {
private Square square;

public OpenGLRenderer() {
 // 初始化
 square = new Square();
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
// 清除螢幕和深度緩衝區
 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
 // 以單位矩陣取代目前的矩陣
 gl.glLoadIdentity();
 // Z軸轉置 4 單位
 gl.glTranslatef(0, 0, -4);
 // 畫出方形
 square.draw(gl);

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
// 設定新視域視窗的大小
 gl.glViewport(0, 0, width, height);
 // 選擇投射的陣列模式
 gl.glMatrixMode(GL10.GL_PROJECTION);
 // 重設投射陣
 gl.glLoadIdentity();
 // 也可以使用GLU內建的投影方法設置
 //GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
 float ratio=(float)width/height;//計算寬高比例大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//設定投影模式
 // 選擇MODELVIEW陣列
 gl.glMatrixMode(GL10.GL_MODELVIEW);
 // 重設MODELVIEW陣列
 gl.glLoadIdentity();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
// 設定背景顏色為黑色, 格式是RGBA
 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
 // 設定流暢的陰影模式
 gl.glShadeModel(GL10.GL_SMOOTH);
 // 深度緩區的設定
 gl.glClearDepthf(1.0f);
 // 啟動深度的測試
 gl.glEnable(GL10.GL_DEPTH_TEST);
 // GL_LEQUAL深度函式測試
 gl.glDepthFunc(GL10.GL_LEQUAL);
 // 設定很好的角度計算模式
 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

}

}

沒有留言:

張貼留言