95 lines
3.2 KiB
Plaintext
95 lines
3.2 KiB
Plaintext
Shader "Custom/SculptedHair" {
|
|
Properties {
|
|
_Color ("Main Color", Color) = (1,1,1,1)
|
|
_HighlightColor ("Highlight Color", Color) = (1,1,1,1)
|
|
_HighlightColor2 ("Highlight Color", Color) = (1,1,1,1)
|
|
_MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
|
|
_MetallicSmooth ("Metallic (RGB) _Smooth (A)", 2D) = "white" {}
|
|
_BumpMap ("Normal (Normal)", 2D) = "bump" {}
|
|
_AnisoTex ("Anisotropic Direction (Normal)", 2D) = "bump" {}
|
|
_AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2
|
|
_AnisoOffset2 ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2
|
|
_Gloss ("Gloss", Range(0,1)) = 0.2
|
|
_Gloss2 ("Gloss2", Range(0,1)) = 0.2
|
|
_Specularity ("Specularity", Range(0,1)) = 0.2
|
|
_Specularity2 ("Specularity2", Range(0,1)) = 0.2
|
|
_Reflection ("Reflection", Range(0,1)) = 0.2
|
|
_value ("value", Float) = 0.0
|
|
}
|
|
|
|
SubShader{
|
|
Tags { "RenderType" = "Opaque" }
|
|
|
|
CGPROGRAM
|
|
#pragma surface surf Aniso fullforwardshadows addshadow
|
|
#pragma target 3.0
|
|
|
|
struct Input
|
|
{
|
|
float2 uv_MainTex;
|
|
float2 uv_AnisoTex;
|
|
};
|
|
|
|
struct SurfaceOutputAniso {
|
|
fixed3 Albedo;
|
|
fixed3 Ramp;
|
|
fixed3 Emission;
|
|
fixed3 Normal;
|
|
fixed4 AnisoDir;
|
|
fixed Alpha;
|
|
fixed Smoothness;
|
|
};
|
|
|
|
fixed4 _Color;
|
|
fixed4 _HighlightColor;
|
|
fixed4 _HighlightColor2;
|
|
fixed _AnisoOffset;
|
|
fixed _AnisoOffset2;
|
|
float _value;
|
|
fixed _Gloss, _Gloss2, _Specularity, _Specularity2, _Reflection;
|
|
|
|
sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex, _MetallicSmooth;
|
|
|
|
inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten)
|
|
{
|
|
fixed3 h = normalize(normalize(lightDir) + normalize(viewDir));
|
|
float NdotL = saturate(dot(s.Normal, lightDir));
|
|
|
|
fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h);
|
|
float aniso = max(0, sin(radians((HdotA + _AnisoOffset + (s.Smoothness*0.1)) * 180 )));
|
|
float aniso2 = max(0, sin(radians((HdotA + _AnisoOffset2 + (s.Smoothness*0.1)) * 180 )));
|
|
|
|
float spec = saturate(dot(s.Normal, h));
|
|
float spec2 = spec;
|
|
|
|
spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), _Gloss * 128) * _Specularity);
|
|
spec2 = saturate(pow(lerp(spec2, aniso2, s.AnisoDir.a), _Gloss2 * 128) * _Specularity2);
|
|
|
|
|
|
float4 refColor = 1.0;
|
|
float3 refDir = reflect(-viewDir, s.Normal);
|
|
float4 reflection = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, refDir);
|
|
refColor.rgb = DecodeHDR(reflection, unity_SpecCube0_HDR);
|
|
refColor.a = 1.0;
|
|
|
|
fixed4 c;
|
|
c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (lerp(_HighlightColor.rgb, refColor.rgb, _Reflection) * spec * NdotL)) * (atten * 2);
|
|
c.rgb += lerp(_HighlightColor2.rgb, refColor.rgb, _Reflection) * spec2 * NdotL;
|
|
c.a = 1;
|
|
return c;
|
|
}
|
|
|
|
void surf (Input IN, inout SurfaceOutputAniso o)
|
|
{
|
|
fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex) * _Color;
|
|
o.Smoothness = tex2D(_MetallicSmooth, IN.uv_MainTex).a;
|
|
o.Albedo = albedo.rgb;
|
|
o.Alpha = albedo.a;
|
|
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
|
|
o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, 1);
|
|
}
|
|
ENDCG
|
|
}
|
|
FallBack "Diffuse"
|
|
}
|