|
|
- // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
-
- #ifndef SPEEDTREE_COMMON_INCLUDED
- #define SPEEDTREE_COMMON_INCLUDED
-
- #include "UnityCG.cginc"
-
- #define SPEEDTREE_Y_UP
-
- #ifdef GEOM_TYPE_BRANCH_DETAIL
- #define GEOM_TYPE_BRANCH
- #endif
-
- #include "SpeedTreeVertexDepth.cginc"
-
- // Define Input structure
-
- struct Input
- {
- fixed4 color;
- half3 interpolator1;
- #ifdef GEOM_TYPE_BRANCH_DETAIL
- half3 interpolator2;
- #endif
- UNITY_DITHER_CROSSFADE_COORDS
- half depth;
- half ShadowDepth;
- float4 screenUV;
- };
-
- // Define uniforms
- float4 _ShadowCameraPosition;
- #define mainTexUV interpolator1.xy
- //sampler2D _MainTex;
-
- #ifdef GEOM_TYPE_BRANCH_DETAIL
- #define Detail interpolator2
- sampler2D _DetailTex;
- #endif
-
- //#if defined(GEOM_TYPE_FROND) || defined(GEOM_TYPE_LEAF) || defined(GEOM_TYPE_FACING_LEAF)
- // #define SPEEDTREE_ALPHATEST
- // fixed _Cutoff;
- //#endif
-
- #ifdef EFFECT_HUE_VARIATION
- #define HueVariationAmount interpolator1.z
- half4 _HueVariation;
- #endif
-
- #if defined(EFFECT_BUMP) && !defined(LIGHTMAP_ON)
- sampler2D _BumpMap;
- #endif
-
- //fixed4 _Color;
-
- // Vertex processing
-
- void SpeedTreeVert(inout SpeedTreeVB IN, out Input OUT)
- {
- UNITY_INITIALIZE_OUTPUT(Input, OUT);
- OUT.depth = -(UnityObjectToViewPos(IN.vertex).z/* * _ProjectionParams.w*/);
- float4 pos = UnityObjectToClipPos(IN.vertex);
- OUT.screenUV = ComputeScreenPos(pos);
- OUT.ShadowDepth = length(mul(unity_ObjectToWorld, IN.vertex).xyz - _ShadowCameraPosition.xyz);
- OUT.mainTexUV = IN.texcoord.xy;
- //OUT.color = _Color;
- // OUT.color.rgb *= IN.color.r; // ambient occlusion factor
-
- #ifdef EFFECT_HUE_VARIATION
- float hueVariationAmount = frac(unity_ObjectToWorld[0].w + unity_ObjectToWorld[1].w + unity_ObjectToWorld[2].w);
- hueVariationAmount += frac(IN.vertex.x + IN.normal.y + IN.normal.x) * 0.5 - 0.3;
- OUT.HueVariationAmount = saturate(hueVariationAmount * _HueVariation.a);
- #endif
-
- #ifdef GEOM_TYPE_BRANCH_DETAIL
- // The two types are always in different sub-range of the mesh so no interpolation (between detail and blend) problem.
- OUT.Detail.xy = IN.texcoord2.xy;
- if (IN.color.a == 0) // Blend
- OUT.Detail.z = IN.texcoord2.z;
- else // Detail texture
- OUT.Detail.z = 2.5f; // stay out of Blend's .z range
- #endif
-
- OffsetSpeedTreeVertex(IN, unity_LODFade.x);
-
- UNITY_TRANSFER_DITHER_CROSSFADE(OUT, IN.vertex)
- }
-
- // Fragment processing
-
- #if defined(EFFECT_BUMP) && !defined(LIGHTMAP_ON)
- #define SPEEDTREE_DATA_NORMAL fixed3 Normal;
- #define SPEEDTREE_COPY_NORMAL(to, from) to.Normal = from.Normal;
- #else
- #define SPEEDTREE_DATA_NORMAL
- #define SPEEDTREE_COPY_NORMAL(to, from)
- #endif
-
- #define SPEEDTREE_COPY_FRAG(to, from) \
- to.Alpha = from.Alpha; \
- SPEEDTREE_COPY_NORMAL(to, from)
-
- struct SpeedTreeFragOut
- {
- // fixed3 Albedo;
- fixed Alpha;
- SPEEDTREE_DATA_NORMAL
- };
-
- void SpeedTreeFrag(Input IN, out SpeedTreeFragOut OUT)
- {
- half4 diffuseColor = tex2D(_MainTex, IN.mainTexUV);
-
- OUT.Alpha = diffuseColor.a * _Color.a;
-
-
- #ifdef SPEEDTREE_ALPHATEST
- clip(OUT.Alpha - _Cutoff);
- #endif
-
- // UNITY_APPLY_DITHER_CROSSFADE(IN)
-
- //OUT.Normal = float3(0, 0, 1);
- // OUT.Albedo = 0;
-
-
- }
-
- #endif // SPEEDTREE_COMMON_INCLUDED
|