1 Shader "SubsurfaceScattering" {
2 Properties {
3 _Color ("Main Color", Color) = (1,1,1,1)
4 _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
5 _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
6 _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
7 _TransMap ("Translucency Map",2D) = "white" {}
8 _BumpMap ("Normalmap", 2D) = "bump" {}
9 _TransDistortion ("Tranlucency Distortion",Range(0,0.5)) = 0.1
10 _Trans ("Translucency", Range(0.0, 1.0)) = 1.0
11 _TransPower("Tranlucency Power",Range(1.0,15.0)) = 4.0
12 _TransScale("Translucency Scale",Range(0.0,10.0)) = 2.0
13
14 }
15 SubShader {
16 Tags { "RenderType"="Opaque" }
17 LOD 200
18
19 CGPROGRAM
20 #pragma surface surf TransBlinnPhong
21
22 sampler2D _MainTex;
23 sampler2D _TransMap;
24 sampler2D _BumpMap;
25 float4 _Color;
26 float _Shininess;
27 float _TransDistortion;
28 float _TransPower;
29 float _TransScale;
30 float _Trans;
31
32 struct Input
33 {
34 float2 uv_MainTex;
35 float2 uv_BumpMap;
36 };
37
38 struct TransSurfaceOutput
39 {
40 fixed3 Albedo;
41 fixed3 Normal;
42 fixed3 Emission;
43 half Specular;
44 fixed Gloss;
45 fixed Alpha;
46 fixed3 TransCol;
47 };
48
49 inline fixed4 LightingTransBlinnPhong (TransSurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
50 {
51 half atten2 = (atten * 2);
52
53 fixed3 diffCol;
54 fixed3 specCol;
55 float spec;
56
57 half NL = max(0.0h,dot (s.Normal, lightDir));
58
59 half3 h = normalize (lightDir + viewDir);
60
61 float nh = max (0, dot (s.Normal, h));
62 spec = pow (nh, s.Specular*128.0) * s.Gloss;
63
64 diffCol = (s.Albedo * _LightColor0.rgb * NL) * atten2;
65 specCol = (_LightColor0.rgb * _SpecColor.rgb * spec) * atten2;
66
67 half3 transLight = lightDir + s.Normal * _TransDistortion;
68 float VinvL = saturate(dot(viewDir, -transLight));
69 float transDot = pow(VinvL,_TransPower) * _TransScale;
70 half3 lightAtten = _LightColor0.rgb * atten2;
71 half3 transComponent = lightAtten * (transDot + _Color.rgb) * s.TransCol;
72 diffCol += s.Albedo * transComponent;
73
74 fixed4 c;
75 c.rgb = diffCol + specCol;
76 c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten * _Trans;
77 return c;
78 }
79
80 void surf (Input IN, inout TransSurfaceOutput o)
81 {
82 half4 tex = tex2D(_MainTex, IN.uv_MainTex);
83 o.Albedo = tex.rgb * _Color.rgb;
84 o.Gloss = tex.a;
85 o.Alpha = tex.a * _Color.a * _Trans;
86 o.Specular = _Shininess;
87 o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
88 o.TransCol = tex2D(_TransMap,IN.uv_MainTex).rgb;
89 }
90 ENDCG
91 }
92
93 FallBack "Specular"
94 }