Включени и отключение карт нормалей в настройках графики

Программирование на Юнити.

Включени и отключение карт нормалей в настройках графики

Сообщение Kakaha_228 28 дек 2022, 21:51

Приветстувю. Есть у меня такакя прибамбаснутость: хочу максимально оптимизировать свой проект. Дом, участок, мебель и прочее всё, что имеет текстуру, так же имеет карты нормалей. Для большего удобства я карты нормалей назвал "название_текстуры_normal.png". С ними картинка выглядит приятнее, чем без них. Но так же с ними производительность ниже, чем без них (если без них стабильные 60 кадров на ульрах, то с ними 15-20, не больше). Я прекрасно понимаю, что не у всех игроков будет ПК, позволяющий выжать максимум производительности, если даже мой не тянет (Ryzen 5 5500U, Radeon RX640, 8GB DDR4 3200MHz). Вот и озадачился этой идеей, отключить карты нормалей в настройках. И вот тут самое интересное: как это сделать я не смог найти. Даже в документации искал.
Вообще была такая масль: массив, в него вкладываю все материалы, имеющие карты нормалей и... делаю карты нормалей прозрачными что ли... Я даже не знаю, что с ними можно сделать, так как в документации о стандартных материалах нет нужной ниформации. Пробовал в material.SetFloat("_NormalMapping", false); или по разному, но так и не смог подобрать этот _NormalMapping для взаимодействия с нормалями... Может есть какой шейдер специиально для этого? Я вообще в тупике...
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Включени и отключение карт нормалей в настройках графики

Сообщение waruiyume 28 дек 2022, 22:18

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

Re: Включени и отключение карт нормалей в настройках графики

Сообщение Kakaha_228 04 янв 2023, 18:48

waruiyume писал(а):https://docs.unity3d.com/Manual/shader-keywords.html

К сожалению, там за нормали ни слова не сказано... Есть ещё каке мысли?
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Включени и отключение карт нормалей в настройках графики

Сообщение Alkos26Rus 04 янв 2023, 22:27

Kakaha_228 писал(а):
waruiyume писал(а):https://docs.unity3d.com/Manual/shader-keywords.html

К сожалению, там за нормали ни слова не сказано... Есть ещё каке мысли?

Про render pipeline знаешь? Почитай, вроде там можно настроики материалов менять
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Включени и отключение карт нормалей в настройках графики

Сообщение waruiyume 05 янв 2023, 02:45

akaha_228, это именно то, что нужно.
Я не разобрался как это сделать глобально, для стандартного шейдера, но накостылял такое для выставления для материала.
Синтаксис:
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class KeywordsTest : MonoBehaviour
{
    public string keyword = "_NORMALMAP";
    public static bool _enableKeyword;

    public static event Action EOnSetEnableKeyword;

    public static bool EnableKeyword
    {
        get => _enableKeyword;
        set
        {
            _enableKeyword = value;
            EOnSetEnableKeyword?.Invoke();
        }
    }

    private void UpdateKeyword()
    {
        var rends = GetComponentsInChildren<Renderer>();
        foreach (var r in rends)
        {
            foreach (var m in r.sharedMaterials)
            {
                if (EnableKeyword) m.EnableKeyword(keyword);
                else m.DisableKeyword(keyword);
            }
        }
    }

    void Start()
    {
        EOnSetEnableKeyword += UpdateKeyword;
        UpdateKeyword();
    }

    void OnDestroy()
    {
        EOnSetEnableKeyword -= UpdateKeyword;
    }

    [ContextMenu("EnableNormals")]
    void EnableNormals()
    {
        EnableKeyword = true;
    }

    [ContextMenu("DisableNormals")]
    void DisableNormals()
    {
        EnableKeyword = false;
    }
}

Есть 2 косяка: не уверен, что это будет работать в билде(по ссылке можно найти как не стрипать варианты), т.к. меняются sharedMaterials, в редакторе будут меняться шейдеры в проекте и это будет сохраняться даже после выключения плеймода.

А вот почему нельзя просто назначить одноцветную карту нормалей:
Синтаксис:
Используется csharp
float3 PerPixelWorldNormal(float4 i_tex, float4 tangentToWorld[3])
{
#ifdef _NORMALMAP
    half3 tangent = tangentToWorld[0].xyz;
    half3 binormal = tangentToWorld[1].xyz;
    half3 normal = tangentToWorld[2].xyz;

    #if UNITY_TANGENT_ORTHONORMALIZE
        normal = NormalizePerPixelNormal(normal);

        // ortho-normalize Tangent
        tangent = normalize (tangent - normal * dot(tangent, normal));

        // recalculate Binormal
        half3 newB = cross(normal, tangent);
        binormal = newB * sign (dot (newB, binormal));
    #endif

    half3 normalTangent = NormalInTangentSpace(i_tex);
    float3 normalWorld = NormalizePerPixelNormal(tangent * normalTangent.x + binormal * normalTangent.y + normal * normalTangent.z); // @TODO: see if we can squeeze this normalize on SM2.0 as well
#else
    float3 normalWorld = normalize(tangentToWorld[2].xyz);
#endif
    return normalWorld;
}

Без нормалей будет выполняться 1 строчка в else, а с нормалями всё, что в #ifdef _NORMALMAP.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Скрипты

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

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