Unity制作随风摇摆的植物

今天记录一下如何实现随风摇摆的植物,之前项目里面的植物摇摆实现是使用骨骼动画实现的,这种方式太消耗性能,植物这种东西没必要,直接使用顶点动画即可。

准备

植物不需要使用标准的PBR流程,基础的颜色贴图加上法向贴图即可,它不区分金属非金属,精致一些可以加一个粗糙度贴图和AO。
我使用的植物模型还区分了树干和树也,通过顶点色的alpha通道去区分,这样可以在一个材质里面使用两套贴图。

首先看一下资源:
贴图有一张flowmap用于处理顶点动画,一张基础色贴图,一张法向贴图
Unity制作随风摇摆的植物_第1张图片
顶点色 R通道用于区分可以摆动的幅度的强弱,越靠近地面,摆动越弱,这个用于控制整个树木的大范围的摇动效果
Unity制作随风摇摆的植物_第2张图片
G通道用于处理树叶的摆动幅度的强弱,越靠近树干,摆动越弱,这个用于控制树叶的摆动
Unity制作随风摇摆的植物_第3张图片
这两个通道一起混合使用,用来实现顶点动画。
B通道没有内容
A通道用于区分树干和树叶 白色的是树干,黑色的是树叶
Unity制作随风摇摆的植物_第4张图片

渲染实现

渲染使用ASE连连看连出来先
树叶是面片,需要双面渲染的,所以我们需要将剔除模式Cull 设置为OFF
Unity制作随风摇摆的植物_第5张图片

树叶的形状我们使用树叶的alpha通道进行裁剪,所以需要使用透明检测
Unity制作随风摇摆的植物_第6张图片
基础颜色,通过A通道进行lerp插值,将树叶和树干插值出来,还需要透明度进行透明裁剪
Unity制作随风摇摆的植物_第7张图片
法向这里也是使用了相同的方式,lerp插值,但是注意,由于树叶使用了双面渲染,背面法向是错误的,我们需要将法向的Z轴进行翻转(Z轴在切线空间里面是和法向朝向平行的)
Unity制作随风摇摆的植物_第8张图片

实现摆动

我们先通过最基础的跟随时间进行摆动,可以自定义方向
Unity制作随风摇摆的植物_第9张图片
Sin函数使用后的曲线图是以下这样的
Unity制作随风摇摆的植物_第10张图片
如果先乘以PI以后再Sin,效果就在1的数值内半个循环,更好的控制
Unity制作随风摇摆的植物_第11张图片
接下来我们将树叶摆动也添加进来,这里是受到顶点色的G通道控制
Unity制作随风摇摆的植物_第12张图片
这里我们使用的cos去运算,它刚好和sin隔开
Unity制作随风摇摆的植物_第13张图片
实现这一部以后,我们实现了一个不错的摆动的效果,但是缺少了一些的随机性,最简单的方法就是添加一张扰动图,使用扰动图去扰动树叶,让树叶有更多的随机性,看起来更自然
下图为使用了扰动图实现的节点,也使用到了顶点动画的G通道控制树叶。

上面的方法还需要额外去采样一张图片,接下来我们使用一种程序化的方法,直接使用一个节点去实现扰动
Unity制作随风摇摆的植物_第14张图片
这个节点是通过UE里面的方式翻译过来的,这里要着重感谢一些Kerry大佬。节点是在Shader Function里面,自行查阅

我们就可以通过调整参数去控制整个树干带着树枝和树叶偏移,还能模拟树叶的摆动,效果挺不错
Unity制作随风摇摆的植物_第15张图片
最后附上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

你可能感兴趣的:(unity,unity,游戏引擎)