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

Образец текстуры в HLSL

Чтобы взять образец текстуры в High-Level Shader Language (HLSL), объявляют текстуру и ее семплер. Семплер содержит свойства, которые GPU использует для семплирования текстуры, например, режим обрамления и режим фильтрации. Свойства обычно берутся из настройки импорта текстуры.

Примечание: Если ваш проект использует Universal Render Pipeline (URP), обратитесь вместо этого к Нарисовать текстуру в шейдере в URP.

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

  1. В блоке HLSLPROGRAM используйте макрос UNITY_DECLARE_TEX2D для объявления текстуры и её семплер. Например:

    UNITY_DECLARE_TEX2D(_MainTex);
    

    Unity создает стандартный объект HLSL Texture2D для текстуры и стандартный объект HLSL SamplerState для ее семплера.

  2. Для выборки текстуры используйте макрос UNITY_SAMPLE_TEX2D. Например:

    half4 color = UNITY_SAMPLE_TEX2D(_MainTex, uv);
    

Если графика API не поддерживает отдельные текстуры и семплеры, Unity делает следующее:

  • Макрос UNITY_DECLARE_TEX2D вместо этого создает стандартный объект HLSL sampler2D, который объединяет текстуру и её семплер.
  • Макрос UNITY_SAMPLE_TEX2D_SAMPLER семплирует текстуру с помощью комбинированного текстурного и семплирующего инструмента.

Сборка других текстур с тем же самплером

Чтобы семплировать вторую текстуру с помощью семплера из текстуры, выполните следующие действия:

  1. В блоке HLSLPROGRAM объявить вторую текстуру с помощью макроса UNITY_DECLARE_TEX2D_NOSAMPLER. Например:

    UNITY_DECLARE_TEX2D_NOSAMPLER(_SecondTex);
    
  2. Для семплирования текстуры используйте макрос UNITY_SAMPLE_TEX2D_SAMPLER, передавая первую текстуру в качестве источника семплера. Например:

    half4 color = UNITY_SAMPLE_TEX2D_SAMPLER(_SecondTex, _FirstTex, uv);
    

Создание пользовательского семплера

Чтобы создать и использовать пользовательский семплер непосредственно в шейдере, также известный как встроенный семплер, выполните следующие действия:

  1. Объявите объект SamplerState и используйте его имя для установки его свойств. Например, следующий код создает пользовательский пробоотборник, который использует точечную фильтрацию и режим зажимной обвязки:

    SamplerState my_point_clamp_sampler;
    
  2. Выберите текстуру с помощью метода Sample объекта Texture2D и передайте ее в пользовательский семплер. Например:

    _MainTex.Sample(my_point_clamp_sampler, uv);
    

Примечание: Встроенные семплеры не работают, если вы нацелены на OpenGL ES или OpenGL Core графики APIs.

Дополнительные сведения см. в Встроенные переменные шейдера см. в.

Пример

В следующем примере повторно используется один и тот же семплер для трех текстур:

Shader "Custom/SeparateSamplerExample"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _SecondTex ("Second Texture", 2D) = "white" {}
        _ThirdTex ("Third Texture", 2D) = "white" {}
    }

    SubShader
    {
        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            // Declare the first texture and its sampler.
            UNITY_DECLARE_TEX2D(_MainTex);

            // Declare the second and third textures without samplers.
            UNITY_DECLARE_TEX2D_NOSAMPLER(_SecondTex);
            UNITY_DECLARE_TEX2D_NOSAMPLER(_ThirdTex);

            struct v2f {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                // Sample the first texture using its own sampler.
                half4 color1 = UNITY_SAMPLE_TEX2D(_MainTex, i.uv);

                // Sample the second and third textures using the sampler from the first texture.
                half4 color2 = UNITY_SAMPLE_TEX2D_SAMPLER(_SecondTex, _MainTex, i.uv);
                half4 color3 = UNITY_SAMPLE_TEX2D_SAMPLER(_ThirdTex, _MainTex, i.uv);

                // Return the combined color from all three textures.
                return (color1 + color2 + color3) / 3.0;
            }
            ENDHLSL
        }
    }

}

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