Es gibt einige Möglichkeiten. Als allgemeine Methode bieten sich Schablonenpuffer oft an, wenn bestimmte Zeichnungen ausgeblendet werden müssen, z. B. der Umriss, in dem sich die Kreise in Ihrem Beispiel überlappen.
In diesem Fall denke ich, kann dies genauso einfach ohne einen Schablonenpuffer durchgeführt werden. Sie können den Tiefenpuffer verwenden, um den Umriss zu entfernen, an dem sich die Kreise überlappen. Die Idee ist, dass Sie das Innere der Kreise nur in den Tiefenpuffer zeichnen (da wir das Innere nicht sehen wollen) und dann den Umriss zeichnen. Auf diese Weise wird der Teil der Kontur, der sich mit einem anderen Kreis überlappt, durch den Tiefentest entfernt.
Die einzige Einschränkung ist, dass Sie vorsichtig mit Tiefenkämpfen umgehen müssen. Sie können einen kleinen Versatz verwenden, um sicherzustellen, dass sich die Konturen tatsächlich hinter dem Innenraum befinden, und durch den Tiefentest eliminiert werden. Eine Alternative wäre zu verwenden glPolygonOffset()
.
Angenommen, Sie haben zwei Kreise, die parallel zur xy-Ebene verlaufen, mit Mittelpunkten bei (x1, y1, z) und (x2, y2, z). Und Sie haben diese Zeichenfunktionen:
// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);
// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);
Die Zeichenfolge sieht dann so aus, mit delta
einem kleinen Versatz:
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);