Ich rendere ein Polygon in OpenGL mit einem Vertex-Array namens vertices
und einem final
Indexpuffer namens DRAW_ORDER
mit CCW Wicklung. Ich habe das Rückseiten-Ausblenden aktiviert, und ich mache Zeichenaufrufe unter Verwendung von glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)
. Wenn ich vertices
in der x- oder y-Achse durch Matrixtransformation widerspiegele, wird das Polygon gekeult, weil die Reflexion die Ausrichtung der Scheitelpunkte umkehrt, so dass sie nicht mehr mit der CCW-Wicklungsreihenfolge von DRAW_ORDER
übereinstimmen.Wie wird die CCW-Wicklungsreihenfolge nach dem Reflektieren von Scheitelpunkten in der x- oder y-Achse wiederhergestellt?
Ich kann das Problem durch Deaktivierung Culling verhindern, aber aus Gründen der Leistung würde ich lieber einen Weg finden, um die Ausrichtung von vertices
per Permutation wiederherzustellen. Wenn das Polygon beispielsweise ein Dreieck wäre, könnte ich nach einer Spiegelung einfach den zweiten und dritten Scheitelpunkt austauschen, um die CCW-Ausrichtung wiederherzustellen. Wie kann ich diesen Ansatz auf ein Polygon mit einer beliebigen Anzahl von Scheitelpunkten und Indizes erweitern?
//PSEUDO-CODE FOR TRIANGLE:
final DRAW_ORDER = {0,1,2};
vertices = { {0,0}, {1,0}, {0,1} };
reflect(vertices);
swap(vertices,1,2);
EDIT: Hier ist eine Lösung, die für konvexe Polygone zu funktionieren scheint, aber nicht konkav.
//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);
}
Sie können im Bild unten sehen, wie die Lösung funktioniert für eine Ellipse (die konvex ist), aber nicht ein Stern (die konkav ist).
Sie haben Ihre Frage nicht direkt beantwortet, aber haben Sie erwogen, 'glFrontFace (GL_CW)' zu verwenden, um anzugeben, dass Ihre Vorderseiten eine CW-Wicklungsreihenfolge haben? –
Ja, aber dann müsste ich die Wicklungsreihenfolge jedes Polygons verfolgen und jedes Mal, wenn sich die Wicklungsreihenfolge ändert, den gl Aufruf machen. Wenn ich das tue, denke ich, dass ich die Keulung ganz einfach außer Kraft setzen könnte. – William
Das stimmt nicht mit der Problembeschreibung in Ihrer Frage überein. In der Frage sagen Sie, dass sich die Wicklungsreihenfolge ändert, weil Sie eine Reflexion in der Transformation anwenden. Jetzt sagst du, dass jedes Polygon eine andere Wicklungsreihenfolge haben kann? –