openGL ES Android 三角形绘制

来源:互联网 发布:adobe acrobat x mac 编辑:程序博客网 时间:2024/04/30 01:15

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);    }}





0 0
原创粉丝点击