Android—OpenGL ES之形狀定義

來源:互聯網
上載者:User

本文譯自: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繪製比較複雜的圖形所需要做的事情。通常,你要使用三角形的集合來繪製對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.