在OpenGL ES 2.0中使用三角形条带时出现问题

时间:2011-10-31 10:38:19

标签: opengl-es

我想使用TRIANGLE_STRIP渲染全屏对齐的网格物体。它由9个顶点和8个三角形组成,应该类似于:

A----B----C
| 1 /| 3 /|
|  / |  / |
| /  | /  |
|/ 2 |/ 4 |
D----E----F
| 5 /| 7 /|
|  / |  / |
| /  | /  |
|/ 6 |/ 8 |
G----H----I

顶点A的坐标为(-1,-1,0),而顶点I的坐标为(1,1,0)。也许还可以说这包括9个顶点,分别位于3列和3行中。

我正在尝试使用TRIANGLE_STRIP模式执行此操作。

我提供给glDrawElements的索引如下:

AD BE CF F
DG EH FI I

CFF实际应该产生一个退化的三角形,以便可以跳到下一行。

我遇到的问题是计算要提供给glDrawElements的正确号码。我这样做:

glDrawElements(GL_TRIANGLE_STRIPS, number_of_elelments,
    GLES20.GL_UNSIGNED_SHORT, buffer);

首先,我应该是可见三角形的数量:

number_of_elements = 2 * (cols - 1) * (rows - 1); // 8

但它渲染了一半的矩形。

然后我想起了退化的矩形,并决定将它们包括在内:

number_of_elements = 2 * (cols - 1) * (rows - 1) + rows; // 10

它渲染了更多的矩形,但仍然不是全部。

然后我通过反复试验来猜测number_of_elements应该是什么,并且我可以显示所有矩形,所以我认为这不是其他设置的问题。

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,您的评论是正确的,您必须提供索引的数量而不是三角形。为了澄清术语,元素不是三角形,也不是顶点,它是索引(或索引引用的顶点)。

此外,您的绘图顺序仍然存在。你不仅需要重复F,而且还要重复D(引入4而不是仅仅是2个简并三角形),否则你会得到一个带有顶点F,D和G的三角形(你不想要它)。但另一方面,你不需要重复我(如果你没有另一行)。所以你的渲染顺序就像:

AD BE CF F
D DG EH FI

但是要弄清楚如何根据行数和列数在循环中自动调整它是你的任务。