Android Training - 使用OpenGL ES(2) - 定义形状

来源:互联网 发布:货代软件 编辑:程序博客网 时间:2024/05/22 16:06
开始绘制的第一步就是定义形状。下面我们学习定义一个三角形和一个正方形。

定义一个三角形

OpenGL ES允许你使用坐标在三维空间中定义一个绘图对象。所以,在定义三角形之前,你需要先定义它的坐标。通常的方法是定义一个顶点坐标数组。为了达到最大效能,你要把坐标写入到ByteBuffer中,它被传递到OpenGL ES图像通道中进行加工。
class Triangle {    private FloatBuffer vertexBuffer;    // number of coordinates per 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 the device hardware's native byte order        bb.order(ByteOrder.nativeOrder());        // create a floating point buffer from the ByteBuffer        vertexBuffer = bb.asFloatBuffer();        // add the coordinates to the FloatBuffer        vertexBuffer.put(triangleCoords);        // set the buffer to read the first coordinate        vertexBuffer.position(0);    }}
默认情况下,OpenGL ES假定GLSurfaceView结构的中心为坐标系统的[0,0,0](X,Y,Z)。[1,1,0]就是结构的右上角,[-1,-1,0]是左下角。坐标点是安装逆时针方向绘制的。

定义一个正方形

在OpenGL中定义三角形很容易,但是正方形比较复杂,通常的做法是绘制两个三角形:


为了避免定义两组坐标,你可以使用一个绘制列表来告诉OpenGL ES的绘制顺序:
class Square {    private FloatBuffer vertexBuffer;    private ShortBuffer drawListBuffer;    // number of coordinates per 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(        // (# of coordinate 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(        // (# of coordinate values * 2 bytes per short)                drawOrder.length * 2);        dlb.order(ByteOrder.nativeOrder());        drawListBuffer = dlb.asShortBuffer();        drawListBuffer.put(drawOrder);        drawListBuffer.position(0);    }}
这个例子告诉你一些绘制复杂图像的方法,通常情况下,你使用多个三角形的集合来绘制其他图像对象。
原创粉丝点击