Unity 6.3
0 онлайн 118 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 266 из 442

Переключение ключевых слов шейдера в сценарии

Используйте скрипт C# для включения или отключения ключевых слов и проверки, имеет ли ключевое слово локальную или глобальную область действия.

Переключить ключевое слово

Чтобы изменить состояние ключевого слова, используйте Material API. Например, Material.EnableKeyword().

Переключить ключевые слова в нескольких шейдерах

По умолчанию ключевые слова шейдера HLSL имеют глобальную область применения. В результате для переключения ключевых слов с одинаковым именем между несколькими шейдерами можно использовать объект глобального ключевого слова C#.

Выполните следующие действия:

  1. Создайте объект GlobalKeyword с тем же именем, что и ключевые слова, которые нужно включить или отключить.
  2. Используйте Shader API для включения или отключения глобального ключевого слова, которое регулирует ключевое слово HLSL с одинаковым именем во всех шейдерах. Например, Shader.EnableKeyword.

Примечание: Когда вы создаете новый GlobalKeyword, Unity обновляет своё внутреннее сопоставление глобального и локального пространств ключевых слов для всех загруженных шейдеров. Это может сильно нагружать CPU. Чтобы уменьшить влияние этой операции, старайтесь создавать все глобальные ключевые слова после запуска приложения, во время его загрузки.

Предотвращение воздействия глобальных ключевых объектов на шейдеры

Чтобы предотвратить влияние объектов глобальных ключевых слов на ключевые слова шейдера, предоставьте ключевому слову шейдера локальную область, а не глобальную область.

Добавьте _local в директиву ключевого слова. Например:

#pragma shader_feature_local RED

Теперь на шейдер не влияет глобальное Shader APIs. Вы можете только включить или отключить ключевое слово, используя Material APIs как Material.EnableKeyword().

Примечание: Если вы используете Fallback или UsePass в шейдере, его ключевая область переопределяет ключевые области ссылающихся шейдеров.

Проверка сферы действия ключевого слова

Чтобы проверить область применения ключевого слова в шейдере, выберите шейдер в Project окно, затем в Inspector окно открыть Ключевые слова раскрывающееся меню. Unity отображает ключевые слова с глобальной областью действия под Переопределяемыйи ключевые слова с местным охватом в разделе Нельзя переопределить.

Вы также можете использовать LocalKeyword.isOverridable API.

Примечание: Термин Local в LocalKeyword означает, что API представляет ключевое слово HLSL, а не объект ключевого слова C#. Он не относится к сфере действия ключевого слова.

Чтобы проверить, включено ли ключевое слово, выполните следующие действия.

  • Если ключевое слово может быть переопределено, проверьте, существует ли глобальное ключевое слово C# с таким же именем. Если да, проверьте состояние ключевого слова с помощью Shader API. Например, Shader.IsKeywordEnabled().
  • Если ключевое слово не переопределяется, проверьте состояние ключевого слова с помощью Material API. Например, Material.IsKeywordEnabled().

В следующем коде показано, как проверить, считает ли Unity ключевое слово включенным или отключенным для материала:

using UnityEngine;
using UnityEngine.Rendering;

public class KeywordExample : MonoBehaviour
{
    public Material material;

    void Start()
    {
        CheckShaderKeywordState();
    }

    void CheckShaderKeywordState()
    {
        // Get the instance of the Shader class that the material uses
        var shader = material.shader;

        // Get all the local keywords that affect the Shader
        var keywordSpace = shader.keywordSpace;

        // Iterate over the local keywords
        foreach (var localKeyword in keywordSpace.keywords)
        {
            // If the local keyword is overridable (i.e., it was declared with a global scope),
            // and a global keyword with the same name exists and is enabled,
            // then Unity uses the global keyword state
            if (localKeyword.isOverridable && Shader.IsKeywordEnabled(localKeyword.name))
            {
                Debug.Log("Local keyword with name of " + localKeyword.name + " is overridden by a global keyword, and is enabled");
            }
            // Otherwise, Unity uses the local keyword state
            else
            {
                var state = material.IsKeywordEnabled(localKeyword) ? "enabled" : "disabled";
                Debug.Log("Local keyword with name of " + localKeyword.name + " is " + state);
            }            
        }
    }
}

Изменение ключевого слова с помощью командного буфера

Для включения или отключения локального или глобального ключевого слова с помощью Командного Буфера, используйте CommandBuffer.EnableKeyword или CommandBuffer.DisableKeyword.

Дополнительные ресурсы