我在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);
您可以在下图中看到解决方案如何适用于椭圆(凸起)但不是星形(凹面)。
答案 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),可以用作集合当你想用相反的绕线顺序渲染多边形时,索引的数量。