今天记录一下如何实现随风摇摆的植物,之前项目里面的植物摇摆实现是使用骨骼动画实现的,这种方式太消耗性能,植物这种东西没必要,直接使用顶点动画即可。
准备
植物不需要使用标准的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 OffCGINCLUDE#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))#endifstruct Input{float3 worldPos;float2 uv_texcoord;float4 vertexColor : COLOR;float3 worldNormal;INTERNAL_DATAhalf 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_FORWARDBASEUnity_GlossyEnvironmentData g2 = UnityGlossyEnvironmentSetup( s2.Smoothness, data.worldViewDir, s2.Normal, float3(0,0,0));gi2 = UnityGlobalIllumination( data, s2.Occlusion, s2.Normal, g2 );#endiffloat3 surfResult2 = LightingStandard ( s2, viewDir, gi2 ).rgb;surfResult2 += s2.Emission;#ifdef UNITY_PASS_FORWARDADD//2surfResult2 -= s2.Emission;#endif//2c.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);}ENDCGCGPROGRAM#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows vertex:vertexDataFunc ENDCGPass{Name "ShadowCaster"Tags{ "LightMode" = "ShadowCaster" }ZWrite OnCGPROGRAM#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_IDUNITY_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;#endifSHADOW_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