Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход

Написать неосвещенный шейдер с цветовым входом в URP

В этом примере шейдер Unity добавляет свойство Base Color к материалу. Вы можете выбрать цвет с помощью этого свойства, и шейдер заполнит форму сетки этим цветом.

Используйте исходный файл шейдера Unity из раздела Базовый неосвещённый шейдер URP и введите следующие изменения в код ShaderLab:

  1. Добавьте определение свойства _BaseColor в блок Свойства:

    Properties
    {
        [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
    }
    

    Это заявление добавляет свойство _BaseColor с меткой Базовый цвет к материалу:

    Свойство Базовый Цвет на Материале
    Свойство Базовый Цвет на Материале

    Когда вы декларируете свойство с помощью [MainColor] атрибут, Unity использует это свойство как основной цвет Материала.

    Примечание: По соображениям совместимости _Color имя свойства — зарезервированное имя. Unity использует свойство с именем _Color как основной цвет даже если он не имеет [MainColor] атрибут.

  2. Когда вы объявляете свойство в блоке Свойства, вы также должны объявить его в коде HLSL.

    Примечание: Чтобы убедиться, что шейдер Unity совместим с SRP Batcher, объявьте все свойства Материала внутри одного блока CBUFFER с именем UnityPerMaterial. Для получения дополнительной информации о SRP Batcher, обратитесь к документации по Scriptable Render Pipeline (SRP) Batcher.

    Добавьте следующий код перед вершинным шейдером:

    CBUFFER_START(UnityPerMaterial)
        half4 _BaseColor;
    CBUFFER_END
    
  3. Измените код в шейдере фрагмента так, чтобы он возвращал свойство _BaseColor.

    half4 frag() : SV_Target
    {
        return _BaseColor;
    }
    

Теперь вы можете выбрать цвет в поле Base Color в окне Inspector. Шейдер фрагмента заполняет сетку выбранным вами цветом.

Поле базового цвета на материале
Поле базового цвета на материале

Ниже приведен полный код ShaderLab для этого примера.

// This shader fills the mesh shape with a color that a user can change using the
// Inspector window on a Material.
Shader "Example/URPUnlitShaderColor"
{
    // The _BaseColor variable is visible in the Material's Inspector, as a field
    // called Base Color. You can use it to select a custom color. This variable
    // has the default value (1, 1, 1, 1).
    Properties
    {
        [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
            };

            // To make the Unity shader SRP Batcher compatible, declare all
            // properties related to a Material in a a single CBUFFER block with
            // the name UnityPerMaterial.
            CBUFFER_START(UnityPerMaterial)
                // The following line declares the _BaseColor variable, so that you
                // can use it in the fragment shader.
                half4 _BaseColor;
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                return OUT;
            }

            half4 frag() : SV_Target
            {
                // Returning the _BaseColor value.
                return _BaseColor;
            }
            ENDHLSL
        }
    }
}

Раздел Рисование текстуры показывает, как рисовать текстуру на сетке.