Синтаксис:
Используется csharp
Shader "Custom/Animation"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DataTex ("Animation", 2D) = "white" {}
_Timeline ("timeline", Range(0,1)) = 0.0
_Scale ("scale", Float) = 100
_TextureSize ("texture size", Float) = 512
_VertexTotal ("vertex total", Float) = 4512
_SamplesTotal ("samples total", Float) = 10
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Name "Main"
Tags { "LightMode" = "Vertex" }
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 diff : COLOR0;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
float4 _MainTex_ST;
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
float2 texcoord1 : TEXCOORD1;
};
#include "AnimationShader.cginc"
v2f vert (appdata v)
{
v2f o;
float4 position = AnimateVertex(v);
o.pos = mul(UNITY_MATRIX_MVP, position);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
o.diff = fixed4(1,1,1,1);//max(0, dot(v.normal,_WorldSpaceLightPos0.xyz));
return o;
}
sampler2D _MainTex;
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D (_MainTex, i.uv) * i.diff;
return texcol;
}
ENDCG
}
// Pass to render object as a shadow caster
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
Fog {Mode Off}
ZWrite On ZTest LEqual Cull Off
Offset 1, 1
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_shadowcaster
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
struct v2f
{
V2F_SHADOW_CASTER;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
struct appdata
{
float4 vertex : POSITION;
float2 texcoord1 : TEXCOORD1;
};
#include "AnimationShader.cginc"
v2f vert( appdata v )
{
v2f o;
v.vertex = AnimateVertex(v);
TRANSFER_SHADOW_CASTER(o)
return o;
}
float4 frag( v2f i ) : COLOR
{
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
}
// Pass to render object as a shadow collector
Pass
{
Name "ShadowCollector"
Tags { "LightMode" = "ShadowCollector" }
Fog {Mode Off}
ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_shadowcollector
#define SHADOW_COLLECTOR_PASS
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 texcoord1 : TEXCOORD1;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
struct v2f
{
V2F_SHADOW_COLLECTOR;
};
#include "AnimationShader.cginc"
v2f vert (appdata v)
{
v2f o;
v.vertex = AnimateVertex(v);
TRANSFER_SHADOW_COLLECTOR(o)
return o;
}
fixed4 frag (v2f i) : COLOR
{
SHADOW_COLLECTOR_FRAGMENT(i)
}
ENDCG
}
}
Fallback "VertexLit"
}
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DataTex ("Animation", 2D) = "white" {}
_Timeline ("timeline", Range(0,1)) = 0.0
_Scale ("scale", Float) = 100
_TextureSize ("texture size", Float) = 512
_VertexTotal ("vertex total", Float) = 4512
_SamplesTotal ("samples total", Float) = 10
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Name "Main"
Tags { "LightMode" = "Vertex" }
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 diff : COLOR0;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
float4 _MainTex_ST;
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
float2 texcoord1 : TEXCOORD1;
};
#include "AnimationShader.cginc"
v2f vert (appdata v)
{
v2f o;
float4 position = AnimateVertex(v);
o.pos = mul(UNITY_MATRIX_MVP, position);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
o.diff = fixed4(1,1,1,1);//max(0, dot(v.normal,_WorldSpaceLightPos0.xyz));
return o;
}
sampler2D _MainTex;
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D (_MainTex, i.uv) * i.diff;
return texcol;
}
ENDCG
}
// Pass to render object as a shadow caster
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
Fog {Mode Off}
ZWrite On ZTest LEqual Cull Off
Offset 1, 1
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_shadowcaster
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
struct v2f
{
V2F_SHADOW_CASTER;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
struct appdata
{
float4 vertex : POSITION;
float2 texcoord1 : TEXCOORD1;
};
#include "AnimationShader.cginc"
v2f vert( appdata v )
{
v2f o;
v.vertex = AnimateVertex(v);
TRANSFER_SHADOW_CASTER(o)
return o;
}
float4 frag( v2f i ) : COLOR
{
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
}
// Pass to render object as a shadow collector
Pass
{
Name "ShadowCollector"
Tags { "LightMode" = "ShadowCollector" }
Fog {Mode Off}
ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_shadowcollector
#define SHADOW_COLLECTOR_PASS
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 texcoord1 : TEXCOORD1;
};
sampler2D _DataTex;
float _Timeline;
float _Scale;
float _TextureSize;
float _VertexTotal;
float _SamplesTotal;
struct v2f
{
V2F_SHADOW_COLLECTOR;
};
#include "AnimationShader.cginc"
v2f vert (appdata v)
{
v2f o;
v.vertex = AnimateVertex(v);
TRANSFER_SHADOW_COLLECTOR(o)
return o;
}
fixed4 frag (v2f i) : COLOR
{
SHADOW_COLLECTOR_FRAGMENT(i)
}
ENDCG
}
}
Fallback "VertexLit"
}
Все бы хорошо, но ShadowCollector не отображается. Если убрать проход Main, то видно некую призрачную фигуру на которую падает тень, а если включить то ничего.