Есть несколько вариантов. Как правило, трафаретные буферы часто очень удобны, когда необходимо замаскировать определенный рисунок, например, контур, где круги перекрываются в вашем примере.
В этом случае, я думаю, это можно сделать так же легко без буфера трафарета. Вы можете использовать буфер глубины, чтобы устранить контур, где круги перекрываются. Идея состоит в том, что вы рисуете внутреннюю часть кругов только в буфере глубины (поскольку мы не хотим видеть внутреннюю часть), а затем рисуете контур. Таким образом, часть контура, которая перекрывается с другим кругом, будет удалена тестом глубины.
Единственное предостережение в том, что вы должны быть осторожны с глубокой борьбой. Вы можете использовать небольшое смещение, чтобы удостовериться, что контуры на самом деле находятся за внутренней частью, и будут устранены с помощью теста глубины. Альтернативой было бы использоватьglPolygonOffset()
.
Допустим, у вас есть две окружности, параллельные плоскости xy, с центрами в точках (x1, y1, z) и (x2, y2, z). И у вас есть эти функции рисования:
// 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);
Последовательность рисования выглядит следующим образом с delta
небольшим смещением:
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);