Как использовать трафаретный буфер для достижения иерархического отсечения - PullRequest
2 голосов
/ 17 июня 2019

То, чего я пытаюсь достичь, показано на изображении ниже:

illustration

Допустим, у нас есть буфер трафарета в состоянии, поэтому только красныйраздел заполнен на данный момент.Какие действия мне нужно выполнить, когда я обновляю буфер трафарета с разделом, который помечен желтым, так что в конце только зеленый раздел будет конечным состоянием буфера трафарета?

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

До сих пор я безуспешно пробовал различные логические операции, включающие проверку трафарета, которые приносили больше путаницы, чем какой-либо прогресс.

Обратите внимание, что испытание ножницами не актуально для этой задачи, поскольку элементы могут иметь произвольную форму и вращение.

1 Ответ

3 голосов
/ 17 июня 2019

Если у вас иерархическая структура, то у вас есть слои. Каждый ребенок может рисовать только в той области, которая определена его родителем. Таким образом, каждый слой должен подсчитать буфер трафарета (GL_INCR) и может рисовать, только если текущее значение буфера трафарета равно «глубине» слоя:

int layer = 0;
glStencilFunc(GL_ALWAYS, 1, 0xff);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

// draw initial layer
// ...

layer ++;
glStencilFunc(GL_EQUAL, layer, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

// draw layer 1
// ...

layer ++;
glStencilFunc(GL_EQUAL, layer, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

// draw layer 2
// ...

Обратите внимание, что, как правило, буфер трафарета имеет 8 битов, это ограничивает число слоев 256.

...