http://www.imobilebbs.com/wordpress/?p=1512
public class Square {
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,
};
private short[] indices = {0, 1, 2, 0, 2, 3};
private FloatBuffer vertexBuffer;
private ShortBuffer indexBuffer;
public Square() {
//分配新的直接字节缓冲区。
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
//获取底层平台的本机字节顺序。
vbb.order(ByteOrder.nativeOrder());
//创建此字节缓冲区的视图,作为 float 缓冲区。
vertexBuffer = vbb.asFloatBuffer();
//此方法将给定源 float 数组中的所有内容传输到此缓冲区中。
vertexBuffer.put(vertices);
//设置此缓冲区的位置。如果标记已定义且大于新的位置,则丢弃该标记。
vertexBuffer.position(0);
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
}
public void draw(GL10 gl) {
//设置逆时针方法为面的“前面”
gl.glFrontFace(GL10.GL_CCW);
//打开忽略“后面”装置
gl.glEnable(GL10.GL_CULL_FACE);
//“忽略”后面
gl.glCullFace(GL10.GL_BACK);
//Enabled the vertices buffer for writing and to be used during rendering.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
/*
* size:每个顶点有几个数指描述。必须是2,3 ,4 之一,初始值是4.
* type:数组中每个顶点的坐标类型。取值:GL_BYTE, GL_SHORT , GL_FIXED , GL_FLOAT, 初始值 GL_FLOAT
* stride:数组中每个顶点间的间隔,步长(字节位移)。取值若为0,表示数组是连续的 初始值为0
* pointer:It's your array ,存储着每个顶点的坐标值。初始值为0
*/
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
/*
* mode:指定要绘制哪种图元,可以为如下几种:GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
* count:要绘制的点的个数
* type:索引值的类型,可以为如下几种:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT
* indices:指向索引存贮位置的指针
*/
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
GL10.GL_UNSIGNED_SHORT, indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
}
}
//这是因为每次调用onDrawFrame 时,每次都再向后移动4个单位,需要加上重置Matrix的代码。
gl.glLoadIdentity();
//因为OpenGL ES从当前位置开始渲染,缺省坐标为(0,0,0),和View port 的坐标一样,
//相当于把画面放在眼前,对应这种情况OpenGL不会渲染离view Port很近的画面,因此我们需要将画面向后退一点距离:
gl.glTranslatef(0, 0, -8);