【发布时间】:2016-07-13 18:23:54
【问题描述】:
我在 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);
}
您可以在下图中看到该解决方案如何适用于椭圆(凸形)而不是星形(凹形)。
【问题讨论】:
-
没有直接回答您的问题,但您是否考虑使用
glFrontFace(GL_CW)指定您的正面具有CW 绕组顺序? -
是的,但是我必须跟踪每个多边形的缠绕顺序,并在每次缠绕顺序发生变化时进行 gl 调用。到我这样做的时候,我想我还不如完全禁用剔除。
-
这与您问题中的问题描述不符。在问题中,您说缠绕顺序发生了变化,因为您在转换中应用了反射。现在你是说每个多边形可以有不同的缠绕顺序?
-
我所有的多边形都以逆时针缠绕顺序开始,但如果我反映其中任何一个,它们的缠绕顺序就会改变。例如,如果我有多边形 p1,..,p10 和反射 p10,那么 p1,...,p9 将具有 CCW 绕组顺序,而 p10 将具有 CW 绕组顺序。我想知道如何通过置换顶点来将 p10 的缠绕顺序恢复为 CCW。
标签: android opengl-es vertex-array index-buffer