UI теряет фильтр если отключить Mipmaps

Импорт текстур, моделей, звуков и пр.

UI теряет фильтр если отключить Mipmaps

Сообщение Jora 28 авг 2019, 11:15

Здравствуйте. Проблема следующая. Рисую элементы UI через OnGUI и DrawTexture. Изменяю настройки качества текстур, и элементы UI так же теряют в качестве. Прочитал в интернете, что необходимо убрать им галочку Generate Mip Maps. Убираю галочку, действительно изменения качества текстур больше не влияет на UI, но картинка как бы теряет фильтр. Становится более жёсткой, без сглаживания, и теряет пиксели при масштабирование. Будто стоит Point(No filter).

Пример: Слева картинка без Generate Mip Maps, справа с Generate Mip Maps, так как должно быть, но искажается при уменьшение качества.

https://ibb.co/82VvKn0

В связи с этим у меня несколько вопросов. Можно ли оставить галочку Generate Mip Maps, но при этом исключить текстуру от влияния на неё Quality Settings? Или можно ли вручную задать качество для определённой текстуры в коде, после того как Quality Settings убьёт качество текстур? Или всё же отключить Generate Mip Maps, но как-то вернуть UI фильтр для сглаживания?
Jora
UNец
 
Сообщения: 18
Зарегистрирован: 28 авг 2019, 10:50

Re: UI теряет фильтр если отключить Mipmaps

Сообщение Jora 18 апр 2020, 15:27

Приветствую. Спустя огромное количество времени я разобрался с проблемой. Не сказать, что я сильно бился головой об стену, но проблемка сидела где-то в подсознание и терзала меня) Так же я довольно активно гуглил проблему и нашёл с 3-4 темы на англ сайтах, где людям так же не помогли.

Короче, суть такая. Данное искажение происходит, если размер картинки в пикселях сильно больше размера Rect, в котором картинку отрисовывают. Почему-то юнити криво скалирует в сторону уменьшения. Если оставить галочку GenereateMipMaps - скалируется хорошо, потому что данная настройка как бы создаёт массив из размеров данной текстуры, и при отрисовывании картинки в маленьком Rect будет подставлена уже уменьшенная текстура. Однако, галочку нужно убрать, чтобы мы могли уменьшать качество текстур в настройках, и не уменьшать качество ГУИ. Поэтому при отключение этой галочки юнити всегда отрисовывает картинку в полном размере, как бы сжимая её в маленький Rect, и вызывая искажения оной при несоответствии размеров.

Итак, решение такое - нашёл я на просторах инета скрипт, который позволяет ужимать размер текстуры динамически.

https://wiki.unity3d.com/index.php/Text ... reScale.cs

На деле нужно сделать следующее. При запуске игры - дополнительно закешируйте текстуру в переменную, чтобы у вас всегда была под рукой текстура с полным размером. Далее проверьте размер экрана/разрешения в котором запущена игра. Если оно меньше изначально вами задуманного (для которого рисовалось и подгонялось ГУИ), то необходимо уменьшить текстуру с помощью этого скрипта. Так же важно проверять динамически изменение размера экрана (если юзер поменял разрешение, или перешёл в оконным режим). В этом случае, присвойте отрисованной текстуре ту самую закешированную текстуру, которая ещё не была уменьшена, и заново отскалируйте её с помощью скрипта, относительно нового разрешения.

Вот пример как выглядит картинка до и после скрипта:

https://ibb.co/GJ7nB8J
Jora
UNец
 
Сообщения: 18
Зарегистрирован: 28 авг 2019, 10:50

Re: UI теряет фильтр если отключить Mipmaps

Сообщение 1max1 18 апр 2020, 15:39

Расширение для текстуры, которое делает тоже самое)
В конце надо не забыть дернуть Apply.
Синтаксис:
Используется csharp
        public static void SetScale(this Texture2D me, int newWidth, int newHeight)
        {
            var rt = RenderTexture.GetTemporary(newWidth, newHeight, 0, RenderTextureFormat.ARGB32);
            Graphics.Blit(me, rt);
            me.Resize(newWidth, newHeight);
            RenderTexture active = RenderTexture.active;
            RenderTexture.active = rt;
            me.ReadPixels(new Rect(0, 0, newWidth, newHeight), 0, 0);
            RenderTexture.active = active;
            RenderTexture.ReleaseTemporary(rt);
        }
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: UI теряет фильтр если отключить Mipmaps

Сообщение Jora 18 апр 2020, 15:45

1max1 писал(а):Расширение для текстуры, которое делает тоже самое)


Ничего не понял. Поподробнее расскажи, что ты написал и как это применять)
Jora
UNец
 
Сообщения: 18
Зарегистрирован: 28 авг 2019, 10:50

Re: UI теряет фильтр если отключить Mipmaps

Сообщение 1max1 18 апр 2020, 16:46

Синтаксис:
Используется csharp
static class EXs
{
    public static void SetScale(this Texture2D me, int newWidth, int newHeight)
    {
        var rt = RenderTexture.GetTemporary(newWidth, newHeight, 0, RenderTextureFormat.ARGB32);
        Graphics.Blit(me, rt);
        me.Resize(newWidth, newHeight);
        RenderTexture active = RenderTexture.active;
        RenderTexture.active = rt;
        me.ReadPixels(new Rect(0, 0, newWidth, newHeight), 0, 0);
        RenderTexture.active = active;
        RenderTexture.ReleaseTemporary(rt);
    }
}

class XXX : MonoBehaviour
{
    void Start()
    {
        SpriteRenderer sr = GetComponent<SpriteRenderer>();
        Texture2D newTexture = Instantiate(sr.sprite.texture);

        int w = newTexture.width / 2;
        int h = newTexture.height / 2;

        newTexture.SetScale(w, h);
        newTexture.Apply();

        Rect rect = new Rect(0.0f, 0.0f, w, h);
        Vector2 pivot = new Vector2(0.5f, 0.5f);
        float ppu = sr.sprite.pixelsPerUnit;

        sr.sprite = Sprite.Create(newTexture, rect, pivot, ppu);
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: UI теряет фильтр если отключить Mipmaps

Сообщение Jora 18 апр 2020, 17:43

Спасибо. Другой способ скалирования не будет лишним, если что-то пойдёт не так.
Jora
UNец
 
Сообщения: 18
Зарегистрирован: 28 авг 2019, 10:50


Вернуться в Медиа

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

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