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

Пример простого шейдера диффузного освещения во встроенном Render Pipeline

Кошачий персонаж освещен с помощью простого диффузного освещения, поэтому поверхности, обращенные в сторону от света, намного темнее.
Кошачий персонаж освещен с помощью простого диффузного освещения, поэтому поверхности, обращенные в сторону от света, намного темнее.

Сначала необходимо указать, что шейдеру действительно должны передаваться сведения об освещении. Конвейер рендеринга Unity поддерживает различные способы рендеринга; здесь используется заданный по умолчанию вариант прямого рендеринга.

Начнем с поддержки только одного направленного света. Форвардное рендеринг в Unity работает путем рендеринга основного направленного света, окружающего света, lightmaps и отражений в одном проходе, называемом ForwardBase. В шейдере это указывается добавлением проход: Tags {“LightMode”=“ForwardBase”}. Это сделает данные направленного света, передаваемые в шейдер через некоторые встроенные переменные.

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

Shader "Lit/Simple Diffuse"
{
    Properties
    {
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            // indicate that our pass is the "base" pass in forward
            // rendering pipeline. It gets ambient and main directional
            // light data set up; light direction in _WorldSpaceLightPos0
            // and color in _LightColor0
            Tags {"LightMode"="ForwardBase"}
        
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc" // for UnityObjectToWorldNormal
            #include "UnityLightingCommon.cginc" // for _LightColor0

            struct v2f
            {
                float2 uv : TEXCOORD0;
                fixed4 diff : COLOR0; // diffuse lighting color
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                // get vertex normal in world space
                half3 worldNormal = UnityObjectToWorldNormal(v.normal);
                // dot product between normal and light direction for
                // standard diffuse (Lambert) lighting
                half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
                // factor in the light color
                o.diff = nl * _LightColor0;
                return o;
            }
            
            sampler2D _MainTex;

            fixed4 frag (v2f i) : SV_Target
            {
                // sample texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // multiply by lighting
                col *= i.diff;
                return col;
            }
            ENDHLSL
        }
    }
}

Это заставляет объект реагировать на направление света — части его, обращенные к свету, освещаются, а части, обращенные в сторону, не освещаются вообще.