openGL ES Android 三角形绘制

1、先新建一个Android项目

2、建一个类 MySurfaceView

public class MySurfaceView extends GLSurfaceView {
    //只是一个载体
    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MySurfaceView(Context context) {
        super(context);
    }
}

3、建一个抽象类 MyAbstractRenderer

public abstract class MyAbstractRenderer implements Renderer {

    //表层创建
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        //设置清屏色(背景)
        gl.glClearColor(0, 0, 0, 1);
        //启用顶点缓冲区
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    }
    //表层size改变
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        //openGL基于状态机
        /*单位矩阵
         * [1,0,0,0]
         * [0,1,0,0]
         * [0,0,1,0]
         * [0,0,0,1]
         */
        
        //视口
        gl.glViewport(0, 0, width, height);
        
        //矩阵模式
        //透视投影:有深度 (投影矩阵)
        //正投影:没有深度
        gl.glMatrixMode(GL10.GL_PROJECTION);//(投影矩阵)
        //原则:在操作矩阵前先加载单位矩阵 然后才干别的事情
        //将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
        gl.glLoadIdentity();
        
        //平截头体
        //左侧(宽高比),右侧(宽高比),下侧,上侧,近平面、远平面
        float ratio=(float)width/(float)height;
        gl.glFrustumf(-ratio, ratio,-1f, 1f, 3, 7);
    }
    /*
     *绘图
     * 在子线程运行
     */
    public void onDrawFrame(GL10 gl) {
        this.drawBefore(gl);
        //模型视图矩阵
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        
        //eyex,eyey,eyez        放置眼球的坐标
        //centerx,centery,ceterz眼球的观察点
        //upx,upy,upz            指定眼球向上的向量
        GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
        this.draw(gl);
    }
    
    /*
     * 绘图
     * 参数的基本设置
     */
    protected void drawBefore(GL10 gl) {
        //清除颜色缓冲区
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        //设置绘图的颜色
        gl.glColor4f(1f, 0, 0, 1f);
    }
    //子类实现绘图的方法
    protected abstract void draw(GL10 gl);
}

4、做一个工具类来实现数组转字节数组的方法

public class BufferUtil {
    public static ByteBuffer arr2ByteBuffer(float[] arr){
        //分配字节缓冲区空间,存放顶点坐标
        //float 为4个字节
        ByteBuffer ibb=ByteBuffer.allocateDirect(arr.length*4);
        //设置顺序(本地数据)
        ibb.order(ByteOrder.nativeOrder());
        //放置顶点坐标数组
        FloatBuffer fbb=ibb.asFloatBuffer();
        fbb.put(arr);
        //定位指针位置,从该位置开始读取顶点数据
        ibb.position(0);
        return ibb;
    }
    
    public static ByteBuffer list2ByteBuffer(List<Float> list){
        ByteBuffer ibb=ByteBuffer.allocateDirect(list.size()*4);
        ibb.order(ByteOrder.nativeOrder());
        
        FloatBuffer fbb=ibb.asFloatBuffer();
        
        for (Float f : list) {
            fbb.put(f);
        }
        ibb.position(0);
        return ibb;
    }
}


5、绘制三角形

public class MyTrianglesRenderer extends MyAbstractRenderer {
    /*
     * 绘制三角形
     */
    protected void draw(GL10 gl) {
        float [] dots={
                0,0.5f,0,
                -0.5f,-0.5f,0,
                0.5f,-0.5f,0
        };
        ByteBuffer ibb=BufferUtil.arr2ByteBuffer(dots);
        //3:表示三维点(x,y,z)
        //type:GL10.GL_FLOAT 每个点是什么数据类型
        //stride:0 跨度
        //ibb ,顶点缓冲区
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
        //画三角形
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    }
}


6、整合运行程序

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MySurfaceView view=new MySurfaceView(this);
        MyAbstractRenderer renderer=new MyTrianglesRenderer();
        view.setRenderer(renderer);
        setContentView(view);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值