用ASE制作地表积水效果

news2024/11/25 16:46:27

unity引擎制作实时刷下雨地面效果

  大家好,我是阿赵。
  之前在Unity引擎做了几种不同的效果,比如视差偏移、下雨效果、顶点颜色工具等。这一篇文章,将会把这几个效果合并在一起,做出一个混合积水地表的效果。这个几个shader的基础写法在之前都已经给过,这里换一下方式,使用ASE编辑器来做这个Shader。

一、效果介绍

  这个例子的效果大概是这样的:
  首先有一个凹凸感比较明显的地表:
在这里插入图片描述

  然后打开之前做的刷顶点颜色的攻击。为了能让笔刷刷下去之后,地表立刻改变,所以我这里加了一个是否绘制完立刻保存的选项。
  先刷了R通道,可以看到地表出现了湿润的感觉。
在这里插入图片描述

  再刷G通道,可以看到,地表出现了积水,然后积水的地方还有雨滴效果
在这里插入图片描述

  放大看,是这种效果:
在这里插入图片描述

二、ASE节点编辑

  如果不用PBR材质,水的质感不会那么好,所以我这里的光照模型是用过了PBR的。之前没有怎么介绍过ASE(AmplifyShaderEditor)的用法,我这里直接用了ASE工具来编辑这个Shader。

1、世界顶点坐标的计算

在这里插入图片描述

  这个连线很简单,把WorldPosition的xz值保存起来,起名叫做worldPosXZ

2、高度图采样

在这里插入图片描述

  由于后面有多个地方需要用到高度图,所以先保存一个结果

3、视差偏移的计算

在这里插入图片描述

  这里是效果的重点,地面的凹凸这么明显,其实是依赖了这个ParallaxOcclusionMapping技术,中文叫做视差遮挡偏移。里面用到几个参数,包括了刚才计算的worldPosXZ,还有高度图。最后输出了一个新的采样UV,我命名为worldUV。

4、地表法线计算

在这里插入图片描述

用worldUV采样地表的法线贴图,得到一个地表法线值。

5、下雨法线计算

在这里插入图片描述

  下雨的法线,之前已经介绍过了,用worldPosXZ乘以平铺次数,再Fract,得到的uv,再加上行列数,播放速度,传入Flipbook UV Animation节点里面,得到的UV坐标采样雨点的法线序列图。

6、顶点颜色定义

在这里插入图片描述

  由于需要混合多种效果,我打算利用顶点色的R通道和G通道。所以这里需要到顶点色。但单纯是顶点色会感觉没那么好看,所以先用worldUV采样高度图,然后通过HeightLerp节点混合顶点色和高度图,得到了R通道值和G通道值。

7、基础颜色混合

在这里插入图片描述

  用worldUV采样地表砖块的基础颜色贴图,然后和一个黑色做Lerp插值,然后再通过刚才计算的R通道顶点色值再做一次Lerp插值。得到的效果就是,如果R通道的值越大,地表的颜色就显得越深,好像是湿了一样。

8、法线混合

在这里插入图片描述

  把刚才计算的地表法线和雨点法线,通过G通道顶点色做Lerp插值,得到了一个不同位置凹凸感不一样的效果,G通道的值越大,就越接近雨滴效果。

9、光滑度混合

在这里插入图片描述

  这一步其实不是很必要,我自己按照自己喜好加的,默认的光滑度变低,然后让光滑度随着之前的地表湿润程度R通道增大而增大。

10、最终输出

在这里插入图片描述

  把刚才算好的结果,输入到各自的通道就行了。
  最终整个Shader编辑完成
在这里插入图片描述

三、源码

  这里贴出的是ASE生成的Shader代码,有安装ASE的朋友可以复制过去,应该就可以在ASE里面打开了。

// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "ASEWaterGround"
{
	Properties
	{
		_groundTiling("groundTiling", Vector) = (1,1,0,0)
		_heightTex("heightTex", 2D) = "white" {}
		_scale("scale", Float) = 1
		_ref("ref", Float) = 1
		_baseTex("baseTex", 2D) = "white" {}
		_groundNormalTex("groundNormalTex", 2D) = "bump" {}
		_blend("blend", Range( 0 , 1)) = 0
		_roughnessTex("roughnessTex", 2D) = "white" {}
		_pColor("pColor", Color) = (0,0,0,0)
		_depth("depth", Range( 0 , 1)) = 0
		_col("col", Float) = 1
		_speed("speed", Float) = 25
		_row("row", Float) = 1
		_rainNormalTex("rainNormalTex", 2D) = "white" {}
		_rainTiling("rainTiling", Float) = 1
		_roughVal("roughVal", Float) = 0.2
		_groundNormalScale("groundNormalScale", Float) = 1
		_rainNormalScale("rainNormalScale", Float) = 1
		[HideInInspector] _texcoord( "", 2D ) = "white" {}
		[HideInInspector] __dirty( "", Int ) = 1
	}

	SubShader
	{
		Tags{ "RenderType" = "Opaque"  "Queue" = "Geometry+0" "IsEmissive" = "true"  }
		Cull Back
		CGINCLUDE
		#include "UnityStandardUtils.cginc"
		#include "UnityPBSLighting.cginc"
		#include "Lighting.cginc"
		#pragma target 3.0
		#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;
			float3 viewDir;
			INTERNAL_DATA
			float3 worldNormal;
			float4 vertexColor : COLOR;
			float2 uv_texcoord;
		};

		uniform sampler2D _groundNormalTex;
		uniform float2 _groundTiling;
		uniform sampler2D _heightTex;
		uniform float _scale;
		uniform float _ref;
		uniform float4 _heightTex_ST;
		uniform float _groundNormalScale;
		uniform sampler2D _rainNormalTex;
		uniform float _rainTiling;
		uniform float _col;
		uniform float _row;
		uniform float _speed;
		uniform float _rainNormalScale;
		uniform float _blend;
		uniform sampler2D _baseTex;
		uniform float4 _pColor;
		uniform float _depth;
		uniform sampler2D _roughnessTex;
		SamplerState sampler_roughnessTex;
		uniform float4 _roughnessTex_ST;
		uniform float _roughVal;


		inline float2 POM( sampler2D heightMap, float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )
		{
			float3 result = 0;
			int stepIndex = 0;
			int numSteps = ( int )lerp( (float)maxSamples, (float)minSamples, saturate( dot( normalWorld, viewWorld ) ) );
			float layerHeight = 1.0 / numSteps;
			float2 plane = parallax * ( viewDirTan.xy / viewDirTan.z );
			uvs.xy += refPlane * plane;
			float2 deltaTex = -plane * layerHeight;
			float2 prevTexOffset = 0;
			float prevRayZ = 1.0f;
			float prevHeight = 0.0f;
			float2 currTexOffset = deltaTex;
			float currRayZ = 1.0f - layerHeight;
			float currHeight = 0.0f;
			float intersection = 0;
			float2 finalTexOffset = 0;
			while ( stepIndex < numSteps + 1 )
			{
			 	currHeight = tex2Dgrad( heightMap, uvs + currTexOffset, dx, dy ).r;
			 	if ( currHeight > currRayZ )
			 	{
			 	 	stepIndex = numSteps + 1;
			 	}
			 	else
			 	{
			 	 	stepIndex++;
			 	 	prevTexOffset = currTexOffset;
			 	 	prevRayZ = currRayZ;
			 	 	prevHeight = currHeight;
			 	 	currTexOffset += deltaTex;
			 	 	currRayZ -= layerHeight;
			 	}
			}
			int sectionSteps = 4;
			int sectionIndex = 0;
			float newZ = 0;
			float newHeight = 0;
			while ( sectionIndex < sectionSteps )
			{
			 	intersection = ( prevHeight - prevRayZ ) / ( prevHeight - currHeight + currRayZ - prevRayZ );
			 	finalTexOffset = prevTexOffset + intersection * deltaTex;
			 	newZ = prevRayZ - intersection * layerHeight;
			 	newHeight = tex2Dgrad( heightMap, uvs + finalTexOffset, dx, dy ).r;
			 	if ( newHeight > newZ )
			 	{
			 	 	currTexOffset = finalTexOffset;
			 	 	currHeight = newHeight;
			 	 	currRayZ = newZ;
			 	 	deltaTex = intersection * deltaTex;
			 	 	layerHeight = intersection * layerHeight;
			 	}
			 	else
			 	{
			 	 	prevTexOffset = finalTexOffset;
			 	 	prevHeight = newHeight;
			 	 	prevRayZ = newZ;
			 	 	deltaTex = ( 1 - intersection ) * deltaTex;
			 	 	layerHeight = ( 1 - intersection ) * layerHeight;
			 	}
			 	sectionIndex++;
			}
			return uvs.xy + finalTexOffset;
		}


		void surf( Input i , inout SurfaceOutputStandard o )
		{
			float3 ase_worldPos = i.worldPos;
			float2 worldPosXZ65 = (ase_worldPos).xz;
			float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );
			float3 ase_worldViewDir = normalize( UnityWorldSpaceViewDir( ase_worldPos ) );
			float2 OffsetPOM1 = POM( _heightTex, ( worldPosXZ65 * _groundTiling ), ddx(( worldPosXZ65 * _groundTiling )), ddy(( worldPosXZ65 * _groundTiling )), ase_worldNormal, ase_worldViewDir, i.viewDir, 8, 8, _scale, _ref, _heightTex_ST.xy, float2(0,0), 0 );
			float2 worldUV30 = OffsetPOM1;
			float3 groundNormalVal72 = UnpackScaleNormal( tex2D( _groundNormalTex, worldUV30 ), _groundNormalScale );
			// *** BEGIN Flipbook UV Animation vars ***
			// Total tiles of Flipbook Texture
			float fbtotaltiles41 = _col * _row;
			// Offsets for cols and rows of Flipbook Texture
			float fbcolsoffset41 = 1.0f / _col;
			float fbrowsoffset41 = 1.0f / _row;
			// Speed of animation
			float fbspeed41 = _Time[ 1 ] * _speed;
			// UV Tiling (col and row offset)
			float2 fbtiling41 = float2(fbcolsoffset41, fbrowsoffset41);
			// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)
			// Calculate current tile linear index
			float fbcurrenttileindex41 = round( fmod( fbspeed41 + 0.0, fbtotaltiles41) );
			fbcurrenttileindex41 += ( fbcurrenttileindex41 < 0) ? fbtotaltiles41 : 0;
			// Obtain Offset X coordinate from current tile linear index
			float fblinearindextox41 = round ( fmod ( fbcurrenttileindex41, _col ) );
			// Multiply Offset X by coloffset
			float fboffsetx41 = fblinearindextox41 * fbcolsoffset41;
			// Obtain Offset Y coordinate from current tile linear index
			float fblinearindextoy41 = round( fmod( ( fbcurrenttileindex41 - fblinearindextox41 ) / _col, _row ) );
			// Reverse Y to get tiles from Top to Bottom
			fblinearindextoy41 = (int)(_row-1) - fblinearindextoy41;
			// Multiply Offset Y by rowoffset
			float fboffsety41 = fblinearindextoy41 * fbrowsoffset41;
			// UV Offset
			float2 fboffset41 = float2(fboffsetx41, fboffsety41);
			// Flipbook UV
			half2 fbuv41 = frac( ( worldPosXZ65 * _rainTiling ) ) * fbtiling41 + fboffset41;
			// *** END Flipbook UV Animation vars ***
			float3 rainNormalVal69 = UnpackScaleNormal( tex2D( _rainNormalTex, fbuv41 ), _rainNormalScale );
			float temp_output_10_0_g4 = _blend;
			float4 tex2DNode17 = tex2D( _heightTex, worldUV30 );
			float clampResult8_g4 = clamp( ( ( tex2DNode17.r - 1.0 ) + ( i.vertexColor.g * 2.0 ) ) , 0.0 , 1.0 );
			float lerpResult12_g4 = lerp( ( 0.0 - temp_output_10_0_g4 ) , ( temp_output_10_0_g4 + 1.0 ) , clampResult8_g4);
			float clampResult13_g4 = clamp( lerpResult12_g4 , 0.0 , 1.0 );
			float gVal26 = clampResult13_g4;
			float3 lerpResult48 = lerp( groundNormalVal72 , rainNormalVal69 , gVal26);
			float3 normalBlendVal80 = lerpResult48;
			o.Normal = normalBlendVal80;
			float4 tex2DNode13 = tex2D( _baseTex, worldUV30 );
			float4 lerpResult33 = lerp( tex2DNode13 , _pColor , _depth);
			float temp_output_10_0_g3 = _blend;
			float clampResult8_g3 = clamp( ( ( tex2DNode17.r - 1.0 ) + ( i.vertexColor.r * 2.0 ) ) , 0.0 , 1.0 );
			float lerpResult12_g3 = lerp( ( 0.0 - temp_output_10_0_g3 ) , ( temp_output_10_0_g3 + 1.0 ) , clampResult8_g3);
			float clampResult13_g3 = clamp( lerpResult12_g3 , 0.0 , 1.0 );
			float rVal25 = clampResult13_g3;
			float4 lerpResult35 = lerp( tex2DNode13 , lerpResult33 , rVal25);
			float4 baseColorBlend83 = lerpResult35;
			o.Emission = baseColorBlend83.rgb;
			float2 uv_roughnessTex = i.uv_texcoord * _roughnessTex_ST.xy + _roughnessTex_ST.zw;
			float4 tex2DNode29 = tex2D( _roughnessTex, uv_roughnessTex );
			float lerpResult56 = lerp( ( tex2DNode29.r * _roughVal ) , tex2DNode29.r , rVal25);
			float smoothnessBlend86 = lerpResult56;
			o.Smoothness = smoothnessBlend86;
			o.Alpha = 1;
		}

		ENDCG
		CGPROGRAM
		#pragma surface surf Standard keepalpha fullforwardshadows 

		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;
				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.viewDir = IN.tSpace0.xyz * worldViewDir.x + IN.tSpace1.xyz * worldViewDir.y + IN.tSpace2.xyz * worldViewDir.z;
				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;
				SurfaceOutputStandard o;
				UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandard, o )
				surf( surfIN, o );
				#if defined( CAN_SKIP_VPOS )
				float2 vpos = IN.pos;
				#endif
				SHADOW_CASTER_FRAGMENT( IN )
			}
			ENDCG
		}
	}
	Fallback "Diffuse"
	CustomEditor "ASEMaterialInspector"
}
/*ASEBEGIN
Version=18500
0;0;1920;1019;2715.25;1678.37;1;True;True
Node;AmplifyShaderEditor.CommentaryNode;68;-4261.146,-1310.134;Inherit;False;599.3811;233;WorldPosXZ;3;2;3;65;WorldPosXZ;1,1,1,1;0;0
Node;AmplifyShaderEditor.WorldPosInputsNode;2;-4211.146,-1260.134;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.SwizzleNode;3;-4026.887,-1257.968;Inherit;False;FLOAT2;0;2;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.CommentaryNode;77;-4289.755,-861.7321;Inherit;False;579.1816;280;Comment;2;9;59;HeightTex;1,1,1,1;0;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;65;-3885.765,-1256.464;Inherit;False;worldPosXZ;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.TexturePropertyNode;9;-4239.756,-811.7321;Inherit;True;Property;_heightTex;heightTex;1;0;Create;True;0;0;False;0;False;None;95664866b70aee84ba32b0c9a54451e2;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1
Node;AmplifyShaderEditor.CommentaryNode;78;-4455.765,-268.7075;Inherit;False;976.8647;665.7678;ParallaxOcclusionMapping;9;5;6;1;67;75;11;10;12;30;ParallaxOcclusionMapping;1,1,1,1;0;0
Node;AmplifyShaderEditor.GetLocalVarNode;67;-4405.765,-218.7075;Inherit;False;65;worldPosXZ;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;59;-3934.578,-774.3611;Inherit;False;heightTexVal;-1;True;1;0;SAMPLER2D;;False;1;SAMPLER2D;0
Node;AmplifyShaderEditor.Vector2Node;5;-4403.4,-132.2613;Inherit;False;Property;_groundTiling;groundTiling;0;0;Create;True;0;0;False;0;False;1,1;2,2;0;3;FLOAT2;0;FLOAT;1;FLOAT;2
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;6;-4206.425,-161.6577;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;12;-4057.774,230.061;Inherit;False;Property;_ref;ref;3;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;75;-4217.452,16.21494;Inherit;False;59;heightTexVal;1;0;OBJECT;;False;1;SAMPLER2D;0
Node;AmplifyShaderEditor.CommentaryNode;71;-2970.312,-1359.645;Inherit;False;1750.331;403.1255;RainNormal;11;42;37;40;43;41;64;69;44;46;66;45;RainNormal;1,1,1,1;0;0
Node;AmplifyShaderEditor.ViewDirInputsCoordNode;11;-4315.974,209.0607;Inherit;False;Tangent;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RangedFloatNode;10;-4273.474,112.5602;Inherit;False;Property;_scale;scale;2;0;Create;True;0;0;False;0;False;1;-0.01;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.ParallaxOcclusionMappingNode;1;-3924.296,-24.45464;Inherit;False;0;8;False;-1;16;False;-1;4;0.02;0;False;1,1;False;0,0;7;0;FLOAT2;0,0;False;1;SAMPLER2D;;False;2;FLOAT;0.02;False;3;FLOAT3;0,0,0;False;4;FLOAT;0;False;5;FLOAT2;0,0;False;6;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.GetLocalVarNode;66;-2920.312,-1297.915;Inherit;False;65;worldPosXZ;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;45;-2830.445,-1212.29;Inherit;False;Property;_rainTiling;rainTiling;14;0;Create;True;0;0;False;0;False;1;5;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;46;-2638.089,-1296.725;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.CommentaryNode;79;-2977.709,-251.7889;Inherit;False;1223.207;650.2081;VertexColor;9;22;18;17;16;21;76;25;23;26;VertexColor;1,1,1,1;0;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;30;-3694.966,-10.05673;Inherit;False;worldUV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;40;-2360.534,-1236.611;Inherit;False;Property;_col;col;10;0;Create;True;0;0;False;0;False;1;4;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;21;-2927.709,-114.2687;Inherit;False;30;worldUV;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.FractNode;37;-2475.998,-1309.645;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;42;-2359.974,-1146.519;Inherit;False;Property;_row;row;12;0;Create;True;0;0;False;0;False;1;4;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;74;-2984.073,-801.1234;Inherit;False;997.9521;280;GroundNormal;4;72;14;31;63;GroundNormal;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;43;-2353.974,-1072.519;Inherit;False;Property;_speed;speed;11;0;Create;True;0;0;False;0;False;25;25;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;76;-2917.33,-200.6836;Inherit;False;59;heightTexVal;1;0;OBJECT;;False;1;SAMPLER2D;0
Node;AmplifyShaderEditor.VertexColorNode;18;-2668.394,44.2112;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.TFHCFlipBookUVAnimation;41;-2085.974,-1301.52;Inherit;False;0;0;6;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;3;FLOAT2;0;FLOAT;1;FLOAT;2
Node;AmplifyShaderEditor.GetLocalVarNode;31;-2934.073,-744.1212;Inherit;False;30;worldUV;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;22;-2719.71,282.4193;Inherit;False;Property;_blend;blend;6;0;Create;True;0;0;False;0;False;0;0.115;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;64;-2013.828,-1086.708;Inherit;False;Property;_rainNormalScale;rainNormalScale;17;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;17;-2689.394,-201.7889;Inherit;True;Property;_TextureSample0;Texture Sample 0;6;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.CommentaryNode;85;-1524.068,1206.155;Inherit;False;1215.321;564.71;BaseColorBlend;8;33;36;13;35;32;34;28;83;BaseColorBlend;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;63;-2921.229,-670.2874;Inherit;False;Property;_groundNormalScale;groundNormalScale;16;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;14;-2671.856,-751.1234;Inherit;True;Property;_groundNormalTex;groundNormalTex;5;0;Create;True;0;0;False;0;False;-1;None;0370537a00ad26e4a896f79b2aec4f23;True;0;True;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.SamplerNode;44;-1799.768,-1267.344;Inherit;True;Property;_rainNormalTex;rainNormalTex;13;0;Create;True;0;0;False;0;False;-1;None;b9e603798145b2044a49e582271b0f1b;True;0;False;white;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.GetLocalVarNode;28;-1451.562,1256.155;Inherit;False;30;worldUV;1;0;OBJECT;;False;1;FLOAT2;0
Node;AmplifyShaderEditor.FunctionNode;16;-2287.12,-94.13768;Inherit;False;HeightLerp;-1;;3;bd8e91b1bb22e95439a8890d04c777d9;0;3;1;FLOAT;0;False;5;FLOAT;0;False;10;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.FunctionNode;23;-2303.664,94.44557;Inherit;False;HeightLerp;-1;;4;bd8e91b1bb22e95439a8890d04c777d9;0;3;1;FLOAT;0;False;5;FLOAT;0;False;10;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;88;-1616.297,535.2726;Inherit;False;1151.513;485.281;SmoothnessBlend;6;29;53;51;54;56;86;SmoothnessBlend;1,1,1,1;0;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;25;-1978.502,-55.11339;Inherit;False;rVal;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;26;-1982.639,114.9326;Inherit;False;gVal;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;72;-2224.121,-693.5996;Inherit;False;groundNormalVal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;69;-1443.982,-1247.856;Inherit;False;rainNormalVal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RangedFloatNode;53;-1081.148,695.8835;Inherit;False;Property;_roughVal;roughVal;15;0;Create;True;0;0;False;0;False;0.2;0.7;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;29;-1566.297,625.0161;Inherit;True;Property;_roughnessTex;roughnessTex;7;0;Create;True;0;0;False;0;False;-1;None;15ac75118ec027447b8e1654c7251a3f;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.CommentaryNode;82;-1458.872,-377.4322;Inherit;False;798.8788;383.9342;NormalBlendVal;5;48;80;73;70;49;NormalBlendVal;1,1,1,1;0;0
Node;AmplifyShaderEditor.RangedFloatNode;34;-1220.218,1646.01;Inherit;False;Property;_depth;depth;9;0;Create;True;0;0;False;0;False;0;0.381;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;32;-1474.068,1504.578;Inherit;False;Property;_pColor;pColor;8;0;Create;True;0;0;False;0;False;0,0,0,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;13;-1268.437,1279.198;Inherit;True;Property;_baseTex;baseTex;4;0;Create;True;0;0;False;0;False;-1;None;757b27643c0257b499d31aac165b18fc;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.GetLocalVarNode;73;-1400.521,-327.4322;Inherit;False;72;groundNormalVal;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;70;-1408.872,-206.3976;Inherit;False;69;rainNormalVal;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;49;-1392.448,-109.4981;Inherit;False;26;gVal;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;36;-911.2296,1654.865;Inherit;False;25;rVal;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;54;-935.7402,585.2726;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.LerpOp;33;-905.2296,1499.865;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.GetLocalVarNode;51;-1251.783,904.5536;Inherit;False;25;rVal;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.LerpOp;35;-724.1446,1386.959;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.LerpOp;48;-1137.917,-257.1948;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.LerpOp;56;-910.9443,771.4702;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;80;-888.9934,-227.4163;Inherit;False;normalBlendVal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;83;-538.7474,1448.889;Inherit;False;baseColorBlend;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;86;-706.7839,799.3683;Inherit;False;smoothnessBlend;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;81;59.31812,-44.23235;Inherit;False;80;normalBlendVal;1;0;OBJECT;;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;84;77.09093,73.9717;Inherit;False;83;baseColorBlend;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;87;55.48254,194.7304;Inherit;False;86;smoothnessBlend;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.StandardSurfaceOutputNode;0;365.0914,19.1281;Float;False;True;-1;2;ASEMaterialInspector;0;0;Standard;ASEWaterGround;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;Back;0;False;-1;0;False;-1;False;0;False;-1;0;False;-1;False;0;Opaque;0.5;True;True;0;False;Opaque;;Geometry;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;;-1;-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;16;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;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;3;0;2;0
WireConnection;65;0;3;0
WireConnection;59;0;9;0
WireConnection;6;0;67;0
WireConnection;6;1;5;0
WireConnection;1;0;6;0
WireConnection;1;1;75;0
WireConnection;1;2;10;0
WireConnection;1;3;11;0
WireConnection;1;4;12;0
WireConnection;46;0;66;0
WireConnection;46;1;45;0
WireConnection;30;0;1;0
WireConnection;37;0;46;0
WireConnection;41;0;37;0
WireConnection;41;1;40;0
WireConnection;41;2;42;0
WireConnection;41;3;43;0
WireConnection;17;0;76;0
WireConnection;17;1;21;0
WireConnection;14;1;31;0
WireConnection;14;5;63;0
WireConnection;44;1;41;0
WireConnection;44;5;64;0
WireConnection;16;1;17;1
WireConnection;16;5;18;1
WireConnection;16;10;22;0
WireConnection;23;1;17;1
WireConnection;23;5;18;2
WireConnection;23;10;22;0
WireConnection;25;0;16;0
WireConnection;26;0;23;0
WireConnection;72;0;14;0
WireConnection;69;0;44;0
WireConnection;13;1;28;0
WireConnection;54;0;29;1
WireConnection;54;1;53;0
WireConnection;33;0;13;0
WireConnection;33;1;32;0
WireConnection;33;2;34;0
WireConnection;35;0;13;0
WireConnection;35;1;33;0
WireConnection;35;2;36;0
WireConnection;48;0;73;0
WireConnection;48;1;70;0
WireConnection;48;2;49;0
WireConnection;56;0;54;0
WireConnection;56;1;29;1
WireConnection;56;2;51;0
WireConnection;80;0;48;0
WireConnection;83;0;35;0
WireConnection;86;0;56;0
WireConnection;0;1;81;0
WireConnection;0;2;84;0
WireConnection;0;4;87;0
ASEEND*/
//CHKSM=E11325D7EB9C809FDB1090C9406210D19CCE1D9F

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于elelemt-ui封装一个表单

