Выполнение декаля

11

У меня были проблемы с поиском информации о наклейках, поэтому, возможно, этот вопрос поможет другим. Реализация для прямого рендера.

Может ли кто-нибудь подтвердить, правильно ли я реализовал наклейку?

  • Вы определяете куб любого измерения, который будет определять объем проекции в общем пространстве. Вы проверяете пересечение треугольника с определенным кубом, чтобы получить треугольники, на которые влияет проекция.
  • Вы обрезаете эти треугольники и сохраняете их.
  • Затем вы используете хитрости матрицы для вычисления UV-координат для сохраненных треугольников, которые будут ссылаться на текстуру, которую вы проецируете.
  • Для этого вы берете векторы, представляющие высоту, ширину и глубину куба в общем пространстве, так что нижний левый угол является источником.
  • Вы помещаете это в матрицу как векторы единиц i, j, k, устанавливаете перевод для куба, а затем инвертируете эту матрицу.
  • Вы умножаете вершины сохраненных треугольников на эту матрицу, таким образом, вы получаете их координаты внутри куба размером от 0 до 1, который вы используете в качестве UV-координат.
  • Таким образом, у вас есть исходные треугольники, на которые вы проецируете, и у вас есть UV-координаты для них (UV-координаты ссылаются на текстуру, которую вы проецируете).
  • Затем вы визуализируете сохраненные треугольники на сцену, и они перезаписывают область проекции проецируемым изображением.

Теперь вопросы, на которые я не смог найти ответы. Последний пункт прав? Я никогда не занимался программным отсечением, но кажется достаточно подверженным ошибкам из-за ограниченной точности, что произойдет некоторая битва за проецируемую текстуру. Также правильный способ получения УФ-координат?

Dreta
источник
Вот ссылка со ссылками: gamedev.stackexchange.com/questions/24653/…
Луис Эстрада

Ответы:

5

Взгляните на эту статью:

http://blog.wolfire.com/2009/06/how-to-project-decals/

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

Мое предложение было бы отключить наклейки после определенного расстояния, если z-бой становится очень заметным.

knight666
источник
я видел эту статью несколько раз, дело в том, что она вообще не говорит о том, о чем я спрашиваю, как вы уже упоминали, борьба с z на самом деле не проблема расстояния, это просто то, что вы Вы пытаетесь визуализировать прямо поверх существующей геометрии и из-за ограниченной точности, можете ли вы / не можете быть уверены, что она будет сверху или точно в том же месте
dreta
1
При рисовании надписей вы всегда можете установить для функции сравнения буферов глубины значение «меньше или равно», а не «меньше», поэтому эти надписи всегда рисуются только на той поверхности, на которую они влияют.
jmegaffin
1

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

ОК ..... Я использую встроенные сетчатые наклейки. Я создаю сетку nxn, где Y сидит на местности. Я использую код, чтобы найти Y на сетке полигона terrains. После всех трансформаций я рисую поверх существующей геометрии в экранных координатах. Буфер глубины находится в экранных координатах, поэтому, слегка перемещая Z полигонов по направлению к экрану, он останавливает борьбу Z. Делая это, я уменьшил количество полигонов, составляющих мои подогнанные сетки, наполовину. Это старый код 120

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Надеюсь, это объясняет это лучше .. (по запросу)

Вся проволочная рама.

Только проводная местность.

Майк О
источник
1
Этот ответ кажется особенно коротким и неопределенным. Не могли бы вы уточнить свой ответ?
Гнемлок
1
Это не трудно понять. Я немного перемещаю вершину в направлении Z в пространстве экрана. Потому что в OpenGL вы всегда смотрите положительный Z в пространстве экрана, перемещение Z отрицательное небольшое количество исправляет борьбу Z. Однако с этим есть проблема. Когда вы уменьшаете масштаб, z может перемещать декаль гораздо больше, чем нужно. Исправление - масштабировать величину смещения на расстояние от глаз до вершины.
Майк О,