使用GL_LINE_STRIP绘制三角形轮廓时的奇怪顺序

时间:2012-12-06 15:01:46

标签: ios opengl-es terrain

我正在使用OpenGL为iOS-Plaftorms开发一个应用程序。

目前我在绘制由多个子平面组成的平面(地形)时遇到了一个奇怪的问题,其中每个子平面由2个形成矩形的三角形组成。我通过调用glDrawElements将此地形绘制为线框,并提供参数GL_Line_Strip和预先计算的索引。问题是三角形的绘制顺序错误或者是垂直镜像。它们没有按照我指定索引的顺序绘制,这令人困惑。

这是生成顶点的简化代码:

int pos = 0;
for(NSInteger y = - gridSegmentsY / 2; y < gridSegmentsY / 2; y ++) {
    for(NSInteger x = - gridSegmentsX / 2; x < gridSegmentsX / 2; x ++) {
        vertices[pos++] = x * 5;
        vertices[pos++] = y * 5;
        vertices[pos++] = 0;
    }
}

这就是我生成索引的方法,包括退化索引(用作IBO)。

    pos = 0;
for(int y = 0; y < gridSegmentsY - 1; y ++) {
    if (y > 0) {
        // Degenerate begin: repeat first vertex
        indices[pos++] = (unsigned short)(y * gridSegmentsY);
    }
    for(int x = 0; x < gridSegmentsX; x++) {
        // One part of the strip
        indices[pos++] = (unsigned short)((y * gridSegmentsY) + x);
        indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + x);
    }
    if (y < gridSegmentsY - 2) {
        // Degenerate end: repeat last vertex
        indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + (gridSegmentsX - 1));
    }
}

所以在这部分......

        indices[pos++] = (unsigned short)((y * gridSegmentsY) + x);
        indices[pos++] = (unsigned short)(((y + 1) * gridSegmentsY) + x);

...我将indices数组中的 first 索引设置为 point 到当前(x,y),并将下一个索引设置为(x,y) +1)。我正在为当前条带中的所有x做这个,然后我正在处理退化的三角形,并为下一个条带(y + 1)重复此过程。

此方法取自http://www.learnopengles.com/android-lesson-eight-an-introduction-to-index-buffer-objects-ibos/

所以我希望得到的网格画得像:

         a----b----c
         |   /|   /|
         |  / |  / |
         | /  | /  |
         |/   |/   |
         d----e----f
         |   /|   /|
         |  / |  / |
         | /  | /  |
         |/   |/   |
         g----h----i

通过使用以下描述绘画:

glDrawElements(GL_LINE_STRIP, indexCount, GL_UNSIGNED_SHORT, 0);

...因为我希望GL_Line_Strip首先从(a-> d)绘制一条线,然后从(d-> b),然后(b,e)......等等(如指数计算)

但实际绘制的内容是:

         *----*----*
         |\   |\   |
         | \  | \  |
         |  \ |  \ |
         |   \|   \|
         *----*----*
         |\   |\   |
         | \  | \  |
         |  \ |  \ |
         |   \|   \|
         *----*----*

所以三角形以错误的顺序绘制,我需要知道为什么? )。有人知道吗?问题在于使用GL_Line_Strip还是我的代码中有错误?

我的眼睛处于(0.0f,0.0f,20.0f)并且看着(0,0,0)。网格沿x轴和&amp;绘制。 y轴从从左到右,z = 0,因此网格不应翻转或任何东西。

1 个答案:

答案 0 :(得分:1)

您是否还记得浅谈opengl的0,0是左下角而不是左上角(如Core Graphics)的事实?协调系统原点和惯用手是很重要的 - 并且可以导致完全您正在看到的镜像。

相关问题