OpenGL отсечение - PullRequest
       32

OpenGL отсечение

5 голосов
/ 24 сентября 2011

Я уже несколько часов читаю статьи о стрижке, но, похоже, не могу найти решение своей проблемы.

Это мой сценарий:

В среде OpenGL ES (IOS, Android) У меня есть двухмерный граф сцены, состоящий из прорисовываемых объектов, образующих дерево.

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

Эта установка прекрасно работает для рендеринга 2D-графа сцены, итерации по дереву, рендеринга каждого объекта, а затем его дочерних элементов.

Теперь возникает моя проблема: я ищу способ включить отсечение на узле.С включенным отсечением дочерние элементы узла должны обрезаться при выходе из области ограничивающего прямоугольника родителя.

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

Поскольку ограничивающие рамки не выровнены по оси, я не могу использовать glScissor, что было бы самым простым способом.

Я думал об использовании буфера трафарета и рисовал в нем заполненный ограничивающий прямоугольник, когдаотсечение включено, а затем включите буфер трафарета.Это может сработать, но приводит к другой проблеме: что произойдет, если у дочернего элемента в отсеченном узле снова будет отсечение?- Маска трафарета должна быть настроена для ребенка, стирая маску трафарета родителей.

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

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

1 Ответ

5 голосов
/ 24 сентября 2011

Ножничный ящик - простой инструмент для простых нужд.Если у вас есть менее простые потребности, вам придется использовать менее простой механизм OpenGL для отсечения: буфер трафарета.

Предполагая, что в настоящее время вы не используете буфер трафарета для чего-либо еще,у вас есть доступ к 8 битам трафарета.Задавая каждому уровню в графе сцены большее число, чем предыдущему, вы можете назначить каждому уровню собственную маску трафарета.Конечно, если два брата на одном и том же уровне глубины перекрываются или просто находятся слишком близко, у вас есть проблема.

Другая альтернатива - назначить каждому узлу число от 1255. Используя трафаретный тест GL_EQUAL, вы сможете предотвратить проблему перекрытия, описанную выше.Однако это означает, что вы можете иметь не более 255 узлов во всем графе сцены.В зависимости от ваших конкретных потребностей, это может быть слишком большим ограничением.

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

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

...