Existem algumas opções. Como método geral, os buffers de estêncil costumam ser muito úteis onde certos desenhos precisam ser mascarados, como o contorno em que os círculos se sobrepõem no seu exemplo.
Nesse caso, acho que isso pode ser feito com a mesma facilidade, sem um buffer de estêncil. Você pode usar o buffer de profundidade para eliminar o contorno onde os círculos se sobrepõem. A idéia é que você desenhe o interior dos círculos apenas no buffer de profundidade (já que não queremos ver o interior) e desenhe o contorno. Dessa forma, a parte do contorno que se sobrepõe a outro círculo será eliminada pelo teste de profundidade.
A única ressalva é que você deve ter cuidado com os combates em profundidade. Você pode usar um pequeno deslocamento para garantir que os contornos estejam realmente atrás do interior e serem eliminados pelo teste de profundidade. Uma alternativa seria usar glPolygonOffset()
.
Digamos que você tenha dois círculos paralelos ao plano xy, com centros em (x1, y1, z) e (x2, y2, z). E você tem estas funções de desenho:
// 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);
A sequência de desenho fica assim, com delta
um pequeno deslocamento:
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);