子组件 searchForm <template><el-formref"form":model"value":rules"rules":label-width"labelWidth":inline"inline"><el-form-itemv-for"field in fields":key"field.slot":label&q…

JMeter基础 —— 使用Badboy录制JMeter脚本!

1、使用Badboy录制JMeter脚本 打开Badboy工具开始进行脚本录制&#xff1a; &#xff08;1&#xff09;当我们打开Badboy工具时&#xff0c;默认就进入录制状态。 如下图&#xff1a; 当然我们也可以点击录制按钮进行切换。 &#xff08;2&#xff09;在地址栏中输入被测地…

excel单元格多行文本的excel 提取 公式

excel单元格多行文本的excel 提取 公式 第一行&#xff1a; TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(" ",160)),ROW(A1)*160-159,160)) 第9行&#xff1a; TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(" ",160)),ROW(A9)*160-159,160)) Excel如何提取某一单元…

GRU实现时间序列预测(PyTorch版)

&#x1f4a5;项目专栏&#xff1a;【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战&#xff08;附代码数据集原理介绍&#xff09; 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…

Multi Query Attention Group Query Attention

Multi Query Attention(MQA)在2019年就被提出来了&#xff0c;用于推理加速&#xff0c;但在当时并没有受到很多关注&#xff0c;毕竟一张2080就能跑Bert-base了。随着LLM的大火&#xff0c;MQA所带来的收益得以放大。 思路 Multi Query Attention(MQA)跟Multi Head Attention…

