package com.bn.clp; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import com.bn.core.MatrixState; import android.opengl.GLES20; import static com.bn.clp.Constant.*; //有波浪效果的水面 public class Water { int mPrograms;//自定义渲染管线着色器程序id int muMVPMatrixHandle;//总变换矩阵引用id int maPositionHandle; //顶点位置属性引用id int maTexCoorHandle; //顶点纹理坐标属性引用id int maSTOffset; //水面纹理图的偏移量引用id static float[] mMMatrix = new float[16];//具体物体的移动旋转矩阵 FloatBuffer mVertexBuffer;//顶点坐标数据缓冲 FloatBuffer mTexCoorBuffer;//顶点纹理坐标数据缓冲 int vCount=0; //顶点数量 float currStartST=0; //水面纹理坐标的当前起始坐标0~1 public Water(int programId,int rows,int cols) { //初始化顶点坐标的initVertexData方法 initVertexData(rows,cols); //初始化着色器的方法 initShader(programId); //启动一个线程定时换帧 new Thread() { public void run() { while(Constant.threadFlag) { //所谓水面定时换帧只是修改每帧起始角度即可, //水面顶点Y坐标的变化由顶点着色单元完成 currStartST=(currStartST+0.004f)%1; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } //初始化顶点坐标的initVertexData方法 public void initVertexData(int rows,int cols) { final float pre_Size=UNIT_SIZE/rows; //顶点坐标数据的初始化================begin============================ vCount=cols*rows*2*3;//每个格子两个三角形,每个三角形3个顶点 float vertices[]=new float[vCount*3];//每个顶点xyz三个坐标 int count=0;//顶点计数器 for(int j=0;j