我在OpenGL中渲染一个多边形,使用一个名为vertices的顶点数组和一个名为DRAW_ORDER的final索引缓冲区。我启用了背面剔除,并使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)进行绘制调用。
当我通过矩阵变换在x或y轴上反射vertices时,多边形将被剔除,因为反射颠倒了顶点的方向,因此它们不再与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);
}您可以在下图中看到椭圆(凸形)而不是星形(凹形)的解决方案是如何工作的。

发布于 2016-07-15 11:44:06
要通过索引的排列来颠倒缠绕顺序,您可以简单地颠倒索引的顺序。
因此,对于您的三角形示例,如果原始顺序为(0,1,2),则反向顺序为(2,1,0)。由于所有循环排列对于定义多边形来说都是等价的,因此其他有效的顺序将是(1,0,2)和(0,2,1)。但是使用相反的方法是最好的。
作为另一个示例,对于具有5个顶点的多边形,使用索引(3,17,6,8,11),反转为(11,8,6,17,3),当您要使用相反的缠绕顺序渲染多边形时,可以将其用作索引集。
https://stackoverflow.com/questions/38359158
复制相似问题