win10 自带虚拟机软件 虚拟CentOS系统

win10 下使用需要虚拟一个系统&#xff0c;不需要额外安装VMware、Virtual box等软件。使用win10 自带虚拟机软件即可 步骤1 确保启动Hyper-V 功能启用 控制面板 -> 程序 -> 启用或关闭Windows功能 步骤 2 创建虚拟机 2.1 打开Typer-V 2.2 创建虚拟机 2.2.1 操作 -&g…

什么是数据湖?数据湖的概念及发展历程

随着云计算、社交媒体、物联网、短视频等新一代互联网技术的快速发展&#xff0c;数据的数量和复杂性不断增加。许多企业和组织已经积累了大量的各种类型的数据&#xff0c;对于如何存储和管理这些海量数据&#xff0c;以及如何高效地分析和利用这些数据&#xff0c;是每个组织…

数字IC设计笔试面试经典题(1-10)

1 基础知识 1.1 锁存器的结构 锁存器即Latch &#xff0c;数电中称之为电平触发的D触发器&#xff0c;也是D型锁存器&#xff0c;有电平触发器SR触发器改进得到&#xff0c;其工作特点是电平是有效电平&#xff08;高电平或者低电平&#xff09;期间&#xff0c;才接受信号并…

Vue中实现全景房看图3D

