如何在x或y轴上反射顶点后恢复CCW缠绕顺序?

时间:2016-07-13 18:23:54

标签: android opengl-es vertex-array index-buffer

我在OpenGL中使用名为vertices的顶点数组和带有CCW绕组的final DRAW_ORDER索引缓冲区渲染多边形。我启用了背面剔除,并使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)进行绘制调用。

当我通过矩阵变换在x或y轴上反映vertices时,多边形会被剔除,因为反射会反转顶点的方向,因此它们不再与{{1}的CCW缠绕顺序相匹配}。

我可以通过禁用剔除来防止此问题,但出于性能考虑,我宁愿找到一种方法来通过置换来恢复DRAW_ORDER的方向。例如,如果多边形是三角形,我可以简单地在反射后交换第二个和第三个顶点以恢复CCW方向。如何将此方法扩展到具有任意数量的顶点和索引的多边形?

vertices

编辑:这是一个似乎适用于凸多边形但不是凹面的解决方案。

  //PSEUDO-CODE FOR TRIANGLE:
    final DRAW_ORDER = {0,1,2};
    vertices = { {0,0}, {1,0}, {0,1} };
    reflect(vertices);
    swap(vertices,1,2);

您可以在下图中看到解决方案如何适用于椭圆(凸起)但不是星形(凹面)。

enter image description here

1 个答案:

答案 0 :(得分:0)

要通过索引的排列来反转绕组顺序,您可以简单地颠倒索引的顺序。

因此,对于您的三角形示例,如果原始顺序为(0,1,2),则反向顺序为(2,1,0)。由于所有循环排列对于定义多边形都是等效的,因此其他有效顺序将是(1,0,2)和(0,2,1)。但使用反向就像任何东西一样好。

作为另一个例子,对于具有5个顶点的多边形,使用索引(3,17,6,8,11),反之为(11,8,6,17,3),可以用作集合当你想用相反的绕线顺序渲染多边形时,索引的数量。