今天记录一下如何实现随风摇摆的植物,之前项目里面的植物摇摆实现是使用骨骼动画实现的,这种方式太消耗性能,植物这种东西没必要,直接使用顶点动画即可。
准备
植物不需要使用标准的PBR流程,基础的颜色贴图加上法向贴图即可,它不区分金属非金属,精致一些可以加一个粗糙度贴图和AO。
我使用的植物模型还区分了树干和树也,通过顶点色的alpha通道去区分,这样可以在一个材质里面使用两套贴图。
首先看一下资源:
贴图有一张flowmap用于处理顶点动画,一张基础色贴图,一张法向贴图
顶点色 R通道用于区分可以摆动的幅度的强弱,越靠近地面,摆动越弱,这个用于控制整个树木的大范围的摇动效果
G通道用于处理树叶的摆动幅度的强弱,越靠近树干,摆动越弱,这个用于控制树叶的摆动
这两个通道一起混合使用,用来实现顶点动画。
B通道没有内容
A通道用于区分树干和树叶 白色的是树干,黑色的是树叶
渲染实现
渲染使用ASE连连看连出来先
树叶是面片,需要双面渲染的,所以我们需要将剔除模式Cull 设置为OFF
树叶的形状我们使用树叶的alpha通道进行裁剪,所以需要使用透明检测
基础颜色,通过A通道进行lerp插值,将树叶和树干插值出来,还需要透明度进行透明裁剪
法向这里也是使用了相同的方式,lerp插值,但是注意,由于树叶使用了双面渲染,背面法向是错误的,我们需要将法向的Z轴进行翻转(Z轴在切线空间里面是和法向朝向平行的)
实现摆动
我们先通过最基础的跟随时间进行摆动,可以自定义方向
Sin函数使用后的曲线图是以下这样的
如果先乘以PI以后再Sin,效果就在1的数值内半个循环,更好的控制
接下来我们将树叶摆动也添加进来,这里是受到顶点色的G通道控制
这里我们使用的cos去运算,它刚好和sin隔开
实现这一部以后,我们实现了一个不错的摆动的效果,但是缺少了一些的随机性,最简单的方法就是添加一张扰动图,使用扰动图去扰动树叶,让树叶有更多的随机性,看起来更自然
下图为使用了扰动图实现的节点,也使用到了顶点动画的G通道控制树叶。
上面的方法还需要额外去采样一张图片,接下来我们使用一种程序化的方法,直接使用一个节点去实现扰动
这个节点是通过UE里面的方式翻译过来的,这里要着重感谢一些Kerry大佬。节点是在Shader Function里面,自行查阅
我们就可以通过调整参数去控制整个树干带着树枝和树叶偏移,还能模拟树叶的摆动,效果挺不错
最后附上ASE代码:
// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X
Shader "Scene_Tree"
{
Properties
{
_Cutoff( "Mask Clip Value", Float ) = 0.5
_BaseMap_Beaf("BaseMap_Beaf", 2D) = "white" {}
_NormalMap_Beaf("NormalMap_Beaf", 2D) = "bump" {}
_BaseMap_Branch("BaseMap_Branch", 2D) = "white" {}
_NormalMap_Branch("NormalMap_Branch", 2D) = "bump" {}
_Roughness("Roughness", Range( 0 , 1)) = 0.5
_GlobalWindSpeed("GlobalWindSpeed", Float) = 1
_GlobalWindIntensity("GlobalWindIntensity", Float) = 1
_GlobalWindDirection("GlobalWindDirection", Vector) = (0,0,0,0)
_SmallWindSpeed("SmallWindSpeed", Float) = 1
_SmallWindIntensity("SmallWindIntensity", Float) = 1
_SmallWindDirection("SmallWindDirection", Vector) = (0,0,1,0)
[HideInInspector] _texcoord( "", 2D ) = "white" {}
[HideInInspector] __dirty( "", Int ) = 1
}
SubShader
{
Tags{ "RenderType" = "Opaque" "Queue" = "AlphaTest+0" "DisableBatching" = "True" }
Cull Off
CGINCLUDE
#include "UnityPBSLighting.cginc"
#include "UnityShaderVariables.cginc"
#include "Lighting.cginc"
#pragma target 3.0
#pragma multi_compile_instancing
#ifdef UNITY_PASS_SHADOWCASTER
#undef INTERNAL_DATA
#undef WorldReflectionVector
#undef WorldNormalVector
#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
#endif
struct Input
{
float3 worldPos;
float2 uv_texcoord;
float4 vertexColor : COLOR;
float3 worldNormal;
INTERNAL_DATA
half ASEVFace : VFACE;
};
struct SurfaceOutputCustomLightingCustom
{
half3 Albedo;
half3 Normal;
half3 Emission;
half Metallic;
half Smoothness;
half Occlusion;
half Alpha;
Input SurfInput;
UnityGIInput GIData;
};
uniform float _GlobalWindSpeed;
uniform float _GlobalWindIntensity;
uniform float3 _GlobalWindDirection;
uniform float3 _SmallWindDirection;
uniform float _SmallWindSpeed;
uniform float _SmallWindIntensity;
uniform sampler2D _BaseMap_Beaf;
SamplerState sampler_BaseMap_Beaf;
uniform float4 _BaseMap_Beaf_ST;
uniform sampler2D _BaseMap_Branch;
uniform float4 _BaseMap_Branch_ST;
uniform sampler2D _NormalMap_Beaf;
uniform float4 _NormalMap_Beaf_ST;
SamplerState sampler_NormalMap_Beaf;
uniform sampler2D _NormalMap_Branch;
uniform float4 _NormalMap_Branch_ST;
uniform float _Roughness;
uniform float _Cutoff = 0.5;
float3 RotateAroundAxis( float3 center, float3 original, float3 u, float angle )
{
original -= center;
float C = cos( angle );
float S = sin( angle );
float t = 1 - C;
float m00 = t * u.x * u.x + C;
float m01 = t * u.x * u.y - S * u.z;
float m02 = t * u.x * u.z + S * u.y;
float m10 = t * u.x * u.y + S * u.z;
float m11 = t * u.y * u.y + C;
float m12 = t * u.y * u.z - S * u.x;
float m20 = t * u.x * u.z - S * u.y;
float m21 = t * u.y * u.z + S * u.x;
float m22 = t * u.z * u.z + C;
float3x3 finalMatrix = float3x3( m00, m01, m02, m10, m11, m12, m20, m21, m22 );
return mul( finalMatrix, original ) + center;
}
void vertexDataFunc( inout appdata_full v, out Input o )
{
UNITY_INITIALIZE_OUTPUT( Input, o );
float temp_output_34_0 = ( ( _GlobalWindSpeed * _Time.y ) * UNITY_PI );
float temp_output_42_0 = ( _GlobalWindIntensity * 0.1 );
float3 temp_output_7_0_g2 = _SmallWindDirection;
float3 RotateAxis34_g2 = cross( temp_output_7_0_g2 , float3(0,1,0) );
float3 wind_direction31_g2 = temp_output_7_0_g2;
float3 wind_speed40_g2 = ( ( _Time.y * _SmallWindSpeed ) * float3(0.5,-0.5,-0.5) );
float3 ase_worldPos = mul( unity_ObjectToWorld, v.vertex );
float3 temp_cast_0 = (1.0).xxx;
float3 temp_output_22_0_g2 = abs( ( ( frac( ( ( ( wind_direction31_g2 * wind_speed40_g2 ) + ( ase_worldPos / 10.0 ) ) + 0.5 ) ) * 2.0 ) - temp_cast_0 ) );
float3 temp_cast_1 = (3.0).xxx;
float dotResult30_g2 = dot( ( ( temp_output_22_0_g2 * temp_output_22_0_g2 ) * ( temp_cast_1 - ( temp_output_22_0_g2 * 2.0 ) ) ) , wind_direction31_g2 );
float BigTriangleWave42_g2 = dotResult30_g2;
float3 temp_cast_2 = (1.0).xxx;
float3 temp_output_59_0_g2 = abs( ( ( frac( ( ( wind_speed40_g2 + ( ase_worldPos / 2.0 ) ) + 0.5 ) ) * 2.0 ) - temp_cast_2 ) );
float3 temp_cast_3 = (3.0).xxx;
float SmallTriangleWave52_g2 = distance( ( ( temp_output_59_0_g2 * temp_output_59_0_g2 ) * ( temp_cast_3 - ( temp_output_59_0_g2 * 2.0 ) ) ) , float3(0,0,0) );
float3 rotatedValue72_g2 = RotateAroundAxis( ( ase_worldPos - float3(0,0.1,0) ), ase_worldPos, normalize( RotateAxis34_g2 ), ( ( BigTriangleWave42_g2 + SmallTriangleWave52_g2 ) * ( 2.0 * UNITY_PI ) ) );
float3 worldToObj81_g2 = mul( unity_WorldToObject, float4( rotatedValue72_g2, 1 ) ).xyz;
float3 ase_vertex3Pos = v.vertex.xyz;
float3 VertexOffset39 = ( ( ( ( sin( temp_output_34_0 ) * temp_output_42_0 ) * _GlobalWindDirection ) * v.color.r ) + ( v.color.g * ( _GlobalWindDirection * ( cos( temp_output_34_0 ) * temp_output_42_0 ) ) ) + ( v.color.g * ( worldToObj81_g2 - ase_vertex3Pos ) * _SmallWindIntensity ) );
v.vertex.xyz += VertexOffset39;
v.vertex.w = 1;
}
inline half4 LightingStandardCustomLighting( inout SurfaceOutputCustomLightingCustom s, half3 viewDir, UnityGI gi )
{
UnityGIInput data = s.GIData;
Input i = s.SurfInput;
half4 c = 0;
float2 uv_BaseMap_Beaf = i.uv_texcoord * _BaseMap_Beaf_ST.xy + _BaseMap_Beaf_ST.zw;
float4 tex2DNode3 = tex2D( _BaseMap_Beaf, uv_BaseMap_Beaf );
float lerpResult24 = lerp( tex2DNode3.a , 1.0 , i.vertexColor.a);
float Alpha22 = lerpResult24;
SurfaceOutputStandard s2 = (SurfaceOutputStandard ) 0;
float2 uv_BaseMap_Branch = i.uv_texcoord * _BaseMap_Branch_ST.xy + _BaseMap_Branch_ST.zw;
float4 lerpResult6 = lerp( tex2DNode3 , tex2D( _BaseMap_Branch, uv_BaseMap_Branch ) , i.vertexColor.a);
float4 BaseColor8 = lerpResult6;
s2.Albedo = BaseColor8.rgb;
float2 uv_NormalMap_Beaf = i.uv_texcoord * _NormalMap_Beaf_ST.xy + _NormalMap_Beaf_ST.zw;
float3 tex2DNode10 = UnpackNormal( tex2D( _NormalMap_Beaf, uv_NormalMap_Beaf ) );
float3 appendResult26 = (float3(tex2DNode10.r , tex2DNode10.g , -tex2DNode10.b));
float3 switchResult25 = (((i.ASEVFace>0)?(tex2DNode10):(appendResult26)));
float2 uv_NormalMap_Branch = i.uv_texcoord * _NormalMap_Branch_ST.xy + _NormalMap_Branch_ST.zw;
float3 lerpResult12 = lerp( switchResult25 , UnpackNormal( tex2D( _NormalMap_Branch, uv_NormalMap_Branch ) ) , i.vertexColor.a);
float3 Normal14 = lerpResult12;
s2.Normal = WorldNormalVector( i , Normal14 );
s2.Emission = float3( 0,0,0 );
s2.Metallic = 0.0;
s2.Smoothness = ( 1.0 - _Roughness );
s2.Occlusion = 1.0;
data.light = gi.light;
UnityGI gi2 = gi;
#ifdef UNITY_PASS_FORWARDBASE
Unity_GlossyEnvironmentData g2 = UnityGlossyEnvironmentSetup( s2.Smoothness, data.worldViewDir, s2.Normal, float3(0,0,0));
gi2 = UnityGlobalIllumination( data, s2.Occlusion, s2.Normal, g2 );
#endif
float3 surfResult2 = LightingStandard ( s2, viewDir, gi2 ).rgb;
surfResult2 += s2.Emission;
#ifdef UNITY_PASS_FORWARDADD//2
surfResult2 -= s2.Emission;
#endif//2
c.rgb = surfResult2;
c.a = 1;
clip( Alpha22 - _Cutoff );
return c;
}
inline void LightingStandardCustomLighting_GI( inout SurfaceOutputCustomLightingCustom s, UnityGIInput data, inout UnityGI gi )
{
s.GIData = data;
}
void surf( Input i , inout SurfaceOutputCustomLightingCustom o )
{
o.SurfInput = i;
o.Normal = float3(0,0,1);
}
ENDCG
CGPROGRAM
#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows vertex:vertexDataFunc
ENDCG
Pass
{
Name "ShadowCaster"
Tags{ "LightMode" = "ShadowCaster" }
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile_shadowcaster
#pragma multi_compile UNITY_PASS_SHADOWCASTER
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
#include "HLSLSupport.cginc"
#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
#define CAN_SKIP_VPOS
#endif
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
struct v2f
{
V2F_SHADOW_CASTER;
float2 customPack1 : TEXCOORD1;
float4 tSpace0 : TEXCOORD2;
float4 tSpace1 : TEXCOORD3;
float4 tSpace2 : TEXCOORD4;
half4 color : COLOR0;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert( appdata_full v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID( v );
UNITY_INITIALIZE_OUTPUT( v2f, o );
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
UNITY_TRANSFER_INSTANCE_ID( v, o );
Input customInputData;
vertexDataFunc( v, customInputData );
float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
half3 worldNormal = UnityObjectToWorldNormal( v.normal );
half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
o.customPack1.xy = customInputData.uv_texcoord;
o.customPack1.xy = v.texcoord;
TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
o.color = v.color;
return o;
}
half4 frag( v2f IN
#if !defined( CAN_SKIP_VPOS )
, UNITY_VPOS_TYPE vpos : VPOS
#endif
) : SV_Target
{
UNITY_SETUP_INSTANCE_ID( IN );
Input surfIN;
UNITY_INITIALIZE_OUTPUT( Input, surfIN );
surfIN.uv_texcoord = IN.customPack1.xy;
float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
surfIN.worldPos = worldPos;
surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
surfIN.vertexColor = IN.color;
SurfaceOutputCustomLightingCustom o;
UNITY_INITIALIZE_OUTPUT( SurfaceOutputCustomLightingCustom, o )
surf( surfIN, o );
UnityGI gi;
UNITY_INITIALIZE_OUTPUT( UnityGI, gi );
o.Alpha = LightingStandardCustomLighting( o, worldViewDir, gi ).a;
#if defined( CAN_SKIP_VPOS )
float2 vpos = IN.pos;
#endif
SHADOW_CASTER_FRAGMENT( IN )
}
ENDCG
}
}
Fallback "Diffuse"
CustomEditor "ASEMaterialInspector"
}
/*ASEBEGIN
Version=18703
2120;79.2;1910;949;4682.4;-429.11;3.238338;True;False
Node;AmplifyShaderEditor.CommentaryNode;67;-3105.601,1169.338;Inherit;False;2873.335;1730.373;wind;29;30;29;33;31;34;43;41;45;42;32;52;44;37;46;53;48;38;56;35;59;55;49;47;50;39;61;62;63;66;wind;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;29;-3055.601,1219.338;Inherit;False;Property;_GlobalWindSpeed;GlobalWindSpeed;6;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleTimeNode;30;-3043.186,1352.248;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.PiNode;33;-2783.186,1482.248;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;31;-2745.186,1287.248;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;15;-2930.545,336.9109;Inherit;False;1445.533;706.7714;Normal;8;14;12;13;11;25;26;27;10;Normal;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;41;-2955.43,1670.371;Inherit;False;Property;_GlobalWindIntensity;GlobalWindIntensity;7;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;43;-2925.43,1805.371;Inherit;False;Constant;_Float1;Float 1;8;0;Create;True;0;0;False;0;False;0.1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;34;-2557.186,1286.846;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;10;-2878.545,386.9108;Inherit;True;Property;_NormalMap_Beaf;NormalMap_Beaf;2;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SinOpNode;32;-2232.243,1288.323;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;42;-2637.43,1734.371;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.CosOpNode;45;-2219.916,1709.438;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.NegateNode;27;-2584.474,549.029;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;46;-1915.738,1713.87;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.DynamicAppendNode;26;-2416.474,461.029;Inherit;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;44;-1913.612,1285.143;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.Vector3Node;37;-1748.591,1486.79;Inherit;False;Property;_GlobalWindDirection;GlobalWindDirection;8;0;Create;True;0;0;False;0;False;0,0,0;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.CommentaryNode;9;-2927.645,-558.358;Inherit;False;1016.54;730.0001;BaseColor;7;3;5;6;7;8;22;24;BaseColor;1,1,1,1;0;0
Node;AmplifyShaderEditor.Vector3Node;53;-1793.54,2134.001;Inherit;False;Property;_SmallWindDirection;SmallWindDirection;11;0;Create;True;0;0;False;0;False;0,0,1;0,0,1;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RangedFloatNode;52;-1794.54,2038.001;Inherit;False;Property;_SmallWindSpeed;SmallWindSpeed;9;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;56;-1334.54,2214.001;Inherit;False;Property;_SmallWindIntensity;SmallWindIntensity;10;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;3;-2875.645,-508.358;Inherit;True;Property;_BaseMap_Beaf;BaseMap_Beaf;1;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.VertexColorNode;13;-2814.545,862.9108;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SwitchByFaceNode;25;-2268.474,395.029;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.VertexColorNode;7;-2811.645,-32.35796;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;35;-1497.784,1283.848;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SamplerNode;11;-2880.545,614.9108;Inherit;True;Property;_NormalMap_Branch;NormalMap_Branch;4;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.FunctionNode;59;-1455.411,2047.701;Inherit;False;SimpleGrassWind;-1;;2;205beb641ec413548834c7eb5a342298;0;2;1;FLOAT;1;False;7;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;48;-1499.984,1701.418;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.VertexColorNode;38;-1283.142,1459.165;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;5;-2877.645,-280.358;Inherit;True;Property;_BaseMap_Branch;BaseMap_Branch;3;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.LerpOp;12;-2037.545,548.9108;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;49;-1067.25,1675.393;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;55;-1048.54,2023.562;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.LerpOp;6;-2431.645,-356.358;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-1055.393,1285.441;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.SimpleAddOpNode;50;-708.7696,1479.748;Inherit;False;3;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RangedFloatNode;19;-1065.259,332.4771;Inherit;False;Property;_Roughness;Roughness;5;0;Create;True;0;0;False;0;False;0.5;0.5;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.LerpOp;24;-2397.259,-119.5229;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;1;False;2;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;8;-2135.906,-343.3085;Inherit;False;BaseColor;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;14;-1690.807,543.9604;Inherit;False;Normal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.OneMinusNode;20;-715.2592,383.4771;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;39;-457.0661,1478.18;Inherit;False;VertexOffset;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;17;-873.2592,133.4771;Inherit;False;14;Normal;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;16;-900.2592,17.47711;Inherit;False;8;BaseColor;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.RangedFloatNode;18;-700.2592,205.4771;Inherit;False;Constant;_Float0;Float 0;4;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;22;-2144.259,-66.52289;Inherit;False;Alpha;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.PannerNode;62;-1493.22,2562.444;Inherit;False;3;0;FLOAT2;0,0;False;2;FLOAT2;0.1,0;False;1;FLOAT;1;False;1;FLOAT2;0
Node;AmplifyShaderEditor.SamplerNode;61;-1235.692,2534.748;Inherit;True;Property;_WindNoise;WindNoise;12;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.Vector2Node;66;-1789.412,2737.511;Inherit;False;Constant;_NoiseWindSpeed;NoiseWindSpeed;13;0;Create;True;0;0;False;0;False;1,0;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2
Node;AmplifyShaderEditor.GetLocalVarNode;40;-338.1208,457.1961;Inherit;False;39;VertexOffset;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;23;-338.259,344.4771;Inherit;False;22;Alpha;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.CustomStandardSurface;2;-389,88.5;Inherit;False;Metallic;Tangent;6;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,1;False;2;FLOAT3;0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;1;False;1;FLOAT3;0
Node;AmplifyShaderEditor.TextureCoordinatesNode;63;-1841.955,2562.156;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.StandardSurfaceOutputNode;0;0,0;Float;False;True;-1;2;ASEMaterialInspector;0;0;CustomLighting;Scene_Tree;False;False;False;False;False;False;False;False;False;False;False;False;False;True;False;False;True;False;False;False;False;Off;0;False;-1;0;False;-1;False;0;False;-1;0;False;-1;False;0;Custom;0.5;True;True;0;True;Opaque;;AlphaTest;All;14;all;True;True;True;True;0;False;-1;False;0;False;-1;255;False;-1;255;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;False;2;15;10;25;False;0.5;True;0;0;False;-1;0;False;-1;0;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;0;0,0,0,0;VertexOffset;True;False;Cylindrical;False;Relative;0;;0;-1;-1;-1;0;False;0;0;False;-1;-1;0;False;-1;0;0;0;False;0.1;False;-1;0;False;-1;False;15;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;4;FLOAT;0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT;0;False;9;FLOAT;0;False;10;FLOAT;0;False;13;FLOAT3;0,0,0;False;11;FLOAT3;0,0,0;False;12;FLOAT3;0,0,0;False;14;FLOAT4;0,0,0,0;False;15;FLOAT3;0,0,0;False;0
WireConnection;31;0;29;0
WireConnection;31;1;30;0
WireConnection;34;0;31;0
WireConnection;34;1;33;0
WireConnection;32;0;34;0
WireConnection;42;0;41;0
WireConnection;42;1;43;0
WireConnection;45;0;34;0
WireConnection;27;0;10;3
WireConnection;46;0;45;0
WireConnection;46;1;42;0
WireConnection;26;0;10;1
WireConnection;26;1;10;2
WireConnection;26;2;27;0
WireConnection;44;0;32;0
WireConnection;44;1;42;0
WireConnection;25;0;10;0
WireConnection;25;1;26;0
WireConnection;35;0;44;0
WireConnection;35;1;37;0
WireConnection;59;1;52;0
WireConnection;59;7;53;0
WireConnection;48;0;37;0
WireConnection;48;1;46;0
WireConnection;12;0;25;0
WireConnection;12;1;11;0
WireConnection;12;2;13;4
WireConnection;49;0;38;2
WireConnection;49;1;48;0
WireConnection;55;0;38;2
WireConnection;55;1;59;0
WireConnection;55;2;56;0
WireConnection;6;0;3;0
WireConnection;6;1;5;0
WireConnection;6;2;7;4
WireConnection;47;0;35;0
WireConnection;47;1;38;1
WireConnection;50;0;47;0
WireConnection;50;1;49;0
WireConnection;50;2;55;0
WireConnection;24;0;3;4
WireConnection;24;2;7;4
WireConnection;8;0;6;0
WireConnection;14;0;12;0
WireConnection;20;0;19;0
WireConnection;39;0;50;0
WireConnection;22;0;24;0
WireConnection;62;0;63;0
WireConnection;62;2;66;0
WireConnection;61;1;62;0
WireConnection;2;0;16;0
WireConnection;2;1;17;0
WireConnection;2;3;18;0
WireConnection;2;4;20;0
WireConnection;0;10;23;0
WireConnection;0;13;2;0
WireConnection;0;11;40;0
ASEEND*/
//CHKSM=8F50F204A593FDCB0B4FA785033F06AA0ABD468A