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

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

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

Сообщение jetyb 08 июл 2015, 08:23

Ну да.
Но все равно ИМХО если хорошенько подумать, решение можно найти. Вот к примеру в группе TextureSheetAnimation можно без ограничений задать внутреннее разбиение (скажем 100 на 100 ячеек). А в шейдере по текстурным координатам текущей ячейки можно определять определять ячейку, а по ней текущий кадр анимации частицы и с определенной точностью время (вся анимация в этом случае разбивается на 10 000 кадров).
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

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

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

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

Сообщение kripto289 08 июл 2015, 09:24

jetyb писал(а):Ну да.
Но все равно ИМХО если хорошенько подумать, решение можно найти. Вот к примеру в группе TextureSheetAnimation можно без ограничений задать внутреннее разбиение (скажем 100 на 100 ячеек). А в шейдере по текстурным координатам текущей ячейки можно определять определять ячейку, а по ней текущий кадр анимации частицы и с определенной точностью время (вся анимация в этом случае разбивается на 10 000 кадров).

Время не определить. Если я ставлю время жизни от 1 до 10 секунд, то анимация всегда постоянна (допустим 16 фреймов) и эти фреймы тупо растягиваются по времени. И доступ к частицам я имею только на cpu. Ко времени жизни я имею доступ из скриптов, а к текстурным координатам и цвету доступа нет. Да и перебирать все частицы каждый кадр - моветон.
В целом, полной интеграции с системой частиц не сделать. Нужно смириться с безысходностью :-s
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

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

Сообщение jetyb 08 июл 2015, 09:47

Не поняли. Ваше фреймовое разбиение (16 фреймов) и то разбиение что задано в TextureSheetAnimation (100 на 100) - это разные разбиения. Разбиение из TextureSheetAnimation служит только для определения номера кадра. Ячейки вашего фреймового разбиения и их смешение вычисляются через код.

К примеру.
Пусть разбиение в TextureSheetAnimation задано как (100 на 100).
Пусть в фрагментный шейдер вошел пиксель с текстурными координатами (0.346 , 0.723). Значит он соответствует [34, 72] клетке или 72 * 100 + 34 = 7234 / 10 000 кадру анимации.
В диапазоне 0 - 1 он с малой погрешностью соотвествует моменту времени 0.7234.
В 16 - кадровом разбиении это 16 * 0.7234 = 11.5744 - то есть смешение 11 и 12 кадра с коэффицентом 0.5744.
Текстурные координаты пикселей из 16 - кадрового разбиения по текстурным координатам пикселя в 10 000 кадровом разбиении.

Дальше. Как найти текстурные координаты для отдельного кадра.
Прямоугольник кадра вашего 16 -кадрового разбиения по номеру кадра вы можете найти. Пусть известны его x,y, width, height.
Входной пиксель (0.346 ; 0.723) имеет координаты ((0.346 - 0.34 ) * 100, (0.723 - 0.72) * 100) = (0.6 , 0.3) относительно этого прямоугольника кадра.
Значит он соответствует координатам (x + 0.6 * width, y + 0.3 * height) в текстуре.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

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

jetyb писал(а):Не поняли. Ваше фреймовое разбиение (16 фреймов) и то разбиение что задано в TextureSheetAnimation (100 на 100) - это разные разбиения. Разбиение из TextureSheetAnimation служит только для определения номера кадра. Ячейки вашего фреймового разбиения и их смешение вычисляются через код.

К примеру.
Пусть разбиение в TextureSheetAnimation задано как (100 на 100).
Пусть в фрагментный шейдер вошел пиксель с текстурными координатами (0.346 , 0.723). Значит он соответствует [34, 72] клетке или 72 * 100 + 34 = 7234 / 10 000 кадру анимации.
В диапазоне 0 - 1 он с малой погрешностью соотвествует моменту времени 0.7234.
В 16 - кадровом разбиении это 16 * 0.7234 = 11.5744 - то есть смешение 11 и 12 кадра с коэффицентом 0.5744.
Текстурные координаты пикселей из 16 - кадрового разбиения по текстурным координатам пикселя в 10 000 кадровом разбиении.

