Thumbnail: jekyll

OpenGl Es(二)——绘制三角形详解

on under jekyll
3 minute read

下面是使用OpenGl Es绘制一个基本的三角形,旨在熟悉其使用流程。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TestGlSurfaceView view = new TestGlSurfaceView(this);
        view.setRenderer(new TestRenderer());
        //设置布局
        setContentView(view);
    }
}

class TestGlSurfaceView extends GLSurfaceView {

    public TestGlSurfaceView(Context context) {
        super(context);
    }

    public TestGlSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

}

class TestRenderer implements GLSurfaceView.Renderer {

    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
        //设置清屏颜色
        gl10.glClearColor(0f, 0f, 0f, 1f);
        //启用客户端状态,这里的参数是启用顶点缓冲区数组才可以使用其绘制三角形,这里是开启相关的状态机
        gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    }

    @Override
    public void onSurfaceChanged(GL10 gl10, int i, int i1) {
        /*
        设置视口,即要显示的区域
        int x,       要显示区域左下角的x坐标
        int y,       要显示区域左下角的y坐标
        int width,   显示区域的宽度
        int height,  显示区域的高度
        */
        gl10.glViewport(0, 0, i, i1);
        //设置矩阵模式为投影矩阵
        gl10.glMatrixMode(gl10.GL_PROJECTION);
        //重置矩阵,即初始化为单位矩阵
        gl10.glLoadIdentity();
        /*
          设置平截头体(视景体),设置一个比例来进行显示,即ratio
          float left,   近平面的左边距离原点的距离
          float right,  近平面的右边距离原点的距离
          float bottom, 近平面的底部距离原点的距离
          float top,    近平面的上部距离原点的距离
          float zNear,  相机距离近平面的距离
          float zFar,  相机距离远平面的距离
          值都是向量值
          */
        float ratio = (float) i / (float) i1;
        gl10.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);
    }

    @Override
    public void onDrawFrame(GL10 gl10) {
        //清理颜色缓冲区
        gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);

        gl10.glMatrixMode(GL10.GL_MODELVIEW);
        gl10.glLoadIdentity();
        //设置相机的朝向
       /*    gl   	a GL10 interface
             镜头的位置
             eyeX  	    eye point X
             eyeY	    eye point Y
             eyeZ	    eye point Z
             相机视图的中心点,为平截头体的中心点
             centerX	center of view X
             centerY	center of view Y
             centerZ	center of view Z
             确定相机上方的向量
             upX	    up vector X
             upY	up vector Y
             upZ	up vector Z*/
        GLU.gluLookAt(gl10, 0, 0, 5, 0, 0, 0, 0, 1, 0);
        //三角形的三个顶点数组
        float[] coords = {
                0f, 0.5f, 0f,
                -0.5f, -0.5f, 0f,
                0.5f, -0.5f, 0f
        };
        //字节缓冲区,用来存放顶点坐标数据
        ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4);
        //顶点的排序,设置为存入的顺序
        ibb.order(ByteOrder.nativeOrder());
        FloatBuffer fbb = ibb.asFloatBuffer();
        fbb.put(coords);
        //将指针指向首坐标
        ibb.position(0);
        //设置绘制的颜色
        gl10.glColor4f(0f, 1f, 1f, 1f);
        /*
        * 设置绘制的相关参数
        * int size,        指定为二维还是三维
        * int type,        每个点的的数据类型,这里是float
        * int stride,      跨度,即点是否连续绘制
        * Buffer pointer,  指定的顶点缓冲区
        *
        * */
        gl10.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
        /*
         * 进行三角形的绘制
         * int mode,   绘制的模式
         * int first, 绘制顶点的起点,一般为0
         * int count,绘制的点数
         */
        gl10.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    }
}

学习笔记, OpenGl Es
comments powered by Disqus