texcoord и проблема спрайтовой анимации.

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

texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 10:27

День добрый.
Есть спрайтовая анимация. Вот такая текстурка
Скрытый текст:
Изображение
.
Например в системе частиц будет 16 кадров.

Мне необходимо получить следующий кадр. То есть если отображается 1, то мне надо 2. 1->2, 2->3, 3>4.

Это довольно просто, достаточно написать v.texcoord.x += 0.25 в вертексном блоке.
Но что делать если у меня 4 кадр? Мне надо получить 5, и вот тут проблема.

Пытался написать
Синтаксис:
Используется csharp
if(v.texcoord.x >= 0.75) {
        v.texcoord.y = v.texcoord.y - 0.25;
}
v.texcoord.x += 0.25;

Но это не работает.
Вот текстура
Скрытый текст:
Изображение


А вот что выходит если анимировать. Каждый 3-ий кадр делится (почему-то между значениями 4/8)
Скрытый текст:
Изображение

Если я уберу в условии if(v.texcoord.x >= 0.75) "равно" и сделаю так "if(v.texcoord.x > 0.75)", то тогда 3-ий кадр нормальный, а 4 начинает делиться.
Скрытый текст:
Изображение


Как быть?

ps Вот так происходит тайлинг анимированной текстуры, вдруг это необходимо
Скрытый текст:
Изображение
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение samana 04 июл 2015, 10:43

А если это система частиц, то зачем делать спрайты и анимировать текстурные координаты, если система частиц умеет это делать автоматически, при назначении текстуры для частиц в поле texure sheet animation?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: texcoord и проблема спрайтовой анимации.

Сообщение waruiyume 04 июл 2015, 10:52

Если я не ошибаюсь, сдвиг по Y будет:
целая часть от деления номера кадра на количество кадров по горизонтали, умноженное на высоту кадра.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 10:58

samana писал(а):А если это система частиц, то зачем делать спрайты и анимировать текстурные координаты, если система частиц умеет это делать автоматически, при назначении текстуры для частиц в поле texure sheet animation?

Вы не поняли. Я не делаю анимацию в шейдере. Я именно меняю текущий кадр, который получаю с помощью texure sheet animation. Я хочу сделать спрайтовую интерполяцию кадров (в ue4 есть такая шикарная вещь). Для этого мне надо следующий кадр. Я как-то уже начал делать, но забросил, а щас нужно снова :D
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 11:01

waruiyume писал(а):Если я не ошибаюсь, сдвиг по Y будет:
целая часть от деления номера кадра на количество кадров по горизонтали, умноженное на высоту кадра.

А как я получу номер кадра в шейдере? Там же кроме текстурных координат, которыми управляет система частиц, больше ничего нет. Высота я так понял это что-то типо _MainTex_ST.z?
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение waruiyume 04 июл 2015, 11:21

:ymhug: мусье знает толк в извращенствах. Если в настройках частиц указать 1 кадр по высоте, то можно будет вычислять сдвиг в фрагментной программе. Ну или в геометрической можно. Только накой эти пляски, скиньте ссылку на анрыаловские демонстрации, или напишите название чудо-техники.
Ещё вариант: номер кадра можно записать в цвет частицы.
Можно сделать вторую текстуру со сдвигом :D
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 11:37

waruiyume писал(а)::ymhug: мусье знает толк в извращенствах. Если в настройках частиц указать 1 кадр по высоте, то можно будет вычислять сдвиг в фрагментной программе. Ну или в геометрической можно. Только накой эти пляски, скиньте ссылку на анрыаловские демонстрации, или напишите название чудо-техники.
Ещё вариант: номер кадра можно записать в цвет частицы.
Можно сделать вторую текстуру со сдвигом :D

