一步一步学android OpenGL ES2.0编程(2)
(欢迎大家加入android技术交流QQ群:209796692)
OpenGLEs允许你使用坐本在三个维度上定义绘制对象。所以,在你可以绘制一个三角形之前,你必须定义它的坐标。在OpenGL中,典型的方式是为坐标定义一个浮点类型的顶点数组。为了最高效,你应把这些坐标都写进一个 缺省情况下,OpenGLES 假定[0,0,0](X,Y,Z) 是 在OpenGL中定义正方形是十分容易的,有很多方法能做的,但是典型的做法是使用两个三角形: 图1.使用两个三角形画一个正方形 你要为两个三角形都按逆时针方向定义顶点们,并且将这些坐标值们放入一个 本例让你见识了用OpenGL如何创建更复杂的形状。通常,你都是使用一群小三(三角形)来绘制对象。下一章,你将学会如何将这些形状画到屏幕上。 上一讲class Triangle { private FloatBuffer vertexBuffer; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 3; static float triangleCoords[] = { // 按逆时针方向顺序: 0.0f, 0.622008459f, 0.0f, // top -0.5f, -0.311004243f, 0.0f, // bottom left 0.5f, -0.311004243f, 0.0f // bottom right }; // 设置颜色,分别为red, green, blue 和alpha (opacity) float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f }; public Triangle() { // 为存放形状的坐标,初始化顶点字节缓冲 ByteBuffer bb = ByteBuffer.allocateDirect( // (坐标数 * 4)float占四字节 triangleCoords.length * 4); // 设用设备的本点字节序 bb.order(ByteOrder.nativeOrder()); // 从ByteBuffer创建一个浮点缓冲 vertexBuffer = bb.asFloatBuffer(); // 把坐标们加入FloatBuffer中 vertexBuffer.put(triangleCoords); // 设置buffer,从第一个坐标开始读 vertexBuffer.position(0); }}定义一个正方形
class Square { private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; // 每个顶点的坐标数 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 }; // 顶点的绘制顺序 public Square() { // initialize vertex byte buffer for shape coordinates ByteBuffer bb = ByteBuffer.allocateDirect( // (坐标数 * 4) squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0); // 为绘制列表初始化字节缓冲 ByteBuffer dlb = ByteBuffer.allocateDirect( // (对应顺序的坐标数 * 2)short是2字节 drawOrder.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(drawOrder); drawListBuffer.position(0); }}