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

Нарисовать текстуру в шейдере в URP

Шейдер Unity в этом примере рисует текстуру на сетке.

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

  1. В блоке Свойства замените существующий код на определение свойства _BaseMap.

    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }
    

    Когда вы объявляете свойство текстуры в блоке Свойства, Unity добавляет свойство _BaseMap с меткой Base Map к Материалу и добавляет элементы управления Tiling и Offset.

    Свойства текстуры с элементами управления Tiling и Offset
    “Свойство текстуры с элементами управления Tiling и Offset”

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

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

  2. В struct Attributes и struct Varyingsдобавьте переменные uv для координат UV на текстуре:

    float2 uv           : TEXCOORD0;
    
  3. Определите текстуру как текстуру 2D и укажите для неё семплер. Добавьте следующие строки перед блоком CBUFFER:

    TEXTURE2D(_BaseMap);
    SAMPLER(sampler_BaseMap);
    

    Макросы TEXTURE2D и SAMPLER определены в одном из файлов, указанных в Core.hlsl.

  4. Для того, чтобы тилинг и офсет работали, необходимо объявить свойство текстуры с суффиксом _ST в блоке ‘CBUFFER’. Суффикс _ST необходим, потому что некоторые макросы (например, TRANSFORM_TEX) используют его.

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

    CBUFFER_START(UnityPerMaterial)
        float4 _BaseMap_ST;
    CBUFFER_END
    
  5. Чтобы применить преобразование плитки и смещения, добавьте следующую строку в вершинный шейдер:

    OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
    

    Макрос TRANSFORM_TEX определен в файле Macros.hlsl. Объявление #include содержит ссылку на этот файл.

  6. В шейдере фрагментов используйте макрос SAMPLE_TEXTURE2D для выборки текстуры:

    half4 frag(Varyings IN) : SV_Target
    {
        half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
        return color;
    }
    

Теперь вы можете выбрать текстуру в поле Base Map в окне Inspector. Шейдер рисует эту текстуру на сетке.

Текстура базовой карты на материале
Текстура базовой карты на материале

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

// This shader draws a texture on the mesh.
Shader "Example/URPUnlitShaderTexture"
{
    // The _BaseMap variable is visible in the Material's Inspector, as a field
    // called Base Map.
    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }

    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;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            // This macro declares _BaseMap as a Texture2D object.
            TEXTURE2D(_BaseMap);
            // This macro declares the sampler for the _BaseMap texture.
            SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
                // The following line declares the _BaseMap_ST variable, so that you
                // can use the _BaseMap variable in the fragment shader. The _ST
                // suffix is necessary for the tiling and offset function to work.
                float4 _BaseMap_ST;
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // The TRANSFORM_TEX macro performs the tiling and offset
                // transformation.
                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // The SAMPLE_TEXTURE2D marco samples the texture with the given
                // sampler.
                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                return color;
            }
            ENDHLSL
        }
    }
}

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