самый простой способ - сделать у текстуры альфаканал (если конечно он не используется) и значение альфы использовать для интерполирования цвета от цвета текстуры до указанного цвета. Если альфаканал используется, то можно взять еще одну текстуру, и использовать какой-то ее канал для данной задачи. Писал как-то похожий шейдер:
Shader "Masked/Diffuse" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Mask ("Mask (Grayscale)", 2D) = "black" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _Mask;
float4 _Color;
struct Input {
float2 uv_MainTex;
float2 uv_Mask;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
float m = tex2D (_Mask, IN.uv_Mask).r;
o.Albedo = (1-m)*c.rgb + m*_Color.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}