2012年11月13日 星期二

Android:OpenGL 加上顏色


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, 右上角
};

// 顏色的陣列(RGBA)
float[] color=new float[]{
1.0f,0.0f,0.0f,1.0f,//左上角
0.0f,1.0f,0.0f,1.0f,//左下角
0.0f,0.0f,1.0f,1.0f,//右下角
1.0f,1.0f,0.0f,1.0f //右上角
};

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

// 點的緩衝區
private FloatBuffer vertexBuffer;

// 顏色的緩衝區
private FloatBuffer colorBuffer;

// 索引值緩衝區
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);////設定緩衝區的起始位置

 //初始化座標顏色暫存,浮點數是4位元組因此需要把點陣列長度乘以4
 ByteBuffer cbb=ByteBuffer.allocateDirect(color.length*4);
 cbb.order(ByteOrder.nativeOrder());
 colorBuffer=cbb.asFloatBuffer();
 colorBuffer.put(color);
 colorBuffer.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.glEnableClientState(GL10.GL_COLOR_ARRAY);
 //為畫筆指定頂點顏色資料
 gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);

 // 以三點劃出三角形
 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);
}

}

沒有留言:

張貼留言