Ci sono alcune opzioni Come metodo generale, i buffer di stencil sono spesso molto utili quando è necessario mascherare determinati disegni, come il contorno in cui i cerchi si sovrappongono nell'esempio.
In questo caso, penso che ciò possa essere fatto altrettanto facilmente senza un buffer di stencil. È possibile utilizzare il buffer di profondità per eliminare il contorno in cui i cerchi si sovrappongono. L'idea è di disegnare l'interno dei cerchi solo nel buffer di profondità (poiché non vogliamo vedere l'interno), quindi disegnare il contorno. In questo modo, la parte del contorno che si sovrappone a un altro cerchio verrà eliminata dal test di profondità.
L'unica avvertenza è che devi stare attento ai combattimenti in profondità. È possibile utilizzare un piccolo offset per assicurarsi che i contorni siano effettivamente dietro l'interno e vengano eliminati dal test di profondità. Un'alternativa sarebbe usare glPolygonOffset()
.
Supponiamo che tu abbia due cerchi paralleli al piano xy, con centri in (x1, y1, z) e (x2, y2, z). E hai queste funzioni di disegno:
// 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);
La sequenza di disegni si presenta così, con delta
un piccolo offset:
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);