Есть камера, которая плавно летает по сцене (плавно разгоняется и тормозит). На карте куча спрайтов: какие-то тайлятся, какие-то - нет.
При перемещении камеры эти спрайты начинают как бы мерцать - т.е. у них пропадают некоторые пиксели, потом появляются. Текстуры на таких спрайтах 512х512 (пока что, такой размер).
Одни спрайты получаются мелкими, а одни крупными - вот мелкие спрайты и начинают мерцать. Вроде как, текстель в пиксель не попадает, поэтому и начинается мерцание.
Перечитал кучу статей на форумах и в голове какая-то каша сплошная:
одни говорят что нужно расчитывать размер камеры исходя из размера окна, размера текстуры на спрайта;
другие - нужно округлять позицию камеру к ближайшему пикселю;
здесь вообще автор делает для этого специальную текстуру и камеру становит на определенный размер;
еще есть советы, чтобы делать Pixels Per Unit равному единицы - т.е. 1 пиксель = 1 виртуального метру в юнити.
Смена фильтрации на точечную тоже не помогает.
Как можно поправить данное мерцание?
см "Z-fighting"
snv
нее, это тут не при чем - т.к. спрайты, которые мерцают, не наложены друг на друга.
Gurich
Им не обязательно быть наложенным. Значения z могут быть большими, или z-buffer может быть 16-битным, или какой-нибудь алгоритм художника дает одинаковые z.
У меня когда подобная проблема была - решал настройкой скейла камеры (что-то похожее на первый вариант из предложенных). Деталей точно не помню - около года назад было.
Помимо этого, в некоторых случаях канает большой меш и повторяющаяся текстура (к примеру, x10 ширина меша и 0.1 Tilling по горизонтали).
radiys92
а какой размер камеры ты ставил и pixels per unit?
допустим, в стандартных примерах, идущих к юнити, есть 2д игра (робот по платформах белым бегает/прыгает) - там для спрайтов всех pixels per unit = 204.8. я не могу понять, почему 204.8? Откуда такое значения там?
насчет размера камеры: по первой ссылке предлагается расчет размера камеры исходя из размера спрайта; но что если у меня спрайты разных разрешений всех - например пуля мелкая 32х32, а вот какой камень уже 128х128 - как тогда расчитывать размер камеры?
правильно ли я понял, что проблема в разрывах между спрайтами? Это я понял из приведённых постов. Мне автор 2dtoolkit-а посоветовал округлять координаты в соответствии с 1 / pixels_per_meter и ты знаешь - помогло! В редакторе иногда я наблюдал разрывы, но в сборках для PC или мобилок всё было гладко.
Opts
нет, разрывов нету. есть текстура черная, но по краям ее идет линия белая толщиной в 3-4 пикселя (получается что-то типа обводки такой). Так вот, когда накладываешь ее на сцену в видел спрайтов/спрайта, то при передвижении камеры края спрайтов начинаю мерцать (т.е. как бы съедается одна строчка из пикселей, потом она же появляется и т.д.). Это все чуть фиксится, когда делаешь pixel snap для материала + округляешь координаты позиции камеры к ближайшему пикселю + размер камеры ставишь чуть меньше, но все равно какие-никакие мерцания появляютс - что на пк, что на смартфоне.
у тебя пиксель арт? Попробуй в текстуре где чёрный квадрат, размыть края кисточкой и граница между картинкой(последний видимый пиксель, даже если альфа =1) и канвой была несколько пикселей. Т.е. чтобы он не был сильно прижат к границам, а была ещё пустая(прозрачная) рамка.
Пример сначала первый потом второй вариант попробуй.
Gurich
>> я не могу понять, почему 204.8?
Скорее всего, из-за того что размеры текстур кратные степени двойки. Так 2k текстуры будут иметь размеры 10х10 юнитов, 1k - 5x5 и т. п.. В таком случае камера, у которой orthoSize является целым числом, будет адекватно все рендерить.
Тут вся соль в том, чтоб в размер камеры четко "влазило" целое кол-во текстур. К примеру, если камера имеет orthoSize 10, то было бы разумным делать такой размер спрайта (в юнитах), чтоб их в камеру помещалось 5 (размер 2 юнита), 10 (размер 1 юнит), 20 (размер 0.5 юнитов). Но никак не 10.3456 (размер 0.9665944942777606 юнитов) - в этом то случае и появляются артефакты, схожие с описанными тобой. Либо, в последнем случае, размер камеры нужно задать как 9.6659 - это так же решит проблему.
В принципе, ничего сложного, но эти размеры нужно предусматривать заранее :)
По крайней мере, это на сколько я помню ресерчи по этой теме) Как уже говорил - сам лично давно сталкивался с этой проблемой.
Тема в архиве.