2012-03-12 5 views
4

Я хочу настроить несколько трафаретов в OpenGL, а затем нарисовать их несколькими комбинациями.Объединение нескольких трафаретов в GL

Например: У меня есть два прямоугольных трафареты, как это:

multiple regions

Тогда я хочу обратить на:

  1. везде
  2. левого прямоугольника (синий + фиолетовый)
  3. правый прямоугольник (фиолетовый + красный)
  4. средний прямоугольник (фиолетовый)
  5. вся цветная область (синий + фиолетовый + красный)

Я обнаружил, что можно объявить несколько трафаретов в различных битов буфера трафарета, но я не знаю, как. Как настроить glStencilOp и glStencilFunc для этого?

Или я могу (должен ли я) использовать glScissor для этого?

+1

Если они всегда прямоугольники, 'glScissor' - хорошая идея, но это, безусловно, не будет работать на 5. –

ответ

2

В настоящее время я не знаю, возможно ли сконфигурировать буфер трафарета для выполнения всех вышеуказанных 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, что означает, что рисовался по крайней мере один прямоугольник.

Для более чем двух прямоугольников это может усложниться, и вам нужно немного поиграть, чтобы найти оптимальный способ.