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

标签 ios opengl-es terrain

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

目前,我在绘制由多个子平面组成的平面(地形)时遇到了一个奇怪的问题,其中每个子平面由 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);

...我将索引数组中的第一个索引设置为指向当前 (x,y) 和下一个索引 (x,y +1)。我对当前 strip 中的所有 x 执行此操作,然后处理退化三角形并对下一个 strip (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 轴和 y 轴从左到右绘制的,z = 0,因此网格不应翻转或发生任何变化。

最佳答案

您是否记得考虑过 opengl 的 0,0 位于左下角而不是左上角(如 Core Graphics)?坐标系原点和惯用手很重要 - 并且可以导致完全您所看到的镜像。

关于ios - 使用 GL_LINE_STRIP 绘制三角形轮廓时的奇怪顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746373/

相关文章:

ios - 独立渲染到多采样缓冲区和解析帧缓冲区

javascript - 如何让相机跟随本示例中的地形高度 : http://threejs. org/examples/#webgl_terrain_dynamic

opengl - GLSL - 计算片段的法线

ios - CAKeyFrameAnimation表现层似乎没有改变

ios - 将 unwind segue 与 UISearchController 一起使用时出错

objective-c - GLKit 多边形半透明

opengl - OpenGL/OpenGLES 中的帧缓冲区纹理行为

ios - openGL ES 2.0 中 3D Sprite 的混合函数

ios - 使用 Firebase 存储下载检测网络中断

c# - 3D 地形生成器中大量 block 的程序生成结构