示例代码 安装photo-sphere-viewer yarn add -D photo-sphere-viewer 组件引入插件 import { Viewer } from photo-sphere-viewer; import photo-sphere-viewer/dist/photo-sphere-viewer.css; // 引入样式 import MarkersPlugin from photo-sphere-viewer/dist/plugins/marker…

一文读懂LCD、OLED、LED屏的区别以及透明液晶屏原理

参考文章科普&#xff5c;一文读懂LCD、LED和OLED 的区别 - 知乎 参考文章透明液晶显示屏的原理&#xff1f; - 知乎 一、LCD LCD是英文Liquid Crystal Display 的简称&#xff0c;指的是液晶显示屏。 主要想介绍下LCD透明屏方案&#xff1a; 所谓LCD透明屏&#xff0c;并…

Postman接口调用api

1.选择类型&#xff0c;输入URL 2.选择Basic Type 3.选择格式类型 文件类型 4.Send发送请求&#xff0c;获得返回

澄海区图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

澄海区图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

蛤蟆先生去看心理医生笔记

自我状态 儿童自我状态&#xff1a;行为和感受像个孩子。由童年残留的遗迹搭建而成&#xff0c;包含小时候体验的所有情感&#xff08;儿童的基本情感&#xff09;和随后演变的行为模式。 行为和感受像个孩子。由童年残留的遗迹搭建而成&#xff0c;包含小时候体验的所有情感…

