如何使用OpenGL绘制更复杂的形状

移动开发 Android
在OpenGL ES视图中定义所要绘制的图形,是创建高质量图形的第一步。使用OpenGL ES绘制图形时,如果不了解怎样基于OpenGL ES定义图形对象,将会是一件棘手的事。本文将会为大家介绍以Android设备屏幕为基准的OpenGL ES坐标系统,定义图形的基本方法,图形轮廓,以及定义三角形、方形。

原文链接:http://docs.eoeandroid.com/training/graphics/opengl/shapes.html

  在OpenGL ES视图中定义所要绘制的图形,是创建高质量图形的第一步。使用OpenGL ES绘制图形时,如果不了解怎样基于OpenGL ES定义图形对象,将会是一件棘手的事。 这节课将介绍以Android设备屏幕为基准的OpenGL ES坐标系统,定义图形的基本方法,图形轮廓,以及定义三角形、方形。

定义三角形 Define a Triangle


  OpenGL ES允许可以在三维坐标上定义你要绘制的对象。所以,在绘制三角形前,你要定义好它的坐标。在OpenGL中,定义坐标最典型的方法,就是定义坐标定点的一组浮点型数据。为了提高效率,你可以把这些坐标值写进一组ByteBuffer,它将会传递给OpenGL ES图形管道进行处理。

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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定义了以下的默认坐标系统:[0,0,0] (X,Y,Z)作为GLSurfaceView图像的中点,[1,1,0]是图像的右上角顶点,[-1,-1,0]是左下角顶点。如果需要该坐标系统的图片,请移步OpenGL ES开发指南。 请注意,图形的坐标是按逆时针方向定义的,绘制的顺序是非常重要的,因为它定义图形的正面以及反面,正面可以被直接绘制,而反面你可能选择以OpenGL ES消除面方法使其不被绘制出来。想要获取更多关于面与消除的信息,请查看OpenGL ES开发指南

定义方形 Define a Square

  在OpenGL中,定义三角形是非常简单的,但你是否想要来点高难度的?比如,方形?要定义方形,有很多种方法,其中典型的方法就是把两个三角形画在一起:

图1.使用两个三角形绘制方形

  同样,你需要按照逆时针方向定义代表方形的两个三角形的坐标顶点,并把值写到ByteBuffer。为了避免每个三角形都定义坐标产生两种坐标系统,使用绘制列表告诉OpenGL ES图像管道如何绘制这些顶点,下面是该种形状绘制方法的代码:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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);
    }
    }

 

  这个例子给你展示如何使用OpenGL绘制更复杂的形状。一般来说,都是使用好几个三角形来绘制图形对象。在下节课,你将学习如何把这些图像画在屏幕上。

责任编辑:佚名 来源: eoe
相关推荐

2013-04-26 10:26:08

2017-05-02 13:38:51

CSS绘制形状

2014-04-29 14:27:59

OpenGL ES 2Android绘制纹理

2011-10-10 13:21:12

架构

2013-09-26 14:09:31

iOS开发OpenGL ES教程绘制矩形

2010-03-12 19:03:48

Python 拼写检查

2013-01-06 09:26:06

Wi-Fi网络协议

2022-06-06 10:44:10

C++语言鸿蒙

2013-06-27 09:30:48

2022-04-26 13:54:31

隐私币网络犯罪分子财务领导者

2023-11-03 08:28:19

2019-01-23 07:41:27

私有云企业虚拟化

2020-10-26 10:51:09

人工智能AI语言

2018-12-17 10:30:34

Linux命令行boxes

2015-10-13 09:24:24

Chrome开发者工具

2023-04-07 14:04:52

增强分析人工智能

2015-06-04 10:40:20

VectorDrawaAndroid

2019-08-20 11:57:47

云计算开发安全

2021-01-11 08:34:16

缓存穿透QPS

2012-04-20 13:56:16

点赞
收藏

51CTO技术栈公众号