Войти
UnityФорумПрограммирование

Unity3D: возможно ли менять запеченную текстуру теней в Runtime?

Страницы: 1 2 3 4 5 Следующая »
#0
0:43, 21 мая 2020

Привет всем.
Не гуглится вопрос: как изменить запеченую текстуру теней.
В сцене есть световой меч и им веду по полу. Меч должен оставлять на полу след после себя.
След сложный: чернота и красная линия (сердцевина расплавленного металла).
Красная линия тускнеет, с ней разберусь. А вот темный след всегда должен присутствовать.
Как оставить темный сдел? Думаю его можно как-то нанести на карту теней. Такое возможно? Кому-то попадались примеры проектов?


#1
2:12, 21 мая 2020

Если след постепенно стирается то можно декалями.

#2
8:46, 21 мая 2020

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

#3
9:48, 21 мая 2020

Нет, след не должен стираться. В этом-то и фишка.

#4
17:51, 21 мая 2020

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

#5
(Правка: 22:30) 22:28, 21 мая 2020

Я совсем новичек в тенях, не понимаю как они работают.
Что понял:
- есть обьекты, они запекаются. То есть как-то однозначно проецируются на большую текстуру теней. Тут вопрос: я так и не понял, текстура теней одна или их может быть несколько. Наверно одна.
- так как существует такая вещь как ShadowCascades, то вроде как на одну текстуру печется сразу несколько текстур теней. +Я видел в FrameDebugger однотипные текстуры теней (вроде оно).

Но мне совсем не удалось найти информации по тому как добраться до текстуры теней. Есть такие запекатели теней: встроенный в юнити и Backery (больше не видел).

//====
Как работает мой луч: есть rayCast и он светит на модель и попадает в коллайдер. Позиция коллайдера пересчитывается в UV. Вроде пересчет позиции делал ранее (но только для одного обьекта), не так и сложно.

Но вот попал я лучем в коллайдер и что? Пусть я даже определил что попал в модль A. Как получить позицию луча в карте теней??? И развертка обьекта позволяет проецировать на него тень. У меня в сцене модели с одной UV, но тени как-то на них ложатся так, что все нормально. Юнити генерирует свои дополнительные UV или что еще может быть?

#6
(Правка: 23:04) 22:45, 21 мая 2020

Разные техники работают по разному. Для dynamic shadow map это одна текстура на один источник света, со своими сгенерированными uv (тут uv это координаты лучей от источника света) для всех объектов, работает как фильтр (по глубине вычисляется затенен объект или нет, проецируется аналогично фильму в кинотеатре). Для light map это текстура на объект или атлас на сцену, работает как обычная текстура для объекта (просто рисуется тень на объекте как его собственный цвет).

#7
22:55, 21 мая 2020

foxes
> Для light map это текстура на объект или атлас на сцену работает как обычная текстура для объекта.
Спасибо. А как получить доступ к этой текстуре??? И где можно почитать как модель проецируется (развертка) на эту текстуру. Просто у всех моделей развертки уже используются под их текстуровку. Для карт теней используется uv2? Если да, то unity ее генерирует?

#8
(Правка: 23:54) 23:06, 21 мая 2020

Alerr
> А как получить доступ к этой текстуре???
Если ты ее запекаешь в редакторе или еще как то, то она лежит как и все текстуры в папке assets.
Alerr
> Если да, то unity ее генерирует?
если у тебя есть свой генератор light map то да, обычно это делается в отдельном 3D редакторе.
Alerr
> ShadowCascades
Это сделано для улучшения качества детализации теней при использовании dinamic shadow map. В зависимости от дистанции используется текстура с разным масштабом.
Alerr
> то вроде как на одну текстуру печется сразу несколько текстур теней.
Они не запекаются. Каждый кадр рендерится новая текстура с позиции источника света. К ней нет доступа, потому что их может быть несколько - столько же сколько источников света. Такая тень рендерится аналогично декалям.

#9
(Правка: 0:34) 0:21, 22 мая 2020

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

если не изменяет память я кровищу так делал.

#10
1:38, 22 мая 2020

Mira
Как бы вы дали возможность оставлять следы на всем и чтобы они не исчезали?

#11
4:51, 22 мая 2020

Чем вам декали не подходят?

#12
11:42, 22 мая 2020

kkolyan
> Чем вам декали не подходят?

1) Качество линий из декалей. На текстуре можно нарисовать линию с темной сердцевиной и более светлую по краям.
2) Луч рисует линию, которая не должна стираться. А декали нужно убирать. Иначе будет много лишних полигонов / декалей.
3) Пространства в игре много, следовательно может быть очень много декалей.

#13
(Правка: 12:27) 12:18, 22 мая 2020

Alerr
> В [b]сцене [/b]есть световой меч и им веду по полу
а, так вы не про кат-сцену? т.е. кол-во следов меча на полу зависит от действий игрока?

Я бы попробовал пойти по такому пути:
1. заводим большую текстуру для данных о следах меча по всему уровню, которую меняем из кода когда кто-то ведет мечом по полу. в текстуре именно данные - не сам рисунок. при 8к текстуре и кодировании в каждом пикселе битовой матрицы 5x5, получится битовая итоговая матрица 40000x40000.
2. сетим эту текстуру в глобальный параметр шейдеров.
3. пишем и накладываем на пол шейдер, который помимо рисования текстуры пола рисует сверху красивый след от меча на основании той глобальной текстуры.

по сути это те-же декали, просто реализованные вручную.

#14
12:27, 22 мая 2020

kkolyan

> 2. сетим эту текстуру в глобальный параметр шейдеров.
Спасибо, в целом понял общую идею! Но вот эта деталь не совсем понятна: как части этой текстуры должны проецироваться на обьекты??? Нужно вручную сделать UV2 для всех обьектов сцены?

Страницы: 1 2 3 4 5 Следующая »
UnityФорумПрограммирование