Celsheder Unity

Решил реализовать простой селшейдер по туториалу но упёрся в пару ошибок, и никак не могу понять в чём суть дела, буду очень благодарен если кто подскажет.

И так вот статья ,по которой я иду. Автор так же любезно закрепил полную рабочею версию кода шейдера здесь, я проверил и всё работает.

Мой код :

Shader "Unlit/MyCelsheder"{

Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    _ShadowStrength ("Shadow Strength", Range(0, 1)) = 0.5
    _OutlineWidth ("Outline Width", Range(0, 0.1)) = 0.01
}

SubShader
{
    Tags { "RenderType"="Opaque" }
    LOD 100

    Pass
    {
        Tags// освещение с одной стороны от одного Directional Light
        {
            "LightMode"="ForwardBase"
            "PassFlags"="OnlyDirectional"
        }

        Cull Off  // Backface culling

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
            float3 normal : NORMAL;// направление нормали 
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
            float3 worldNormal : NORMAL;// направление нормали 
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;
        float _ShadowStrength;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            o.worldNormal = UnityObjectToWorldNormal(v.normal);// преобразование нормали поверхности из локальных координат в мировые:

            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            // нормализируем вектор нормали
           float3 normal = normalize(i.worldNormal)
           // Считаем Dot Product для нормали и направления к источнику света
           // _WorldSpaceLightPos0 - встроенная переменная Unity
           float NdotL = dot(_WorldSpaceLightPos0, normal);
           // Считаем интенсивность света на поверхности
           // Если поверхность повернута к источнику света (NdotL>0), то она освещена полностью
           // В другом случае Shadow Strength для затенения
           float lightIntensity = NdotL > 0 ? 1 : _ShadowStrength;
           // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv);
            // apply fog
           col *= lightIntensity;
           return col;
        }
        ENDCG
    }

    Pass
    {   
        // Скрываем полигоны, повернутые к камере
        Cull Front

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
        };

        struct v2f
        {
            float4 vertex : SV_POSITION;
        };

        // Объявляем переменные
        half _OutlineWidth;
        static const half4 OUTLINE_COLOR = half4(0,0,0,0);

        v2f vert (appdata v)
        {
            // Смещаем вершины по направлению нормали на заданное расстояние
            v.vertex.xyz += v.normal * _OutlineWidth;

            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);

            return o;
        }

        fixed4 frag () : SV_Target
        {
            // Все пиксели контура имеют один и тот же цвет
            return OUTLINE_COLOR;
        }
    ENDCG
}
 UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
}

}

Ошибка первая :

syntax error: unexpected token 'float'
Compiling Vertex program with UNITY_PASS_FORWARDBASE
Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS 
UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 
UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING 
UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA 
UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR

Вторая :

undeclared identifier 'NdotL'
Compiling Vertex program with UNITY_PASS_FORWARDBASE
Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS 
UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 
UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING 
UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA 
UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_FULL_HDR

Скриншот работы шейдера в юнити: Вот как выглядит это в редакторе

Буду рад помощи любой помощи в понимании сложившейся ситуации поскольку тебя создания шейдеров для меня сложная и я бы хотел рабобратся что происходит а не просто скопировать уже рабочий код.

Спасибо!


Ответы (0 шт):