Guest User

ToonLitSpecular.shader

a guest
Jul 17th, 2017
5,350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. Shader "Toon/Lit Specular" {
  2. Properties{
  3. _Color("Main Color", Color) = (1,1,1,1)
  4. _SColor("Specular Color", Color) = (1,1,1,1)
  5. _MainTex("Base (RGB)", 2D) = "white" {}
  6. _Ramp("Toon Ramp (RGB)", 2D) = "gray" {}
  7. _RampS("Specular Ramp (RGB)", 2D) = "gray" {} // specular ramp, cutoff point
  8. _SpecSize("Specular Size", Range(0.65,0.999)) = 0.9 // specular size
  9. _SpecOffset("Specular Offset", Range(0.5,1)) = 0.5 // specular offset of the spec Ramp
  10. _TColor("Gradient Overlay Top Color", Color) = (1,1,1,1)
  11. _BottomColor("Gradient Overlay Bottom Color", Color) = (0.23,0,0.95,1)
  12. _Offset("Gradient Offset", Range(-4,4)) = 3.2
  13. [Toggle(RIM)] _RIM("Fresnel Rim?", Float) = 0
  14. _RimColor("Fresnel Rim Color", Color) = (0.49,0.94,0.64,1)
  15. [Toggle(FADE)] _FADE("Fade specular to bottom?", Float) = 0
  16. _TopBottomOffset("Specular Fade Offset", Range(-4,4)) = 3.2
  17. }
  18.  
  19. SubShader{
  20. Tags{ "RenderType" = "Opaque" }
  21. LOD 200
  22.  
  23. CGPROGRAM
  24. #pragma surface surf ToonRamp vertex:vert
  25. #pragma shader_feature FADE // fade toggle
  26. #pragma shader_feature RIM // rim fresnel toggle
  27. sampler2D _Ramp;
  28.  
  29. // custom lighting function that uses a texture ramp based
  30. // on angle between light direction and normal
  31. #pragma lighting ToonRamp exclude_path:prepass
  32. inline half4 LightingToonRamp(SurfaceOutput s, half3 lightDir, half atten)
  33. {
  34. #ifndef USING_DIRECTIONAL_LIGHT
  35. lightDir = normalize(lightDir);
  36. #endif
  37.  
  38. half d = dot(s.Normal, lightDir)*0.5 + 0.5;
  39. half3 ramp = tex2D(_Ramp, float2(d,d)).rgb;
  40.  
  41. half4 c;
  42. c.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
  43. c.a = 0;
  44. return c;
  45. }
  46.  
  47.  
  48. sampler2D _MainTex;
  49. float4 _Color;
  50. float4 _SColor; // specular color
  51. sampler2D _RampS; // specular ramp
  52. float _SpecSize; // specular size
  53. float _SpecOffset; // offset specular ramp
  54. float4 _TColor; // top gradient color
  55. float4 _BottomColor;// bottom gradient color
  56. float _TopBottomOffset; // gradient bottom offset
  57. float _Offset; // specular fade offset
  58. float4 _RimColor; // fresnel rim color
  59.  
  60. struct Input {
  61. float2 uv_MainTex : TEXCOORD0;
  62. float3 lightDir;
  63. float3 worldPos; // world position
  64. float3 viewDir; // view direction from camera
  65. };
  66.  
  67. void vert(inout appdata_full v, out Input o)
  68. {
  69. UNITY_INITIALIZE_OUTPUT(Input, o);
  70. o.lightDir = WorldSpaceLightDir(v.vertex); // get the worldspace lighting direction
  71. }
  72.  
  73. void surf(Input IN, inout SurfaceOutput o) {
  74. float3 localPos = (IN.worldPos - mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz);// local position of the object, with an offset
  75. half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
  76. half d = dot(o.Normal, IN.lightDir)*0.5 + _SpecOffset; // basing on normal and light direction
  77. half3 rampS = tex2D(_RampS, float2(d, d)).rgb; // specular ramp
  78.  
  79. float rim = 1 - saturate(dot(IN.viewDir, o.Normal)); // calculate fresnel rim
  80. #if RIM
  81. o.Emission = _RimColor.rgb * pow(rim, 1.5); // fresnel rim
  82. #endif
  83. o.Albedo = (step(_SpecSize, rampS.r)) * rampS * d* _SColor; // specular
  84. #if FADE
  85. o.Albedo = (step(_SpecSize, rampS.r)) * rampS * d* saturate(localPos.y + _TopBottomOffset) * _SColor; // fade specular to bottom
  86. #endif
  87. o.Albedo += c.rgb*lerp(_BottomColor, _TColor, saturate(localPos.y + _Offset)) * 1.1; // multiply color by gradient lerp
  88. o.Alpha = c.a;
  89. }
  90. ENDCG
  91.  
  92. }
  93.  
  94. Fallback "Diffuse"
  95. }
Advertisement
Add Comment
Please, Sign In to add comment