package com.xhm.getaccount; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.ShortBuffer; import javax.microedition.khronos.opengles.GL10; /** * 主要实现渲染时的效果 * * @author Administrator * */ public class MyMesh { // 顶点的个数 private short mUnmIndexSize; // 顶点数组缓冲 private FloatBuffer mVertexBuffer; // 顶点顺序数组缓冲 private ShortBuffer mIndexBuffer; // 设置画笔的颜色 private float[] rgba = new float[] { 0.0f, 0.0f, 0.0f, 1.0f }; /** * 画笔设置 * * @param gl * 画笔 */ public void draw(GL10 gl) { /** * 设置顶点的连接顺序 * * glFrontFace(GL_CCW)设置CCW方向为“正面”,CCW即CounterClockWise,逆时针 * * glFrontFace(GL_CW)设置CW方向为“正面”,CW即ClockWise,顺时针 */ gl.glFrontFace(GL10.GL_CCW); /** * 开启剔除效果 */ gl.glEnable(GL10.GL_CULL_FACE); /** * glCullFace()参数包括GL_FRONT和GL_BACK. * * 表示禁用多边形正面或者背面上的光照、阴影和颜色计算及操作, * * 消除不必要的渲染计算。 */ gl.glCullFace(GL10.GL_BACK); /** * 开启某种状态,类似管道流,用完之后需要关闭。 * * GL_VERTEX_ARRAY准备接受顶点数组 */ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); /** * 参数: * * size:指定了每个顶点对应的坐标个数,只能是2,3,4中的一个,默认值是4 * type:指定了数组中每个顶点坐标的数据类型,可取常量:GL_BYTE, GL_SHORT,GL_FIXED,GL_FLOAT; * stride:指定了连续顶点间的字节排列方式,如果为0,数组中的顶点就会被认为是按照紧凑方式排列的,默认值为0 * pointer:制订了数组中第一个顶点的首地址 * ,默认值为0,对于我们的android,大家可以不用去管什么地址的,一般给一个IntBuffer就可以了。 */ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer); /** * 设置画笔的颜色 */ gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]); /** * mode指定 绘制图元的类型,它应该是下列值之一: * * GL_POINTS:独立的点。 * * GL_LINE_STRIP:将所有点连接起来组成一条线。 * * GL_LINE_LOOP:将所有点连接起来组成一个圈。 * * GL_LINES:两个相连组成线段。 * * GL_TRIANGLE_STRIP:每相邻三个顶点组成一个三角形,为一系列相接三角形构成。 * * GL_TRIANGLE_FAN:以一个点为三角形公共顶点,组成一系列相邻的三角形。 * * GL_TRIANGLES:每隔三个顶点构成一个三角形,为多个三角形组成。 * * GL_QUAD_STRIP: * * GL_QUADS: * * GL_POLYGON: * * count为绘制图元的数量。 * * type为索引值的类型,只能是下列值之一: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or * GL_UNSIGNED_INT。 * * indices:指向索引存贮位置的指针 */ gl.glDrawElements(GL10.GL_TRIANGLES, mUnmIndexSize, GL10.GL_UNSIGNED_SHORT, mIndexBuffer); // 关闭开启的所有通道 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisable(GL10.GL_CULL_FACE); } /** * 添加顶点数组 * * @param vertices * 顶点坐标3个一组 */ public void setVertices(float[] vertices) { ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); mVertexBuffer = vbb.asFloatBuffer(); mVertexBuffer.put(vertices); mVertexBuffer.position(0); } /** * 添加顶点顺序数组 * * @param indices * 顺序三个一组,组成三角形 */ public void setIndices(short[] indices) { ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); ibb.order(ByteOrder.nativeOrder()); mIndexBuffer = ibb.asShortBuffer(); mIndexBuffer.put(indices); mIndexBuffer.position(0); mUnmIndexSize = (short) indices.length; } /** * 设置画笔的颜色 * * @param r * @param g * @param b * @param a */ public void setColor(float r, float g, float b, float a) { rgba[0] = r; rgba[1] = g; rgba[2] = b; rgba[3] = a; } }