В настоящее время я не знаю, возможно ли сконфигурировать буфер трафарета для выполнения всех вышеуказанных 5 шагов без внесения каких-либо изменений в буфер трафарета между ними. Было бы легко, если glStencilOp
предоставил побитовое ИЛИ, но это не так, и с использованием только инкремента или декремента вам придется рисовать прямоугольники несколько раз.
Но если регионы всегда прямоугольники, почему бы просто не использовать ножничный тест? Таким образом, первые 3 шага (или фактически 2 и 3) можно сделать, просто установив область прямоугольника с помощью glScissor
и включив тест ножниц (glEnable(GL_SCISSOR_TEST)
).
Для среднего (один шаг 4) вы либо вычислить фиолетовый прямоугольник пересечения себя и снова использовать тест ножницеобразный, или вы используете тест трафарета:
glEnable(GL_STENCIL_TEST);
glStencilFunc(/*whatever*/);
glStencilOp(GL_INCR, GL_INCR, GL_INCR); //increase the stencil value
//draw both rectangles
glStencilFunc(GL_EQUAL, 2, 0xFFFFFFFF); //only draw where both rectangles are
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //don't change the stencil buffer
//draw things
Таким образом, мы первые рисовать оба прямоугольника и увеличить значение трафарета везде, где они нарисованы. Затем мы рисуем наши вещи везде, где значение трафарета равно 2, что означает, что оба прямоугольника были нарисованы.
Для 5-го шага Вы используете один и тот же буфер трафарета, но с
glStencilFunc(GL_LEQUAL, 1, 0xFFFFFFFF);
для второго прохода. Таким образом, вы рисуете что-то везде, где буфер трафарета составляет не менее 1, что означает, что рисовался по крайней мере один прямоугольник.
Для более чем двух прямоугольников это может усложниться, и вам нужно немного поиграть, чтобы найти оптимальный способ.
Если они всегда прямоугольники, 'glScissor' - хорошая идея, но это, безусловно, не будет работать на 5. –