Istnieje kilka opcji. Jako ogólna metoda, bufory szablonów często przydają się w miejscach, w których konieczne jest maskowanie niektórych rysunków, takich jak kontur, w którym koła pokrywają się w twoim przykładzie.
W tym przypadku myślę, że można to zrobić równie łatwo bez bufora szablonów. Możesz użyć bufora głębokości, aby wyeliminować kontur, w którym koła się nakładają. Chodzi o to, że narysujesz wnętrze kręgów tylko w buforze głębokości (ponieważ nie chcemy widzieć wnętrza), a następnie narysujesz kontur. W ten sposób część konturu pokrywająca się z innym okręgiem zostanie wyeliminowana przez test głębokości.
Jedynym zastrzeżeniem jest to, że musisz uważać na głębokość walki. Możesz użyć małego przesunięcia, aby upewnić się, że kontury faktycznie znajdują się za wnętrzem i zostać wyeliminowanym przez test głębokości. Alternatywą byłoby użycie glPolygonOffset()
.
Powiedzmy, że masz dwa okręgi, które są równoległe do płaszczyzny xy, ze środkami w (x1, y1, z) i (x2, y2, z). I masz te funkcje rysowania:
// 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);
Sekwencja rysowania wygląda wtedy tak, z delta
niewielkim przesunięciem:
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);