У вас из TEXCOORD0 не вытащится 4-хмерный вектор.
Если считаете что-нить внутри шейдера, просто создавайте
float4, если снаружи - передавайте через материал
vectorВопчем, у меня самого есть шейдер на 4 текстуры, число которых планирую расширить вдвое
. Для тестов я сначала передавал в него снаружи 4 флота (мне нужен был не тайлинг, а скорость скролла по одной оси),
когда все настроил, заменил флоты на вектор, а потом совсем отрубил все и пробил цифры в самом коде. Но все изначально юзалось на одном ювисете.
- Код: Выделить всё
Shader "FictionWare/Tunnel" {
Properties {
_Color ("Main Color", Color) = (1,0.5,0.5,0.5)
_ColorTex ("Texture", 2D) = "white" { }
_Tile01 ("Tile 1", 2D) = "white" { }
_Tile02 ("Tile 2", 2D) = "white" { }
_Tile03 ("Tile 3", 2D) = "white" { }
_Counters ("Counters", Vector) = (1.0,1.0,1.0,1.0) // это внешний счетчик смещения, который передаю в материал
}
SubShader
{
Tags { "RenderType"="Opaque"}
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// #include "UnityCG.cginc"
float4 _Color;
float4 _Counters;
sampler2D _ColorTex;
sampler2D _Tile01;
sampler2D _Tile02;
sampler2D _Tile03;
struct appdata {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
float4 color : COLOR;
};
struct v2f {
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
float4 color : COLOR;
};
float4 _ColorTex_ST;
float4 _Tile01_ST;
float4 _Tile02_ST;
float4 _Tile03_ST;
v2f vert (appdata v) {
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = float4( v.texcoord.xy, 0, 0 );
// o.uv = TRANSFORM_TEX (v.texcoord, _Tile01);
o.color = v.color;
return o;
}
half4 frag( v2f i ) : COLOR
{
float2 uvs = i.uv;
half4 texcol = tex2D (_Tile01, float2(uvs.x + _Counters.y, uvs.y));
texcol += tex2D (_Tile02, float2(uvs.x + _Counters.z, uvs.y));
texcol += tex2D (_Tile03, float2(uvs.x + _Counters.w, uvs.y));
texcol += tex2D (_ColorTex, float2(0.2 * (uvs.x + _Counters.x), uvs.y + 0.2 *_Counters.x));
return i.color * texcol * _Color;
}
ENDCG
}
}
}