1.新建自己的View 实现 GLSurfaceView
2.初始化着色器Render
/**
* 本次画的是 立方体
* 以下设置 顶点数据
* 注意 顶点数据的顺序
*
* 顶点的 顺序依次是 (数字代表的是 顶点索引)
* 正面 左上 0 左下 1 右下2 右上3
* 反面 左上4 左下5 右下6 右上7
*
* 注意 OpenGl中没有四边形的绘制 所以 我们采用三角形绘制
* 这里的定点数顺序 不是唯一的 之所要注意 是因为 我们画矩形是用两个三角形实现
* 这里的注意是 画三角形使用顶点数据的时候 方向要一致
*
* 例如画 正面的时候 如果第一个三角形使用 032顶点 那么下个三角形必须是021
* 这里的每个面的三角形的绘制 可以是任何一个 该面上的顶点 但是 一旦定下 顶点顺序 那么该面绘制下一个的时候顺序要保持一致
* 在例如 后面 后面的索引是 4567 你可以选择任何一个开始 例如 674 那么下一个 必须是645
*
* 这里在 普及一下 坐标知识 立方体中心是(0,0,0);
* 这里我们画一个正方体 为了计算方便 设置 边长为2
* x轴 为顺平向右 y轴 竖直向上 z轴 垂直屏幕 向外
*/
public float[] cubePositions = {
-1.0f, 1.0f, 1.0f, //正面左上0
-1.0f, -1.0f, 1.0f, //正面左下1
1.0f, -1.0f, 1.0f, //正面右下2
1.0f, 1.0f, 1.0f, //正面右上3
-1.0f, 1.0f, -1.0f, //反面左上4
-1.0f, -1.0f, -1.0f, //反面左下5
1.0f, -1.0f, -1.0f, //反面右下6
1.0f, 1.0f, -1.0f, //反面右上7
};
/**
* 因为一个面要有两个三角形 所以 一个面要有6个顶点
* 六个面 共有36个(实际上 就有8个顶点 这里为了画三角形 重复用了一些顶点)
* 以下是顶点索引
*/
public short index[] = {
6, 7, 4, 6, 4, 5, //后面
6, 3, 7, 6, 2, 3, //右面
6, 5, 1, 6, 1, 2, //下面
0, 3, 2, 0, 2, 1, //正面
0, 1, 5, 0, 5, 4, //左面
0, 7, 3, 0, 4, 7, //上面
};
给顶点设置颜色八个顶点 8 个颜色
颜色排列:RGB A
public float color[] = {
1f, 1f, 1f, 1f,
0f, 1f, 0f, 1f,
1f, 1f, 0f, 1f,
1f, 0f, 1f, 1f,
0f, 0f, 1f, 1f,
0f, 0f, 0.5f, 1f,
1f, 1f, 1f, 1f,
0.5f, 0f, 0f, 1f,
};
/**
* @Effect 顶点着色器;
*/
public final String vertexShaderCode =
"attribute vec4 vPosition;" +//声明一个用attribute修饰的变量(顶点)
"uniform mat4 vMatrix;" +//总变换矩阵
"varying vec4 vColor;" +//颜色易变变量(成对出现)
"attribute vec4 aColor;" +//声明一个用attribute修饰的变量(颜色)
"void main() {" +
" gl_Position = vMatrix*vPosition;" +//根据总变换的矩阵计算绘制此顶点的位置
" vColor=aColor;" + //将接收的颜色传递给片元着色器
"}";
/**
* @Effect 片段着色器;
*/
public final String fragmentShaderCode =
// 片元语言没有默认浮点精度修饰符
// 因此,对于浮点数,浮点数向量和矩阵变量声明,
// 要么声明必须包含一个精度修饰符,要么不默认精度修饰符在之前 已经被声明过。
“precision mediump float;” +//预定义的全局默认精度
“varying vec4 vColor;” +//接收从顶点着色器过来的参数
“void main() {” +
” gl_FragColor = vColor;” + //给此片源颜色值
“}”;
/**
* @param shaderType(着色器类型,顶点和片元);
* @param shaderCode(着色器代码);
* @return 返回着色器对象
* @Effect 加载Shader的方法;
*/
public int loadShader(int shaderType, String shaderCode) {
//根据type创建顶点着色器或者片元着色器
int shader = GLES20.glCreateShader(shaderType);
//将资源加入到着色器中,并编译
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
/**
* @param ver_Tex(数组,一般为顶点数据);
* @return Float型缓冲
* @Effect 获取FloatBuffer数据缓冲;
*/
public FloatBuffer getFloatBuffer(float ver_Tex[]) {
//创建顶点坐标数据缓冲
// vc.length*4是因为一个整数四个字节
ByteBuffer bb = ByteBuffer.allocateDirect(ver_Tex.length * 4);
//设置字节顺序
// 由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer转换
bb.order(ByteOrder.nativeOrder());
//转换为Float型缓冲
FloatBuffer vertexBuffer = bb.asFloatBuffer();
//向缓冲区中放入顶点坐标数据
vertexBuffer.put(ver_Tex);
//设置缓冲区起始位置
vertexBuffer.position(0);
return vertexBuffer;
}
/**
* @param index(这个是绘制顶点的索引数组);
* @return Short型缓冲
* @Effect 获取ShortBuffer数据缓冲;
*/
public ShortBuffer getShortBuffer(short index[]) {
ByteBuffer cc = BcateDirect(index.length * 2);
cc.order(ByteOrder.nativeOrder());
ShortBuffer indexBuffer = cc.asShortBuffer();
indexBuffer.put(index);
indexBuffer.position(0);
return indexBuffer;
}