Opengl es 在OpenGL ES 2.0中使用三角形条时遇到的问题

Opengl es 在OpenGL ES 2.0中使用三角形条时遇到的问题,opengl-es,Opengl Es,我想使用TRIANGLE\u STRIPs渲染全屏对齐的网格。它由9个顶点和8个三角形组成,看起来应该类似于: A----B----C | 1 /| 3 /| | / | / | | / | / | |/ 2 |/ 4 | D----E----F | 5 /| 7 /| | / | / | | / | / | |/ 6 |/ 8 | G----H----I AD BE CF F D DG EH FI 顶点A具有坐标(-1,-1,0),而顶点I位于(1,1,0)。也可以说,这包

我想使用
TRIANGLE\u STRIP
s渲染全屏对齐的网格。它由9个顶点和8个三角形组成,看起来应该类似于:

A----B----C
| 1 /| 3 /|
|  / |  / |
| /  | /  |
|/ 2 |/ 4 |
D----E----F
| 5 /| 7 /|
|  / |  / |
| /  | /  |
|/ 6 |/ 8 |
G----H----I
AD BE CF F
D DG EH FI
顶点
A
具有坐标(-1,-1,0),而顶点
I
位于(1,1,0)。也可以说,这包括位于3列3行中的9个顶点

我正试图使用
三角带
模式来实现这一点

我提供给
glpaurements
的索引如下:

AD BE CF F
DG EH FI I
实际上,
CFF
应该生成一个退化的三角形,这样就可以跳到下一行

我遇到的问题是计算要提供给
glpaurements
的正确数字。我是这样做的:

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
它渲染了更多的矩形,但仍然不是全部

然后我反复尝试,猜测元素的数量应该是多少,我可以显示所有的矩形,所以我认为剩下的设置没有问题


你知道我做错了什么吗?

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

此外,无论如何,您的绘图顺序已被破坏。你不仅要重复F,还要重复D(引入4而不是2个退化三角形),否则你会得到一个顶点为F、D和G的三角形(你不想要)。但另一方面,你不需要重复I(如果你没有其他行)。因此,渲染顺序如下所示:

A----B----C
| 1 /| 3 /|
|  / |  / |
| /  | /  |
|/ 2 |/ 4 |
D----E----F
| 5 /| 7 /|
|  / |  / |
| /  | /  |
|/ 6 |/ 8 |
G----H----I
AD BE CF F
D DG EH FI

但是,现在您的任务是找出如何根据行和列的数量在循环中自动实现这一点。

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

此外,无论如何,您的绘图顺序已被破坏。你不仅要重复F,还要重复D(引入4而不是2个退化三角形),否则你会得到一个顶点为F、D和G的三角形(你不想要)。但另一方面,你不需要重复I(如果你没有其他行)。因此,渲染顺序如下所示:

A----B----C
| 1 /| 3 /|
|  / |  / |
| /  | /  |
|/ 2 |/ 4 |
D----E----F
| 5 /| 7 /|
|  / |  / |
| /  | /  |
|/ 6 |/ 8 |
G----H----I
AD BE CF F
D DG EH FI

但是,现在您的任务是找出如何根据行和列的数量在循环中自动实现这一点。

似乎我应该提供顶点的数量,而不是三角形的数量。有人确认吗?在OpenGL规范中,他们提到了元素的数量,由于元素是三角形,我认为是三角形,但我似乎弄错了。我似乎应该提供顶点的数量,而不是三角形。有人确认吗?在OpenGL规范中,他们提到了元素的计数,由于元素是三角形,我以为是三角形,但我似乎错了。你确定我需要重复D吗?因为我似乎没有在输出中看到任何错误…@Albus当您不绘制纹理或任何照明,而只绘制平面颜色的面时,可能是错误的FDG(或DFG,不知道)三角形只是在正确的三角形上渲染。但这是错误的,至少当你启用纹理、照明或任何比单一平面颜色更具结构的东西时是这样。我会进一步调查的。三角带对我来说是一个新的主题,如果听起来很无知,我很抱歉。@Albus Dumbledore也可能是这个不正确的三角形被背面剔除了,或者被正确的三角形覆盖了(当深度函数为
GL\u LEQUAL
),但是相信我,它是存在的。三角形条为第二个顶点之后的每个顶点渲染一个新三角形。@Albus Dumbledore也可能是单独的纹理(没有任何照明或不均匀的颜色)不会产生伪影,因为错误的三角形使用与正确三角形相同的纹理坐标。但在这种情况下,你不需要一个复杂的三角形条带,一个简单的四顶点四边形条带就可以了。你确定我需要重复D吗?因为我似乎没有在输出中看到任何错误…@Albus当您不绘制纹理或任何照明,而只绘制平面颜色的面时,可能是错误的FDG(或DFG,不知道)三角形只是在正确的三角形上渲染。但这是错误的,至少当你启用纹理、照明或任何比单一平面颜色更具结构的东西时是这样。我会进一步调查的。三角带对我来说是一个新的主题,如果听起来很无知,我很抱歉。@Albus Dumbledore也可能是这个不正确的三角形被背面剔除了,或者被正确的三角形覆盖了(当深度函数为
GL\u LEQUAL
),但是相信我,它是存在的。三角形条为第二个顶点之后的每个顶点渲染一个新三角形。@Albus Dumbledore也可能是单独的纹理(没有任何照明或不均匀的颜色)不会产生伪影,因为错误的三角形使用与正确三角形相同的纹理坐标。但在这种情况下,你不需要一个复杂的三角形条带和一个简单的四顶点四边形三条带就可以了。