Advertisement
dnnkeeper

SpeedTreeLightMapped shader

Jul 7th, 2016
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.18 KB | None | 0 0
  1. Shader "Nature/SpeedTreeLightMapped"
  2. {
  3.     Properties
  4.     {
  5.         _Color ("Main Color", Color) = (1,1,1,1)
  6.         _SpecColor ("Specular Color", Color) = (0,0,0,0)
  7.         _HueVariation ("Hue Variation", Color) = (1.0,0.5,0.0,0.1)
  8.         _Shininess ("Shininess", Range (0.01, 1)) = 0.1
  9.         _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
  10.         _DetailTex ("Detail", 2D) = "black" {}
  11.         _BumpMap ("Normal Map", 2D) = "bump" {}
  12.         _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333
  13.         [MaterialEnum(Off,0,Front,1,Back,2)] _Cull ("Cull", Int) = 2
  14.         [MaterialEnum(None,0,Fastest,1,Fast,2,Better,3,Best,4,Palm,5)] _WindQuality ("Wind Quality", Range(0,5)) = 0
  15.     }
  16.  
  17.     // targeting SM3.0+
  18.     SubShader
  19.     {
  20.         Tags
  21.         {
  22.             "Queue"="Geometry"
  23.             "IgnoreProjector"="True"
  24.             "RenderType"="Opaque"
  25.             "DisableBatching"="LODFading"
  26.         }
  27.         LOD 400
  28.         Cull [_Cull]
  29.  
  30.         CGPROGRAM
  31.             #pragma surface surf Lambert vertex:SpeedTreeVert
  32.             #pragma target 4.0
  33.             #pragma multi_compile __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
  34.             #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  35.             #pragma shader_feature EFFECT_BUMP
  36.             #pragma shader_feature EFFECT_HUE_VARIATION
  37.             #define ENABLE_WIND
  38.             #include "SpeedTreeCommon.cginc"
  39.  
  40.             void SpeedTreeFrag2(Input IN, out SpeedTreeFragOut OUT)
  41.             {
  42.                 UNITY_APPLY_DITHER_CROSSFADE(IN)
  43.  
  44.                 half4 diffuseColor = tex2D(_MainTex, IN.mainTexUV);
  45.  
  46.                 OUT.Alpha = diffuseColor.a * _Color.a;
  47.                 #ifdef SPEEDTREE_ALPHATEST
  48.                     clip(OUT.Alpha - _Cutoff);
  49.                 #endif
  50.  
  51.                 #ifdef GEOM_TYPE_BRANCH_DETAIL
  52.                     half4 detailColor = tex2D(_DetailTex, IN.Detail.xy);
  53.                     diffuseColor.rgb = lerp(diffuseColor.rgb, detailColor.rgb, IN.Detail.z < 2.0f ? saturate(IN.Detail.z) : detailColor.a);
  54.                 #endif
  55.  
  56.                 #ifdef EFFECT_HUE_VARIATION
  57.                     half3 shiftedColor = lerp(diffuseColor.rgb, _HueVariation.rgb, IN.HueVariationAmount);
  58.                     half maxBase = max(diffuseColor.r, max(diffuseColor.g, diffuseColor.b));
  59.                     half newMaxBase = max(shiftedColor.r, max(shiftedColor.g, shiftedColor.b));
  60.                     maxBase /= newMaxBase;
  61.                     maxBase = maxBase * 0.5f + 0.5f;
  62.                     // preserve vibrance
  63.                     shiftedColor.rgb *= maxBase;
  64.                     diffuseColor.rgb = saturate(shiftedColor);
  65.                 #endif
  66.  
  67.                 OUT.Albedo = 0;//diffuseColor.rgb * IN.color.rgb;
  68.                 OUT.Gloss = 1;//diffuseColor.a;
  69.                 OUT.Specular = 1;//_Shininess;
  70.  
  71.                 #ifdef EFFECT_BUMP
  72.                     OUT.Normal = UnpackNormal(tex2D(_BumpMap, IN.mainTexUV));
  73.                 #endif
  74.             }
  75.  
  76.  
  77.  
  78.             inline fixed4 UnityLambertLight2 (SurfaceOutput s, UnityLight light)
  79.             {
  80.                 fixed diff = max (0, dot (s.Normal, light.dir));
  81.                
  82.                 fixed4 c;
  83.                 c.rgb = s.Albedo * light.color * diff;
  84.                 c.a = s.Alpha;
  85.                 return c;
  86.             }
  87.  
  88.             inline fixed4 LightingLambert2 (SurfaceOutput s, UnityGI gi)
  89.             {
  90.                 fixed4 c;
  91.                 c = UnityLambertLight2 (s, gi.light);
  92.  
  93.                 #if defined(DIRLIGHTMAP_SEPARATE)
  94.                     #ifdef LIGHTMAP_ON
  95.                         c += UnityLambertLight2 (s, gi.light2);
  96.                     #endif
  97.                     #ifdef DYNAMICLIGHTMAP_ON
  98.                         c += UnityLambertLight2 (s, gi.light3);
  99.                     #endif
  100.                 #endif
  101.  
  102.                 #ifdef UNITY_LIGHT_FUNCTION_APPLY_INDIRECT
  103.                     c.rgb += s.Albedo * gi.indirect.diffuse;
  104.                 #endif
  105.  
  106.                 return c;
  107.             }
  108.  
  109.             inline half4 LightingLambert2_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal)
  110.             {
  111.                 outDiffuseOcclusion = half4(s.Albedo, 1);
  112.                 outSpecSmoothness = 0.0;
  113.                 outNormal = half4(s.Normal * 0.5 + 0.5, 1);
  114.                 /*
  115.                 half4 emission = half4(s.Emission, 1);
  116.  
  117.                 #ifdef UNITY_LIGHT_FUNCTION_APPLY_INDIRECT
  118.                     emission.rgb += s.Albedo * gi.indirect.diffuse;
  119.                 #endif
  120.  
  121.                 return emission;
  122.                 */
  123.                 return 0;
  124.             }
  125.  
  126.             inline void LightingLambert2_GI (
  127.                 SurfaceOutput s,
  128.                 UnityGIInput data,
  129.                 inout UnityGI gi)
  130.             {
  131.                 gi = UnityGlobalIllumination (data, 1.0, s.Normal);
  132.             }
  133.  
  134.             inline fixed4 LightingLambert2_PrePass (SurfaceOutput s, half4 light)
  135.             {
  136.                 fixed4 c;
  137.                 c.rgb = s.Albedo * light.rgb;
  138.                 c.a = s.Alpha;
  139.                 return c;
  140.             }
  141.  
  142.             void surf(Input IN, inout SurfaceOutput OUT)
  143.             {
  144.                 SpeedTreeFragOut o;
  145.                 SpeedTreeFrag(IN, o);
  146.                 SPEEDTREE_COPY_FRAG(OUT, o)
  147.                 //OUT.Albedo = 1;
  148.                 //OUT.Normal = o.Normal;
  149.                 //OUT.Emission = 0;
  150.                 //OUT.Gloss = 0;
  151.                 //OUT.Specular = 0;
  152.                 //OUT.Alpha = 0;
  153.             }
  154.         ENDCG
  155.        
  156.         Pass
  157.         {
  158.             Tags { "LightMode" = "ShadowCaster" }
  159.  
  160.             CGPROGRAM
  161.                 #pragma vertex vert
  162.                 #pragma fragment frag
  163.                 #pragma target 3.0
  164.                 #pragma multi_compile __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
  165.                 #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  166.                 #pragma multi_compile_shadowcaster
  167.                 #define ENABLE_WIND
  168.                 #include "SpeedTreeCommon.cginc"
  169.  
  170.                 struct v2f
  171.                 {
  172.                     V2F_SHADOW_CASTER;
  173.                     #ifdef SPEEDTREE_ALPHATEST
  174.                         half2 uv : TEXCOORD1;
  175.                     #endif
  176.                     UNITY_DITHER_CROSSFADE_COORDS_IDX(2)
  177.                 };
  178.  
  179.                 v2f vert(SpeedTreeVB v)
  180.                 {
  181.                     v2f o;
  182.                     #ifdef SPEEDTREE_ALPHATEST
  183.                         o.uv = v.texcoord.xy;
  184.                     #endif
  185.                     OffsetSpeedTreeVertex(v, unity_LODFade.x);
  186.                     TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
  187.                     UNITY_TRANSFER_DITHER_CROSSFADE_HPOS(o, o.pos)
  188.  
  189.                     return o;
  190.                 }
  191.  
  192.                 float4 frag(v2f i) : SV_Target
  193.                 {
  194.                     #ifdef SPEEDTREE_ALPHATEST
  195.                         clip(tex2D(_MainTex, i.uv).a * _Color.a - _Cutoff);
  196.                     #endif
  197.                     UNITY_APPLY_DITHER_CROSSFADE(i)
  198.                     SHADOW_CASTER_FRAGMENT(i)
  199.                 }
  200.             ENDCG
  201.         }
  202.  
  203.         Pass
  204.         {
  205.             Tags { "LightMode" = "Vertex" }
  206.  
  207.             CGPROGRAM
  208.                 #pragma vertex vert
  209.                 #pragma fragment frag
  210.                 #pragma target 3.0
  211.                 #pragma multi_compile_fog
  212.                 #pragma multi_compile __ LOD_FADE_PERCENTAGE LOD_FADE_CROSSFADE
  213.                 #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  214.                 #pragma shader_feature EFFECT_HUE_VARIATION
  215.                 #define ENABLE_WIND
  216.                 #include "SpeedTreeCommon.cginc"
  217.  
  218.                 struct v2f
  219.                 {
  220.                     float4 vertex   : SV_POSITION;
  221.                     UNITY_FOG_COORDS(0)
  222.                     Input data      : TEXCOORD1;
  223.                 };
  224.  
  225.                 v2f vert(SpeedTreeVB v)
  226.                 {
  227.                     v2f o;
  228.                     SpeedTreeVert(v, o.data);
  229.                     o.data.color.rgb *= ShadeVertexLightsFull(v.vertex, v.normal, 4, true);
  230.                     o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  231.                     UNITY_TRANSFER_FOG(o,o.vertex);
  232.                     return o;
  233.                 }
  234.  
  235.                 fixed4 frag(v2f i) : SV_Target
  236.                 {
  237.                     SpeedTreeFragOut o;
  238.                     SpeedTreeFrag(i.data, o);
  239.                     fixed4 c = fixed4(o.Albedo, o.Alpha);
  240.                     UNITY_APPLY_FOG(i.fogCoord, c);
  241.                     return c;
  242.                 }
  243.             ENDCG
  244.         }
  245.        
  246.     }
  247.    
  248.     // targeting SM2.0: Cross-fading, Normal-mapping, Hue variation and Wind animation are turned off for less instructions
  249.     SubShader
  250.     {
  251.         Tags
  252.         {
  253.             "Queue"="Geometry"
  254.             "IgnoreProjector"="True"
  255.             "RenderType"="Opaque"
  256.             "DisableBatching"="LODFading"
  257.         }
  258.         LOD 400
  259.         Cull [_Cull]
  260.  
  261.         CGPROGRAM
  262.             #pragma surface surf Lambert vertex:SpeedTreeVert nolightmap
  263.             #pragma multi_compile __ LOD_FADE_PERCENTAGE
  264.             #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  265.             #include "SpeedTreeCommon.cginc"
  266.  
  267.             void surf(Input IN, inout SurfaceOutput OUT)
  268.             {
  269.                 SpeedTreeFragOut o;
  270.                 SpeedTreeFrag(IN, o);
  271.                 SPEEDTREE_COPY_FRAG(OUT, o)
  272.             }
  273.         ENDCG
  274.  
  275.         Pass
  276.         {
  277.             Tags { "LightMode" = "ShadowCaster" }
  278.  
  279.             CGPROGRAM
  280.                 #pragma vertex vert
  281.                 #pragma fragment frag
  282.                 #pragma multi_compile __ LOD_FADE_PERCENTAGE
  283.                 #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  284.                 #pragma multi_compile_shadowcaster
  285.                 #include "SpeedTreeCommon.cginc"
  286.  
  287.                 struct v2f
  288.                 {
  289.                     V2F_SHADOW_CASTER;
  290.                     #ifdef SPEEDTREE_ALPHATEST
  291.                         half2 uv : TEXCOORD1;
  292.                     #endif
  293.                 };
  294.  
  295.                 v2f vert(SpeedTreeVB v)
  296.                 {
  297.                     v2f o;
  298.                     #ifdef SPEEDTREE_ALPHATEST
  299.                         o.uv = v.texcoord.xy;
  300.                     #endif
  301.                     OffsetSpeedTreeVertex(v, unity_LODFade.x);
  302.                     TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
  303.                     return o;
  304.                 }
  305.  
  306.                 float4 frag(v2f i) : SV_Target
  307.                 {
  308.                     #ifdef SPEEDTREE_ALPHATEST
  309.                         clip(tex2D(_MainTex, i.uv).a * _Color.a - _Cutoff);
  310.                     #endif
  311.                     SHADOW_CASTER_FRAGMENT(i)
  312.                 }
  313.             ENDCG
  314.         }
  315.  
  316.         Pass
  317.         {
  318.             Tags { "LightMode" = "Vertex" }
  319.  
  320.             CGPROGRAM
  321.                 #pragma vertex vert
  322.                 #pragma fragment frag
  323.                 #pragma multi_compile_fog
  324.                 #pragma multi_compile __ LOD_FADE_PERCENTAGE
  325.                 #pragma shader_feature GEOM_TYPE_BRANCH GEOM_TYPE_BRANCH_DETAIL GEOM_TYPE_FROND GEOM_TYPE_LEAF GEOM_TYPE_MESH
  326.                 #include "SpeedTreeCommon.cginc"
  327.  
  328.                 struct v2f
  329.                 {
  330.                     float4 vertex   : SV_POSITION;
  331.                     UNITY_FOG_COORDS(0)
  332.                     Input data      : TEXCOORD1;
  333.                 };
  334.  
  335.                 v2f vert(SpeedTreeVB v)
  336.                 {
  337.                     v2f o;
  338.                     SpeedTreeVert(v, o.data);
  339.                     o.data.color.rgb *= ShadeVertexLightsFull(v.vertex, v.normal, 2, false);
  340.                     o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  341.                     UNITY_TRANSFER_FOG(o,o.vertex);
  342.                     return o;
  343.                 }
  344.  
  345.                 fixed4 frag(v2f i) : SV_Target
  346.                 {
  347.                     SpeedTreeFragOut o;
  348.                     SpeedTreeFrag(i.data, o);
  349.                     fixed4 c = fixed4(o.Albedo, o.Alpha);
  350.                     UNITY_APPLY_FOG(i.fogCoord, c);
  351.                     return c;
  352.                 }
  353.             ENDCG
  354.         }
  355.     }
  356.    
  357.     FallBack "Transparent/Cutout/VertexLit"
  358.     CustomEditor "SpeedTreeMaterialInspector"
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement