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
Скриншот работы шейдера в юнити:

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