我正在使用 OpenGL 为 iOS 平台开发一个应用程序。
目前,在绘制由多个子平面组成的平面(地形)时,我遇到了一个奇怪的问题,其中每个子平面由 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)。我正在为当前条带中的所有 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 轴和 y 轴绘制,z = 0,因此不应翻转网格或任何东西。