【问题标题】:How to create mesh/plane with desired number of width and length segments?如何创建具有所需数量的宽度和长度段的网格/平面?
【发布时间】:2014-09-11 12:44:11
【问题描述】:

我有一个包含 40000 个浮点数的数组,用于在地图上指定高度级别。我想在 OpenGL ES 2.0 中创建一个网格/平面,为这个网格中的每个顶点分配一个来自这个数组的高度值,以便它们创建一个地形图。

当我需要找出索引时出现问题 - 哪个顶点连接到哪个顶点以创建三角形网格。

由于我不知道如何分配这些索引,我该怎么做?

到目前为止,我的数据看起来像这样,其中每一行代表

vertices[i*3] + ", " + vertices[i*3+1] + ", " + vertices[i*3+2]

0.0, 0.6091919, 0.0 
1.0, 0.60876465, 0.0 
2.0, 0.6079712, 0.0 
3.0, 0.60684204, 0.0 
4.0, 0.60546875, 0.0 
5.0, 0.60391235, 0.0 
6.0, 0.6022949, 0.0 
7.0, 0.600708, 0.0 
8.0, 0.5991516, 0.0 
9.0, 0.59765625, 0.0 
....
0.0, 0.5961914, 1.0
1.0, 0.5947571, 1.0
2.0, 0.5933533, 1.0
3.0, 0.59191895, 1.0
4.0, 0.5904541, 1.0

好的,我已经设法将它加载到FloatBuffer,就像

FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(vertices.length * BYTESPERFLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertices).position(0);

但是我该如何继续(如果到目前为止我这样做的方式是正确的)?

【问题讨论】:

    标签: android 3d opengl-es-2.0 mesh plane


    【解决方案1】:

    一种简单的推导方法是绘制一个顶点网格,在其上放置一些索引,然后找出使用 OpenGL 基元绘制网格所需的索引序列。

    假设我们有一个 n x n 顶点网格,它描述了一个 (n - 1) x (n - 1) 个正方形的网格。对于 n = 4 的快速草图,并为每个顶点分配索引:

    12--13---14---15
    |    |    |    |
    |    |    |    |
    8----9---10---11
    |    |    |    |
    |    |    |    |
    4----5----6----7
    |    |    |    |
    |    |    |    |
    0----1----2----3
    

    这 9 个正方形可以用 3 个三角形条来绘制,每行一个条。 3条的索引顺序为:

    4, 0, 5, 1, 6, 2, 7, 3
    8, 4, 9, 5, 10, 6, 11, 7
    12, 8, 13, 9, 14, 10, 15, 11
    

    将其推广到 n 的一般值,这将导致 n - 1 个条带,每个条带具有 2 * n 个索引。这些索引可以通过几个嵌套循环按顺序生成:

    GLushort* idxA = new GLushort[(n - 1) * n * 2];
    int i = 0;
    for (int j = 0; j < n - 1; ++j) {
        for (k = 0; j < n; ++j) {
            idxA[i++] = (j + 1) * n + k;
            idxA[i++] = j * n + k;
        }
    }
    

    然后绘制,在所有的缓冲区都被填满,并且所有的顶点状态都设置好之后:

    for (int j = 0; j < n - 1; ++j) {
        glDrawElements(GL_TRIANGLE_STRIP, 2 * n, GL_UNSIGNED_SHORT, (char*)0 + j * n * 2);
    }
    

    这可以在使用图元重启时通过单个绘制调用来完成,但此功能在 ES 2.0 中不可用。如果只有一个绘图调用很关键,也可以通过重复顶点来做类似的事情。

    【讨论】:

    • 我不能填充顶点缓冲区然后调用glDrawArray吗?
    • 不是没有重复的顶点。如果您查看草图和相应的索引序列,除了第一行和最后一行顶点之外的所有顶点都用于两个条带。使用索引允许您多次使用相同的顶点,而无需在顶点缓冲区中重复顶点属性。对于大型网格,您可以通过这种方式节省近 50% 的内存(和相应的带宽)。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2013-09-20
    • 2018-10-22
    相关资源
    最近更新 更多