【SpringMVC】JSR303与拦截器的使用

文章目录 一、JSR3031.1 JSR303是什么1.2 JSR 303的好处包括1.3 常用注解1.4 实例1.4.1 导入JSR303依赖1.4.2 规则配置1.4.3 编写校验方法1.4.4 编写前端 二、拦截器2.1 拦截器是什么2.2 拦截器与过滤器的区别2.3.应用场景2.4 快速入门2.5.拦截器链2.6 登录拦截权限案例2.6.1 L…

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?

安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入&#xff0c;可兼容多协议、多类型设备&#xff0c;管理员可选择任意一路或多路视频实时观看&#xff0c;视频画面支持单画面、多画面显示&#xff0c;视频窗口数量有1、4、9、16个可选&#xff0c;还能…

第四章 Linux网络编程

ARP 协议 ARP 协议&#xff08;Address Resolution Protocol&#xff09;通过 IP 地址查找对应的 MAC 地址。 当一个主机需要发送数据给另一个主机时&#xff0c;它首先会检查本地的 ARP 缓存表&#xff08;ARP cache&#xff09;中是否存在目标主机的 MAC 地址。如果存在&…

【VS插件】VS code上的Remote - SSH

【VS插件】VS code上的Remote - SSH 目录 【VS插件】VS code上的Remote - SSH获得Linux服务器或者Linux系统的IP地址下载插件远程登录注意如果Linux虚拟机系统无法连接成功可能是没有开启ssh服务优势 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9.12 前言&#xff1…

社群团购是简单的商业模式,把握红利,冲刺双11

其实&#xff0c;不管微商、社群团购、直播带货、内容电商、视频号&#xff0c;小红书电商……都只是卖货的渠道&#xff0c;新渠道 社群团购让销售变得更加专业和简单&#xff0c;货源方负责产品的生产、渠道方负责销售。好好卖货&#xff0c;卖好货&#xff01; 是分工合作&a…

MATLAB | 绘图复刻(十二) | 桑基图+气泡图

hey 绘图复刻居然已经出到第十二期&#xff0c;破百指日可待hiahiahia&#xff0c;今天来复刻一下 Yu, W., Wang, Z., Yu, X. et al. Kir2.1-mediated membrane potential promotes nutrient acquisition and inflammation through regulation of nutrient transporters. Nat …

【css | loading】好看的loading特效

示例&#xff1a; https://code.juejin.cn/pen/7277764394618978365 html <div class"pl"><div class"pl__dot"></div><div class"pl__dot"></div><div class"pl__dot"></div><div c…