Ответ: Как сделать правильнее
да это вообще беспонтовый способ, т.к. текстур не напасёшься на весь уровень.
я делал декали аля хл2, остался код на ксорсе/с++, но он слишком уж говнокод, так что смысла постить его особо нет, в теории работало так:
- мы выстрелили в объект, у нас есть позиция появления декали и нормаль поверхности в этом месте/альтернативно это может быть нормаль полёта пули.
- представляем 4 бесконечных плоскости, равноудалённые от позиции дырки и образующие квадрат размером с декаль, если смотреть в направлении нормали. т.е. по сути это квадрат в пространстве нормали, но вытянутый в глубину бесконечно.
- находим все треугольника объекта, попадающие внутрь этих плоскостей, по дистанции и разнице нормалей ещё можно отсеять повернутые обратной стороной трианглы или слишком далёкие от точки попадания.
- обрезаем найденные трианглы нашими 4мя плоскостями и отодвигаем их чуть-чуть в направлении их нормалей (чтобы избежать z-fighting)
- в пространстве нормали считаем планарные UV на трианглы (там тупо U=X, V=Y + нормализация)
- рисуем полученный меш
- можно объединять все декали одного типа на одном объекте в один меш
- можно не обрезать трианглы и не считать UV, а получать UV в пиксельном шейдере + юзать режим аддресации BORDER, но это потенциально ведёт к overdraw + не особо позволяет сфигачить кучу декалей в 1 меш.
- можно юзать deferred decals (?? не пробовал)
- вышенаписанная фигня про треугольники можнт звучать МЕДЛЕННО, но на практике работало, и я не замечал снижения фпс ваще.
|