android中OpenGl初步(平面三角形,正方形)

效果图:

                             

1.绘图类

/**
 * Created by LH on 2016/11/16.
 */

public class OpenGLRender implements GLSurfaceView.Renderer {
    private float[] mTriangleArray = {
            0f,1f,0f,
            -1f,-1f,0f,
            1f,-1f,0f
    };
    private FloatBuffer mTriangleBuffer;
    private float[] mColorArray={
            1f,0f,0f,1f,     //红
            0f,1f,0f,1f,     //绿
            0f,0f,1f,1f      //蓝
    };
    private FloatBuffer mColorBuffer;
    //正方形的四个顶点
    private FloatBuffer quateBuffer ;
    private float[] mQuateArray = {
            -1f, -1f, 0f,
            1f, -1f, 0f,
            -1f, 1f, 0f,
            1f, 1f, 0f,
    };
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
        // 白色背景
        gl.glClearColor(1.0f,1.0f,1.0f,0f);
        // 设置深度缓存
        gl.glClearDepthf(1.0f);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所作深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);
        // 告诉系统对透视进行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        // 启用顶点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 启用颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        // 把三角形顶点转化成缓冲对象
        mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
        // 把颜色转化成缓冲对象
        mColorBuffer = BufferUtil.floatToBuffer(mColorArray);
        // 把正方形顶点转化成缓冲对象
        quateBuffer = BufferUtil.floatToBuffer(mQuateArray);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // 设置视口
        gl.glViewport(0, 0, width, height);
        // 宽高比
        float ratio = (float) width / (float) (height == 0 ? 1 : height);
        // 设置当前矩阵堆栈为投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 对投影矩阵的任何改变都清除掉
        gl.glLoadIdentity();
        // 实现Surface和坐标系之间的映射关系
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // 清除颜色缓冲
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
        // 对模型视景矩阵操作
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        // 对模型视景矩阵的任何改变都清除掉
        gl.glLoadIdentity();
        // 使用数组作为颜色
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);
        // 绘制小三角形
        gl.glLoadIdentity();
        // x轴平移-1.5 z轴平移-6.0(向里)
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
        // y轴扩大2倍
        gl.glScalef (1.0f, 2.0f, 1.0f);
        // 表示模型沿着(0,0,1)这个轴旋转10°
        gl.glRotatef(10.0f, -1.5f, 0.0f, -6.0f);
        // 设置顶点。第一个参数为顶点包含的数据长度。第二个参数为单位
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
        // 绘制。第一个参数绘制模式,第二个从缓存中哪一位开始绘制,第三个顶点的数量
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        // 结束绘制
        gl.glFinish();
        // 绘制正方形
        gl.glLoadIdentity();
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
        gl.glFinish();
    }
}
2.获取缓冲对象工具类

/**
 * Created by LH on 2016/11/16.
 */

public class BufferUtil {
    public static FloatBuffer floatToBuffer(float[] a){
        FloatBuffer mBuffer;
        //先初始化buffer,数组的长度*4,因为一个float占4个字节
        ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);
        //数组排序用nativeOrder
        mbb.order(ByteOrder.nativeOrder());
        mBuffer = mbb.asFloatBuffer();
        mBuffer.put(a);
        mBuffer.position(0);
        return mBuffer;
    }

    public static IntBuffer intToBuffer(int[] a){
        IntBuffer intBuffer;
        //先初始化buffer,数组的长度*4,因为一个float占4个字节
        ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);
        //数组排序用nativeOrder
        mbb.order(ByteOrder.nativeOrder());
        intBuffer = mbb.asIntBuffer();
        intBuffer.put(a);
        intBuffer.position(0);
        return intBuffer;
    }
}
3.调用方法

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        GLSurfaceView glSurfaceView=new GLSurfaceView(this);
        glSurfaceView.setRenderer(new OpenGLRender());
        setContentView(glSurfaceView);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值