Android---OpenGL ES之形状定义

本文译自:http://developer.android.com/training/graphics/opengl/shapes.html

创建高级图形作品的首要步骤是能够在要绘制图形的OpenGL ES的View的上下文场景中定义图形。如果你不了解OpenGL ES定义图形对象的一些基本要求,那么使用OpenGL ES来绘制图形就会有些困难。

本文介绍OpenGL ES相对于Android设备屏幕的坐标系统、图形和外观定义、以及三角形和矩形的定义。

定义三角形

OpenGL ES允许你使用三维空间坐标来定义要绘制的图形对象。因此,在绘制一个三角形之前,你必须定义它的坐标。在OpenGL中,定义坐标的通常做法是给坐标定义一个浮点数的顶点数组。为了获取最高的效率,你要把这些坐标写入一个ByteButter中,它会被传递到OpenGLES的图形处理通道中。

classTriangle{

   
private FloatBuffervertexBuffer;

    // number of coordinatesper vertex in this array
    static final int COORDS_PER_VERTEX = 3;
    static float triangleCoords[] = { // in counterclockwise order:
         0.0f,  0.622008459f, 0.0f,   // top
        -0.5f, -0.311004243f, 0.0f,   // bottom left
         0.5f, -0.311004243f, 0.0f    //bottom right
    };

    // Set color with red,green, blue and alpha (opacity) values
    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

    public Triangle() {
        //initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(
                // (number of coordinate values * 4 bytes per float)
               triangleCoords.length * 4);
        // use thedevice hardware's native byte order
        bb.order(ByteOrder.nativeOrder());

        // create afloating point buffer from the ByteBuffer
        vertexBuffer = bb.asFloatBuffer();
        // add thecoordinates to the FloatBuffer
        vertexBuffer.put(triangleCoords);
        // set thebuffer to read the first coordinate
        vertexBuffer.position(0);
    }
}

默认情况下,OpenGL ES会假设坐标系的原点[0,0,0](X,Y,Z)GLSurfaceView框架的中心,[1,1,0]是该框架的右上角,[-1,-1,0]是该框架的左下角。对于宰割坐标系的实例,请看OpenGL ES开发者指南。

注意,这个图形的坐标是按照逆时针的顺序来定义的。绘制顺序很重要,因为它定义了哪个面边是要绘制的图形表面,并且使用OpenGL ES的挑选表面的特性,能够选择不绘制背面。有关表面和选取的更多信息,请看OpenGL  ES开发者指南。

定义矩形

在OpenGL中定义三角形式是相当容易的,但是如果你想获得一个稍微复杂一点的图形,如矩形。有很多方法来做这件事,但是在OpenGL ES中绘制这样的图形的典型路径是使用两个一起绘制的三角形:

图1. 使用两个三角形来绘制一个矩形

还有,你应该按照逆时针的顺序来给代表这个矩形的两个三角形定义顶点,并把这些顶点放到一个ByteBuffer中。为了避免重复的定义两个三角形重合的坐标,我们使用了一个绘图列表来告诉OpenGL ES的图形管道如何绘制这些顶点。以下是绘图代码:

classSquare{

   
private FloatBuffer vertexBuffer;
    private ShortBufferdrawListBuffer;

    // number of coordinatesper vertex in this array
    static final int COORDS_PER_VERTEX = 3;
    static float squareCoords[] = { -0.5f,  0.5f, 0.0f,   // top left
                                   -0.5f, -0.5f, 0.0f,   // bottom left
                                    0.5f, -0.5f, 0.0f,   // bottom right
                                    0.5f,  0.5f, 0.0f }; // top right

    private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices

    public Square() {
        //initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(
        // (# ofcoordinate values * 4 bytes per float)
               squareCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(squareCoords);
        vertexBuffer.position(0);

        //initialize byte buffer for the draw list
        ByteBuffer dlb = ByteBuffer.allocateDirect(
        // (# ofcoordinate values * 2 bytes per short)
               drawOrder.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(drawOrder);
        drawListBuffer.position(0);
    }
}

这个例子向你展示了用OpenGL绘制比较复杂的图形所需要做的事情。通常,你要使用三角形的集合来绘制对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值