//初始化顶点坐标与着色数据的方法
public void initVertexData(float[] vertices,float[] normals,float texCoors[])
{
//顶点坐标数据的初始化================begin============================
vCount=vertices.length/3;
//创建顶点坐标数据缓冲
//vertices.length*4是因为一个整数四个字节
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//顶点坐标数据的初始化================end============================
//顶点法向量数据的初始化================begin============================
ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
mNormalBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//顶点着色数据的初始化================end============================
//顶点纹理坐标数据的初始化================begin============================
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
tbb.order(ByteOrder.nativeOrder());//设置字节顺序
mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
mTexCoorBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//顶点纹理坐标数据的初始化================end============================
}
public void drawSelf(int texId)
{
//制定使用某套着色器程序
GLES30.glUseProgram(mProgram);
//将最终变换矩阵传入着色器程序
GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
//将位置、旋转变换矩阵传入着色器程序
GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
//将光源位置传入着色器程序
GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
//将摄像机位置传入着色器程序
GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
// 将顶点位置数据传入渲染管线
GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, mVertexBuffer);
//将顶点法向量数据传入渲染管线
GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, mNormalBuffer);
//将顶点纹理坐标数据传入渲染管线
GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, mTexCoorBuffer);
//启用顶点位置、法向量、纹理坐标数据
GLES30.glEnableVertexAttribArray(maPositionHandle);
GLES30.glEnableVertexAttribArray(maNormalHandle);
GLES30.glEnableVertexAttribArray(maTexCoorHandle);
//绑定纹理
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);
//绘制加载的物体
GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount);
}
public void initVertexData(float[] vertices,float[] normals,float texCoors[]){
//缓冲id数组
int[] buffIds=new int[3];
//生成3个缓冲id
GLES30.glGenBuffers(3, buffIds, 0);
//顶点坐标数据缓冲 id
mVertexBufferId=buffIds[0];
//顶点法向量数据缓冲id
mNormalBufferId=buffIds[1];
//顶点纹理坐标数据缓冲id
mTexCoorBufferId=buffIds[2];
//顶点坐标数据的初始化================begin============================
vCount=vertices.length/3;
//创建顶点坐标数据缓冲
//vertices.length*4是因为一个整数四个字节
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer转换,
//关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题。
//绑定到顶点坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
//向顶点坐标数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vertices.length*4, mVertexBuffer, GLES30.GL_STATIC_DRAW);
//顶点坐标数据的初始化================end============================
//顶点法向量数据的初始化================begin============================
ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
mNormalBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer转换,
//关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//绑定到顶点法向量数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
//向顶点法向量数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, normals.length*4, mNormalBuffer, GLES30.GL_STATIC_DRAW);
//顶点着色数据的初始化================end============================
//顶点纹理坐标数据的初始化================begin============================
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
tbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
mTexCoorBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//绑定到顶点纹理坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
//向顶点纹理坐标数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, texCoors.length*4, mTexCoorBuffer, GLES30.GL_STATIC_DRAW);
//顶点纹理坐标数据的初始化================end============================
//绑定到系统默认缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
}
public void drawSelf(int texId){
GLES30.glUseProgram(mProgram);
//将最终变换矩阵传入渲染管线
GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
//将位置、旋转变换矩阵传入渲染管线
GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
//将光源位置传入渲染管线
GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
//将摄像机位置传入渲染管线
GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
//启用顶点位置、法向量、纹理坐标数据
GLES30.glEnableVertexAttribArray(maPositionHandle);
GLES30.glEnableVertexAttribArray(maNormalHandle);
GLES30.glEnableVertexAttribArray(maTexCoorHandle);
//绑定到顶点坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
//将顶点位置数据送入渲染管线
GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);
//绑定到顶点法向量数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
//将顶点法向量数据送入渲染管线
GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);
//绑定到顶点纹理坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
//将顶点纹理坐标数据送入渲染管线
GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, 0);
//绑定到系统默认缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);//激活纹理
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);//绑定纹理
GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount); //绘制加载的物体
}
public void initVertexData(float[] vertices,float[] normals,float texCoors[]){
//缓冲id数组
int[] buffIds=new int[3];
//生成3个缓冲id
GLES30.glGenBuffers(3, buffIds, 0);
//顶点坐标数据缓冲 id
mVertexBufferId=buffIds[0];
//顶点法向量数据缓冲id
mNormalBufferId=buffIds[1];
//顶点纹理坐标数据缓冲id
mTexCoorBufferId=buffIds[2];
//顶点坐标数据的初始化================begin============================
vCount=vertices.length/3;
//创建顶点坐标数据缓冲
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
//绑定到顶点坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
//向顶点坐标数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vertices.length*4, mVertexBuffer, GLES30.GL_STATIC_DRAW);
//顶点坐标数据的初始化================end============================
//顶点法向量数据的初始化================begin============================
ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
mNormalBuffer.position(0);//设置缓冲区起始位置
//绑定到顶点法向量数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
//向顶点法向量数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, normals.length*4, mNormalBuffer, GLES30.GL_STATIC_DRAW);
//顶点着色数据的初始化================end============================
//顶点纹理坐标数据的初始化================begin============================
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoors.length*4);
tbb.order(ByteOrder.nativeOrder());//设置字节顺序
FloatBuffer mTexCoorBuffer = tbb.asFloatBuffer();//转换为Float型缓冲
mTexCoorBuffer.put(texCoors);//向缓冲区中放入顶点纹理坐标数据
mTexCoorBuffer.position(0);//设置缓冲区起始位置
//绑定到顶点纹理坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
//向顶点纹理坐标数据缓冲送入数据
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, texCoors.length*4, mTexCoorBuffer, GLES30.GL_STATIC_DRAW);
//顶点纹理坐标数据的初始化================end============================
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
initVAO();
}
public void initVAO(){
int[] vaoIds=new int[1];
//生成VAO
GLES30.glGenVertexArrays(1, vaoIds, 0);
vaoId=vaoIds[0];
//绑定VAO
GLES30.glBindVertexArray(vaoId);
//启用顶点位置、法向量、纹理坐标数据
GLES30.glEnableVertexAttribArray(maPositionHandle);
GLES30.glEnableVertexAttribArray(maNormalHandle);
GLES30.glEnableVertexAttribArray(maTexCoorHandle);
//绑定到顶点坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mVertexBufferId);
//将顶点位置数据送入渲染管线
GLES30.glVertexAttribPointer(maPositionHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);
//绑定到顶点法向量数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mNormalBufferId);
//将顶点法向量数据送入渲染管线
GLES30.glVertexAttribPointer(maNormalHandle, 3, GLES30.GL_FLOAT, false, 3*4, 0);
//绑定到顶点纹理坐标数据缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,mTexCoorBufferId);
//将顶点纹理坐标数据送入渲染管线
GLES30.glVertexAttribPointer(maTexCoorHandle, 2, GLES30.GL_FLOAT, false, 2*4, 0);
// 绑定到系统默认缓冲
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,0);
GLES30.glBindVertexArray(0);
}
public void drawSelf(int texId){
GLES30.glUseProgram(mProgram);
//将最终变换矩阵传入渲染管线
GLES30.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
//将位置、旋转变换矩阵传入渲染管线
GLES30.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
//将光源位置传入渲染管线
GLES30.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
//将摄像机位置传入渲染管线
GLES30.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
GLES30.glBindVertexArray(vaoId);
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);//激活纹理
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId); //绑定纹理
GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, vCount); //绘制加载的物体
GLES30.glBindVertexArray(0);
}