Подготовка данных (sprite), для передачи в шейдер.

Шейдеры и все-все-все.

Подготовка данных (sprite), для передачи в шейдер.

Сообщение drkilljoy 07 фев 2019, 13:03

Привет. Пишу пост-шейдеры для 2d и появилось много вопросов. Самый первый и основной (увы может быть выбрал не правильный раздел форума): как правильно (быстрее/проще) подготавливать специальные карты (Normal Map и прочие) для шейдера? У меня уже есть своя реализация (все работает), но мне кажется, что можно как-то проще и удачнее все сделать. Буду рад советам, критике и даже если просто скажете, что именно гуглить.

Сейчас постараюсь подробно расписать, как у меня все работает.

1) Формирование начального изображения:
1.1 Есть игровые объекты со SpriteRender у которого шейдер "spirtes/default". Они рендерятся камерой с учетом слоев, положения и прочего.
1.2 И в методе OnRenderImage(RenderTexture source, RenderTexture destination) в переменной "source" я получаю готовое изображение на которое я хочу наложить эффекты.

2) Формирование доп. карт:
Здесь у меня было два решения. Опишу который использую сейчас.
2.1 В цикле перебираю объекты со SpriteRender, которые сейчас на экране. Далее заменяю им Sprite на заранее нарисованную карту. (Смущает это место, приходиться держать массив с объектами и на каждом кадре их перебирать)
2.2 И далее рисую Graphics.DrawTexture в заготовленный RenderTexture. (Сама подготовка метода занимает время RenderTexture.active, GL.PushMatrix, GL.LoadPixelMatrix, и чем больше рисуем спрайтов, тем дольше соответственно).
2.3 Когда цикл заканчивает работу, на выходе я получаю готовую спец. карту которую можно передать в шейдер пост. обработки.

Еще был второй вариант. В нем я также как и шаге 2.1 меняю спрайты, но вместо 2.2 я рендерю через вторую камеру, которая рисует в RenderTexture.

Мне кажется, что наверняка есть более простой и удачный вариант. Очень надеюсь, что вы сможете мне подсказать.
drkilljoy
UNец
 
Сообщения: 4
Зарегистрирован: 21 ноя 2017, 10:41

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение Cr0c 07 фев 2019, 15:56

Для чего это? Я на днях сделал пост эффект пикселизации (на 2д сцене 3д объект пикселизируется) и просто маской для пост эффекта обрабатываю шейдером только его.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2946
Зарегистрирован: 19 июн 2015, 13:50

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение drkilljoy 07 фев 2019, 16:03

Cr0c писал(а):Для чего это? Я на днях сделал пост эффект пикселизации (на 2д сцене 3д объект пикселизируется) и просто маской для пост эффекта обрабатываю шейдером только его.

Сделал свой свет для пиксельарта. Нужно в шейдер передавать значения высоты и нормалей для каждого пикселя. Вот и пришел к такому решению. Но может можно как-то улучшить.
drkilljoy
UNец
 
Сообщения: 4
Зарегистрирован: 21 ноя 2017, 10:41

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение Cr0c 07 фев 2019, 16:08

На хабре статья есть по 2д освещению. Но там всё сложно для меня.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2946
Зарегистрирован: 19 июн 2015, 13:50

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение drkilljoy 07 фев 2019, 16:18

Cr0c писал(а):На хабре статья есть по 2д освещению. Но там всё сложно для меня.

Тут даже не про освещение. С освещение я свое написал (перемудренное, но рабочее), меня интересует именно, как лучше всего сложить спрайты и в шейдер подать.
Как в 3d реализовано? Там же в одном шейдере подается и нормал мап и текстура.
drkilljoy
UNец
 
Сообщения: 4
Зарегистрирован: 21 ноя 2017, 10:41

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение Cr0c 07 фев 2019, 16:31

Там из юнити свет передаётся и ручками обрабатывается освещение.
Можешь сам в шейдер передать свет и обрабатывать в 2д, нормали так же текстурой сделать, как в 3д. Только в 3д свет просчитывается перед передачей в шейдер (который не эмбиент, конечно, тот считать отдельно не надо, он везде есть).
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2946
Зарегистрирован: 19 июн 2015, 13:50

Re: Подготовка данных (sprite), для передачи в шейдер.

Сообщение drkilljoy 07 фев 2019, 16:41

Cr0c писал(а):Там из юнити свет передаётся и ручками обрабатывается освещение.
Можешь сам в шейдер передать свет и обрабатывать в 2д, нормали так же текстурой сделать, как в 3д. Только в 3д свет просчитывается перед передачей в шейдер (который не эмбиент, конечно, тот считать отдельно не надо, он везде есть).

Спасибо конечно, но я немного не об этом спрашивал.

Меня интересует как передать все спрайты в шейдер разом. Значит нужно их собрать в один RenderTexture. Нормально ли, как я перебирать все объекты и менять и спрайты и рендерить?
drkilljoy
UNец
 
Сообщения: 4
Зарегистрирован: 21 ноя 2017, 10:41


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3