Android 平台下OpenGL绘制立方体(1)

写在文前的话

回顾Opengl绘制图形的开发步骤

1.新建自己的View 实现 GLSurfaceView
2.初始化着色器Render

1)设置Opengl 版本 非必需
2)设置着色器
3)设置渲染模式
4)实现 onSurfaceCreated
4.1)设置背景
4.2)开启深度测试
4.3)复杂图形的对象的实例化
5)实现onSurfaceChanged
5.1)设置视口
5.2)设置投影矩阵
5.3)设置相机
6)实现onDrawFrame

本文的一些说明

本文 用到了着色器语言 暂时 暂时先这样用 以后会 介绍书写和使用

图形类的实现

抽出部分功能方法 形成抽象类Utils

Utils 实现

/**
* 本次画的是 立方体
* 以下设置 顶点数据
* 注意 顶点数据的顺序
*
* 顶点的 顺序依次是 (数字代表的是 顶点索引)
* 正面 左上 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;
}

图形类  

你可能感兴趣的:(Android 平台下OpenGL绘制立方体(1))