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