вот моя предыдущая темка. http://unity3d.ru/distribution/viewtopic.php?f=35&t=29469
Там я не учёл, что тайлинг и смещение общее для всего материала. А система частиц передаёт в texcoord свои изменения. И надо работать именно с ним.
вторая текстура это вариант, но перерисовывать текстуры мало приятного :(
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение jetyb 04 июл 2015, 12:26

Обычное программирование.
Этот пример для спрайтов с текстурными координатами из единичного квадрата.
Номер кадра _FrameNumber задается методами Material.SetInt , Shader.SetGlobalInt
Синтаксис:
Используется csharp
                int _FrameNumber;
                inline void SetUV(inout float2 uv)
                {
                        uv.x = (_FrameNumber % 4 + uv.x) * 0.25;
                        uv.y = (uv.y + _FrameNumber / 4) * 0.25;
                }
 


А вот что выходит если анимировать. Каждый 3-ий кадр делится (почему-то между значениями 4/8)

Как и должно быть. Нарисуй квадрат , подпиши текстурные координаты каждой вершины и найди выходные тестурные координаты вершин после алгоритма.
Получишь как раз результат.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 14:14

jetyb писал(а):Обычное программирование.
Этот пример для спрайтов с текстурными координатами из единичного квадрата.
Номер кадра _FrameNumber задается методами Material.SetInt , Shader.SetGlobalInt
Синтаксис:
Используется csharp
                int _FrameNumber;
                inline void SetUV(inout float2 uv)
                {
                        uv.x = (_FrameNumber % 4 + uv.x) * 0.25;
                        uv.y = (uv.y + _FrameNumber / 4) * 0.25;
                }
 


А вот что выходит если анимировать. Каждый 3-ий кадр делится (почему-то между значениями 4/8)

Как и должно быть. Нарисуй квадрат , подпиши текстурные координаты каждой вершины и найди выходные тестурные координаты вершин после алгоритма.
Получишь как раз результат.

Мне надо для системы частиц. Там для каждой частицы свои параметры texcoord, поэтому framebuffer я не смогу задать из скрипта. И всё что у меня есть, это текстурные координаты в texcoord, которыми управляет particleSystem. В unreal engine скорее всего передаётся дополнительный texcoord где указано смещение для текстуры и время интерполяции. Увы, в юнити такого нет.
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение jetyb 04 июл 2015, 14:56

Ну так ж в дефолтной партикл системе текстурные координаты спрайтов - единичный квадрат.

Upd:
Тыкнулся в встроенную партикл систему - сразу нашел ответ.
Все уже давно встроено со свистелками и перделками.
http://hostingkartinok.com/show-image.p ... 5bb46682e5
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 16:35

jetyb писал(а):Ну так ж в дефолтной партикл системе текстурные координаты спрайтов - единичный квадрат.

Upd:
Тыкнулся в встроенную партикл систему - сразу нашел ответ.
Все уже давно встроено со свистелками и перделками.
http://hostingkartinok.com/show-image.p ... 5bb46682e5

Я же уже писал выше:

kripto289 писал(а):
samana писал(а):А если это система частиц, то зачем делать спрайты и анимировать текстурные координаты, если система частиц умеет это делать автоматически, при назначении текстуры для частиц в поле texure sheet animation?

Вы не поняли. Я не делаю анимацию в шейдере. Я именно меняю текущий кадр, который получаю с помощью texure sheet animation. Я хочу сделать спрайтовую интерполяцию кадров (в ue4 есть такая шикарная вещь). Для этого мне надо следующий кадр. Я как-то уже начал делать, но забросил, а щас нужно снова :D


Попробую ещё раз объяснить. Дабы было понятно до конца.
У меня есть система частиц. Допустим горящий огонь. Разные частицы, с разным временем появления. С разным цветом (чем дольше длится огонь, тем прозрачнее), и т.д.
То есть управление с помощью скриптов отсекается. Я не могу из скрипта контролировать материал для каждой частицы. Потому что хитрые юнити с 1 Drawcall и 1 материалом управляют всеми частицами, а все изменения материала передаются с помощью texcoord и color в вершины.
Я использую допустим эту текстурку

В ней 16 кадров. То есть если я сделаю длительность анимации 2 секунды, то у меня фпс эффекта будет 8. Это как слайдшоу. Для эффектов минимум 25-30 кадров надо, иначе уже видно дёрганье. Более того, почти все заметят разницу даже между 30 и 60 кадрами.
Как быть? Интерполяция между кадрами. Я могу менять кадр, плавно интерполируя по времени со следующим кадром. Теперь заметить дёрганую смену кадров не возможно. Хотя это не совсем точно и правдоподобно, но это лучше, чем 16 дёрганых кадров за 2 секунды.
Например в случае с огромными взрывами мне приходится использовать 4к текстуры. Если клубы дыма длятся более 3-4 секунд, то мне необходимо иметь около 100 кадров. Это 256 на 512 пикселей текстура взрыва. Если эффект на весь экран, то это просто ужасно.
Вот тут мне приходится плясать, либо меньше кадров и лучше качество, либо больше кадров но хуже качество.
Поэтому интерполяция кадров то что нужно.
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение waruiyume 04 июл 2015, 18:08

Я тут подумал, если даже удастся рассчитать кадр, время то брать откуда?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: texcoord и проблема спрайтовой анимации.

Сообщение kripto289 04 июл 2015, 18:40

waruiyume писал(а):Я тут подумал, если даже удастся рассчитать кадр, время то брать откуда?

Об этом я тоже думал. Цветом тут уже ничего не передать. Остаётся только вариант с общей настройкой времени между кадрами в шейдере. Походу к чёрту эту затею, снова (полная Ж)

ps Вообще частицы в юнити скудные. Это печально.
В ue3/4 как-то больше всяких настроек, например создание спрайтов из меша, адекватный блум частиц, блендинг анимации, турбулентность, миллионы частиц на opencl, мягкие частицы с тенями и освещением, light-частицы, и т.д. И это первое что я заметил в уроках по частицам.
Часть из этого есть на сторе, tc particles например, но там нет блендинга анимации, light, теней, блума и остального :(
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: texcoord и проблема спрайтовой анимации.

Сообщение jetyb 07 июл 2015, 21:35

Потому что хитрые юнити с 1 Drawcall и 1 материалом управляют всеми частицами, а все изменения материала передаются с помощью texcoord и color в вершины.

ЛОЛ, занятно оптимизировали.

Впрочем я кажется нашел обход. Можно заранее насоздавать префабов с разными материалами и интантировать их.
Префабы при этом надо создавать особым образом: в EditMode без Play через объект на сцене (нажать на нем Apply или перетащить GameObject на префаб). И при активном окне Scene.
У меня так получилось создать несколько префабов с particle system с разными материалами, работающих в Play режиме.

Уверен, что если покопаться в API, то можно и менять материал партикл системы и напрямую.

Я тут подумал, если даже удастся рассчитать кадр, время то брать откуда?

Я тут как с другой планеты, не понимаю проблемы.
Есть время старта анимации, есть продолжительность анимации , есть текущее время. Известна продолжительность анимации в кадрах. Есть все что надо.
Если какие-то данные не можете найти - так контролируйте и передавайте их в шейдер сами. А в шейдере это обычная программисткая задача.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: texcoord и проблема спрайтовой анимации.

Сообщение waruiyume 07 июл 2015, 23:09

Есть время старта анимации, есть продолжительность анимации , есть текущее время. Известна продолжительность анимации в кадрах. Есть все что надо.

Так проблема как раз в частицах, как узнать время которое существует конкретная частица? Если не модифицировать каждую частицу на CPU, единственный способ использовать цвет, а это насколько я понимаю всего 256 значений.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

След.

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

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

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