У меня были проблемы с поиском информации о наклейках, поэтому, возможно, этот вопрос поможет другим. Реализация для прямого рендера.
Может ли кто-нибудь подтвердить, правильно ли я реализовал наклейку?
- Вы определяете куб любого измерения, который будет определять объем проекции в общем пространстве. Вы проверяете пересечение треугольника с определенным кубом, чтобы получить треугольники, на которые влияет проекция.
- Вы обрезаете эти треугольники и сохраняете их.
- Затем вы используете хитрости матрицы для вычисления UV-координат для сохраненных треугольников, которые будут ссылаться на текстуру, которую вы проецируете.
- Для этого вы берете векторы, представляющие высоту, ширину и глубину куба в общем пространстве, так что нижний левый угол является источником.
- Вы помещаете это в матрицу как векторы единиц i, j, k, устанавливаете перевод для куба, а затем инвертируете эту матрицу.
- Вы умножаете вершины сохраненных треугольников на эту матрицу, таким образом, вы получаете их координаты внутри куба размером от 0 до 1, который вы используете в качестве UV-координат.
- Таким образом, у вас есть исходные треугольники, на которые вы проецируете, и у вас есть UV-координаты для них (UV-координаты ссылаются на текстуру, которую вы проецируете).
- Затем вы визуализируете сохраненные треугольники на сцену, и они перезаписывают область проекции проецируемым изображением.
Теперь вопросы, на которые я не смог найти ответы. Последний пункт прав? Я никогда не занимался программным отсечением, но кажется достаточно подверженным ошибкам из-за ограниченной точности, что произойдет некоторая битва за проецируемую текстуру. Также правильный способ получения УФ-координат?
Ответы:
Взгляните на эту статью:
http://blog.wolfire.com/2009/06/how-to-project-decals/
Кажется, он использует тот же подход, что и вы. Он не говорит о z-боевых действиях, но это может определенно стать проблемой на больших расстояниях.
Мое предложение было бы отключить наклейки после определенного расстояния, если z-бой становится очень заметным.
источник
Что я сделал, чтобы решить борьбу с Z, так это немного увеличить значение Z вершины в моем декальном шейдере, после того, как оно появилось в экранных координатах.
ОК ..... Я использую встроенные сетчатые наклейки. Я создаю сетку nxn, где Y сидит на местности. Я использую код, чтобы найти Y на сетке полигона terrains. После всех трансформаций я рисую поверх существующей геометрии в экранных координатах. Буфер глубины находится в экранных координатах, поэтому, слегка перемещая Z полигонов по направлению к экрану, он останавливает борьбу Z. Делая это, я уменьшил количество полигонов, составляющих мои подогнанные сетки, наполовину. Это старый код 120
Надеюсь, это объясняет это лучше .. (по запросу)
источник