В связи с проблемой, обсуждаемой в статье Обрезка OpenGL , возникает новый вопрос.
Я реализую отсечение для двухмерного графа сцены на основе узла. Всякий раз, когда блоки отсечения выровнены по оси, я использую glScissor, как предложено в Отсечение OpenGL . Я успешно реализовал отсечение узлов из блоков, которые выровнены по оси.
Оказывается, что каждый узел должен пересекать свой прямоугольник отсечения с теми из его предков, которые используют отсечение. (Это необходимо в том случае, если братья и сестры перекрываются с обтравочной рамкой предка).
Механизм пересечения неосевых прямоугольников должен быть реализован с использованием буфера трафарета. Я начал реализовывать предложенное решение в OpenGL clipping , но у меня проблемы с детьми, у которых обрезки клипов пересекаются с их предшественниками.
В настоящее время трафаретная обрезка прекрасно работает только с одним отсечением.
Но в случае дочернего элемента или внука, который пересекается с предком, алгоритм терпит неудачу, потому что пересечение 2 вовлеченных прямоугольников здесь необходимо (как в версии с выравниванием по оси) как маска, а не полный прямоугольник дочернего элемента.
Я придумал следующий алгоритм:
Самая верхняя запись узла начинается со значения счетчика 1 и рисует свой прямоугольник отсечения, заполненный 1, в буфере трафарета и отрисовывает его дочернее тестирование трафарета против 1. Каждый брат, у которого также включено отсечение, рисует свой ограничивающий прямоугольник добавление 1 в буфер трафарета, затем проверка на 2 и так далее. Теперь, когда прямоугольник отсечения братьев и сестер перекрывается с родительским, область, в которой они перекрываются, будет заполнена двумя секундами, что дает идеальное отсечение при тестировании против 2. Этот алгоритм может быть расширен до максимум 255 вложенных узлов отсечения.
А вот и мои вопросы:
Как выполнить рендеринг в буфер трафарета таким образом, чтобы вместо записи 1, 1 добавлялись к текущему значению буфера трафарета при каждом выполнении рендеринга.
Это мой код, который я использую для подготовки к визуализации в буфер трафарета:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, ref, mask);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
Я ищу установку, которая увеличит текущее значение буфера трафарета на значение ref вместо записи ref в буфер.
Может кто-нибудь мне помочь?