1

我在 OpenGL 中渲染一个多边形,其中一个顶点数组被调用vertices,一个final索引缓冲区被称为DRAW_ORDERCCW 绕组。我启用了背面剔除,并使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER).

当我vertices通过矩阵变换在 x 或 y 轴上反射时,多边形被剔除,因为反射反转了顶点的方向,因此它们不再匹配DRAW_ORDER.

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

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

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

    //Reverse the order of the vertices so, for example, 
    //vertices {v1,v2,v3,v4,v5} become {v5,v4,v3,v2,v1}
    for(int start = 0, end = vertices.length-1; start<end; start++, end--){
        swap(vertices,start,end);
    }

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

在此处输入图像描述

4

1 回答 1

1

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

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

再举一个例子,对于一个有 5 个顶点的多边形,使用索引 (3, 17, 6, 8, 11),反过来就是 (11, 8, 6, 17, 3),当您想以相反的缠绕顺序渲染多边形。

于 2016-07-15T03:44:05.927 回答