我想使用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
应该是什么,并且我可以显示所有矩形,所以我认为这不是其他设置的问题。
任何想法我做错了什么?
答案 0 :(得分:1)
首先,您的评论是正确的,您必须提供索引的数量而不是三角形。为了澄清术语,元素不是三角形,也不是顶点,它是索引(或索引引用的顶点)。
此外,您的绘图顺序仍然存在。你不仅需要重复F,而且还要重复D(引入4而不是仅仅是2个简并三角形),否则你会得到一个带有顶点F,D和G的三角形(你不想要它)。但另一方面,你不需要重复我(如果你没有另一行)。所以你的渲染顺序就像:
AD BE CF F
D DG EH FI
但是要弄清楚如何根据行数和列数在循环中自动调整它是你的任务。