效果图如下:
1、首先给出的是圆锥面中的顶点坐标、纹理坐标和法向量生成的相关代码:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;
//圆锥侧面
public class ConeSide
{
int mProgram;//自定义渲染管线着色器程序id
int muMVPMatrixHandle;//总变换矩阵引用
int maPositionHandle; //顶点位置属性引用
int maTexCoorHandle; //顶点纹理坐标属性引用
int muMMatrixHandle;//位置、旋转、缩放变换矩阵
int maCameraHandle; //摄像机位置属性引用
int maNormalHandle; //顶点法向量属性引用
int maLightLocationHandle;//光源位置属性引用
String mVertexShader;//顶点着色器代码脚本
String mFragmentShader;//片元着色器代码脚本
FloatBuffer mVertexBuffer;//顶点坐标数据缓冲
FloatBuffer mTexCoorBuffer;//顶点纹理坐标数据缓冲
FloatBuffer mNormalBuffer;//顶点法向量数据缓冲
int vCount=0;
float xAngle=0;//绕x轴旋转的角度
float yAngle=0;//绕y轴旋转的角度
float zAngle=0;//绕z轴旋转的角度
public ConeSide(MySurfaceView mv,float scale,float r,float h,int n)
{
//调用初始化顶点数据的initVertexData方法
initVertexData(scale,r,h,n);
//调用初始化着色器的intShader方法
initShader(mv);
}
//自定义初始化顶点坐标数据的方法
public void initVertexData(
float scale, //尺寸大小
float r, //半径
float h, //高度
int n //切分的份数
)
{
r=scale*r;
h=scale*h;
float angdegSpan=360.0f/n;
vCount=3*n*4;//顶点个数,共有3*n*4个三角形,每个三角形都有三个顶点
//坐标数据初始化
float[] vertices=new float[vCount*3];
float[] textures=new float[vCount*2];//顶点纹理S、T坐