Дальше. Как найти текстурные координаты для отдельного кадра.
Прямоугольник кадра вашего 16 -кадрового разбиения по номеру кадра вы можете найти. Пусть известны его x,y, width, height.
Входной пиксель (0.346 ; 0.723) имеет координаты ((0.346 - 0.34 ) * 100, (0.723 - 0.72) * 100) = (0.6 , 0.3) относительно этого прямоугольника кадра.
Значит он соответствует координатам (x + 0.6 * width, y + 0.3 * height) в текстуре.

Не сразу понял что вы имели ввиду вначале. Щас попробую реализовать (popcorn1)
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

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

Сообщение kripto289 08 июл 2015, 13:10

jetyb писал(а):Не поняли. Ваше фреймовое разбиение (16 фреймов) и то разбиение что задано в TextureSheetAnimation (100 на 100) - это разные разбиения. Разбиение из TextureSheetAnimation служит только для определения номера кадра. Ячейки вашего фреймового разбиения и их смешение вычисляются через код.

К примеру.
Пусть разбиение в TextureSheetAnimation задано как (100 на 100).
Пусть в фрагментный шейдер вошел пиксель с текстурными координатами (0.346 , 0.723). Значит он соответствует [34, 72] клетке или 72 * 100 + 34 = 7234 / 10 000 кадру анимации.
В диапазоне 0 - 1 он с малой погрешностью соотвествует моменту времени 0.7234.
В 16 - кадровом разбиении это 16 * 0.7234 = 11.5744 - то есть смешение 11 и 12 кадра с коэффицентом 0.5744.
Текстурные координаты пикселей из 16 - кадрового разбиения по текстурным координатам пикселя в 10 000 кадровом разбиении.

Дальше. Как найти текстурные координаты для отдельного кадра.
Прямоугольник кадра вашего 16 -кадрового разбиения по номеру кадра вы можете найти. Пусть известны его x,y, width, height.
Входной пиксель (0.346 ; 0.723) имеет координаты ((0.346 - 0.34 ) * 100, (0.723 - 0.72) * 100) = (0.6 , 0.3) относительно этого прямоугольника кадра.
Значит он соответствует координатам (x + 0.6 * width, y + 0.3 * height) в текстуре.

Попробовал написать шейдер.
Вот кусочек вертексного кода
Синтаксис:
Используется csharp
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.color = v.color;
                                int gridX = (int)(v.texcoord.x*100);
                                int gridY = (int)(v.texcoord.y*100);
                                float frameWithLerp = ((gridX * 100 + gridY) / (100*100)) * 16;
                                int frame = (int) frameWithLerp;
                                float lerpVal = frameWithLerp - frame;
                                float x = frame%4;
                                float y = 1 - (int)(frame/4) * 0.25;
                                float offsetX = v.texcoord.x*100 - gridX;
                                float offsetY = v.texcoord.y*100 - gridY;
                               
                                o.texcoord = (x + offsetX * 0.25, y + offsetY * 0.25);
                                //o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                                return o;
                        }

Кадр всегда розовый, texture sheet animation 100 на 100. Хотел отладить шейдер http://docs.unity3d.com/ru/current/Manual/SL-DebuggingD3D11ShadersWithVS.html, но студия вываливает кучу ошибок при дебаге.
Где я мог ошибиться?
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

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

Сообщение jetyb 09 июл 2015, 08:57

Раззадорился я и быстро сам сделал плавную смену кадров.
Все нормально получилось, скрытых проблем я не заметил
Ниже ссылка на билд и тестовую текстуру.
https://yadi.sk/d/NeZ46VoNhkouU
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

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

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

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

Сообщение jetyb 09 июл 2015, 09:28

Это базовая particle system с единственной частицей , настроенная на тайловую анимацию. С моим материалом и шейдером.
Как я и говорил.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

Сообщение kripto289 09 июл 2015, 11:19

jetyb писал(а):Это базовая particle system с единственной частицей , настроенная на тайловую анимацию. С моим материалом и шейдером.
Как я и говорил.

Не покажите код шейдера? :ymparty:
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

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

Сообщение jetyb 09 июл 2015, 13:02

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

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

Сообщение kripto289 10 июл 2015, 01:29

jetyb писал(а):Неа, халявы не будет.
Либо пишите сами, либо предлагайте вознаграждение.

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

Пред.

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

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

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