我在 OpenGL 中渲染一个多边形,其中一个顶点数组被调用vertices
,一个final
索引缓冲区被称为DRAW_ORDER
CCW 绕组。我启用了背面剔除,并使用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);
}
您可以在下图中看到该解决方案如何适用于椭圆(凸形)而不是星形(凹形)。