You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

130 lines
3.3 KiB

// 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