CTI_LOD_Billboard.shader 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. Shader "CTI/LOD Billboard" {
  2. Properties{
  3. [Space(5)]
  4. _HueVariation ("Color Variation (RGB) Strength (A)", Color) = (0.9,0.5,0.0,0.1)
  5. [Space(5)]
  6. [NoScaleOffset] _MainTex ("Albedo (RGB) Alpha/Occlusion (A)", 2D) = "white" {}
  7. _Cutoff ("Alpha Cutoff", Range(0,0.45)) = 0.3
  8. _AlphaLeak ("Alpha Leak Suppression", Range(0.5,1.0)) = 0.6
  9. [Space(5)]
  10. [NoScaleOffset] _BumpTex ("Normal (AG) Translucency(R) Smoothness(B)", 2D) = "bump" {}
  11. _SpecColor ("Specular", Color) = (0.2,0.2,0.2)
  12. [Space(5)]
  13. _TranslucencyStrength ("Translucency Strength", Range(0,1)) = .5
  14. _ViewDependency ("View Dependency", Range(0,1)) = 0.8
  15. _TreeHeightLimit ("Tree Height Limit", Range(0,1)) = 1
  16. [Header(Wind)]
  17. [Space(3)]
  18. [Toggle(_EMISSION)] _UseWind ("Enable Wind", Float) = 0.0
  19. [Space(5)]
  20. _WindStrength ("Wind Strength", Float) = 1.0
  21. //[Space(10)]
  22. //_NormalFactor("Normal Factor (XYZ) ", Vector) = (2.6,2.6,2.6,0.0)
  23. [HideInInspector] _TreeScale ("Tree Scale", Range(0,50)) = 1
  24. [HideInInspector] _TreeWidth ("Tree Width Factor", Range(0,1)) = 1
  25. }
  26. SubShader{
  27. Tags{
  28. "Queue" = "AlphaTest"
  29. "IgnoreProjector" = "True"
  30. "RenderType" = "CTI-Billboard"
  31. "DisableBatching" = "LODFading"
  32. }
  33. LOD 200
  34. Cull Off
  35. CGPROGRAM
  36. #pragma surface surf StandardTranslucent vertex:BillboardVertInit nolightmap nodynlightmap keepalpha addshadow noinstancing dithercrossfade
  37. // addshadow
  38. #pragma target 3.0
  39. #pragma multi_compile __ LOD_FADE_CROSSFADE
  40. #pragma shader_feature _EMISSION
  41. #define IS_LODTREE
  42. #include "Includes/CTI_BillboardVertex.cginc"
  43. #include "Includes/CTI_TranslucentLighting.cginc"
  44. sampler2D _MainTex;
  45. sampler2D _BumpTex;
  46. float _Cutoff;
  47. float _AlphaLeak;
  48. half4 _HueVariation;
  49. half _TranslucencyStrength;
  50. half _ViewDependency;
  51. // All other inputs moved to include
  52. void BillboardVertInit(inout appdata_bb v, out Input o) {
  53. UNITY_INITIALIZE_OUTPUT(Input,o);
  54. AFSBillboardVert(v);
  55. o.uv_MainTex = v.texcoord;
  56. o.color.rgb = v.color.rgb;
  57. UNITY_TRANSFER_DITHER_CROSSFADE(o, v.vertex)
  58. }
  59. void surf(Input IN, inout SurfaceOutputStandardTranslucent o) {
  60. #if UNITY_VERSION < 2017
  61. UNITY_APPLY_DITHER_CROSSFADE(IN)
  62. #endif
  63. fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
  64. clip(c.a - _Cutoff);
  65. o.Albedo = c.rgb;
  66. // Add Color Variation
  67. o.Albedo = lerp(o.Albedo, (o.Albedo + _HueVariation.rgb) * 0.5, IN.color.r * _HueVariation.a);
  68. float4 normal = tex2D(_BumpTex, IN.uv_MainTex);
  69. o.Normal.xy = normal.ag * 2 - 1;
  70. o.Normal.z = sqrt(1 - saturate(dot(o.Normal.xy, o.Normal.xy)));
  71. // breaks translucency...
  72. // o.Normal = lerp(o.Normal, normalize(o.Normal + float3(0,0.975,0.0) ), IN.color.b);
  73. o.Translucency = (normal.r) * _TranslucencyStrength;
  74. o.ScatteringPower = _ViewDependency;
  75. o.Specular = _SpecColor;
  76. o.Smoothness = normal.b;
  77. c.a = (c.a <= _AlphaLeak) ? 1 : c.a; // Eliminate alpha leaking into ao
  78. o.Occlusion = c.a * 2 - 1;
  79. }
  80. ENDCG
  81. // Pass to render object as a shadow caster
  82. /* Pass{
  83. Name "ShadowCaster"
  84. Tags{ "LightMode" = "ShadowCaster" }
  85. // Cull Front
  86. CGPROGRAM
  87. #pragma vertex vert_surf
  88. #pragma fragment frag_surf
  89. #pragma target 3.0
  90. #pragma multi_compile_shadowcaster
  91. #pragma multi_compile __ LOD_FADE_CROSSFADE
  92. #include "HLSLSupport.cginc"
  93. #include "UnityCG.cginc"
  94. #include "Lighting.cginc"
  95. #define UNITY_PASS_SHADOWCASTER
  96. #include "Includes/CTI_BillboardVertex.cginc"
  97. sampler2D _MainTex;
  98. struct v2f_surf {
  99. V2F_SHADOW_CASTER;
  100. float2 hip_pack0 : TEXCOORD1;
  101. //#ifdef LOD_FADE_CROSSFADE
  102. // half3 ditherScreenPos : TEXCOORD2;
  103. //#endif
  104. UNITY_DITHER_CROSSFADE_COORDS_IDX(2)
  105. };
  106. float4 _MainTex_ST;
  107. v2f_surf vert_surf(appdata_bb v) {
  108. v2f_surf o;
  109. AFSBillboardVert(v);
  110. o.hip_pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
  111. //UNITY_TRANSFER_DITHER_CROSSFADE(o, v.vertex)
  112. TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
  113. UNITY_TRANSFER_DITHER_CROSSFADE_HPOS(o, o.pos)
  114. return o;
  115. }
  116. fixed _Cutoff;
  117. float4 frag_surf(v2f_surf IN) : SV_Target{
  118. UNITY_APPLY_DITHER_CROSSFADE(IN)
  119. half alpha = tex2D(_MainTex, IN.hip_pack0.xy).a;
  120. // alpha = (unity_LODFade.x > 0) ? alpha * unity_LODFade.x : alpha;
  121. clip(alpha - _Cutoff);
  122. SHADOW_CASTER_FRAGMENT(IN)
  123. }
  124. ENDCG
  125. } */
  126. ///
  127. }
  128. FallBack "Transparent/Cutout/VertexLit"
  129. }