Є кілька варіантів. Як загальний метод, буфери трафаретів часто бувають дуже зручними, коли певний малюнок потрібно замаскувати, як контур, де кола перекриваються у вашому прикладі.
У цьому випадку я думаю, що це можна зробити так само легко без буфера трафарету. Ви можете використовувати буфер глибини, щоб усунути контур, де кола перетинаються. Ідея полягає в тому, щоб ви намалювали інтер'єр кіл лише в буфер глибини (оскільки ми не хочемо бачити інтер'єр), а потім намалюєте контур. Таким чином, частина контуру, яка перекривається іншим колом, буде усунена тестом на глибину.
Єдине застереження полягає в тому, що вам потрібно бути обережними щодо боротьби з глибиною. Ви можете скористатися невеликим зміщенням, щоб переконатися, що обриси насправді позаду інтер’єру, і усунути їх глибинним випробуванням. Альтернативою було б використання 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);