|  |  |  |  | shader_type spatial; | 
					
						
							|  |  |  |  | render_mode cull_disabled; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | uniform float wind_speed = 0.2; | 
					
						
							|  |  |  |  | uniform float wind_strength = 2.0; | 
					
						
							|  |  |  |  | // How big, in world space, is the noise texture | 
					
						
							|  |  |  |  | // wind will tile every wind_texture_tile_size | 
					
						
							|  |  |  |  | uniform float wind_texture_tile_size = 20.0; | 
					
						
							|  |  |  |  | uniform float wind_vertical_strength = 0.3; | 
					
						
							|  |  |  |  | uniform vec2 wind_horizontal_direction = vec2(1.0, 0.5); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | uniform sampler2D color_ramp : hint_default_black; | 
					
						
							|  |  |  |  | // we need a tiling noise here! | 
					
						
							|  |  |  |  | uniform sampler2D wind_noise : hint_default_black; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | uniform vec3 character_position; | 
					
						
							|  |  |  |  | uniform float character_radius = 3.0; | 
					
						
							|  |  |  |  | uniform sampler2D character_distance_falloff_curve : hint_default_black; | 
					
						
							|  |  |  |  | uniform float character_push_strength = 1.0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | varying float debug_wind; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void vertex() { | 
					
						
							|  |  |  |  | 	vec3 world_vert = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	vec2 normalized_wind_direction = normalize(wind_horizontal_direction); | 
					
						
							|  |  |  |  | 	vec2 world_uv = world_vert.xz / wind_texture_tile_size + normalized_wind_direction * TIME * wind_speed; | 
					
						
							|  |  |  |  | 	// we displace only the top part of the mesh | 
					
						
							|  |  |  |  | 	// note that this means that the mesh needs to have UV in a way that the bottom of UV space | 
					
						
							|  |  |  |  | 	// is at the top of the mesh | 
					
						
							|  |  |  |  | 	float displacement_affect = (1.0 - UV.y); | 
					
						
							|  |  |  |  | 	float wind_noise_intensity = (textureLod(wind_noise, world_uv, 0.0).r - 0.5); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// We convert the direction of the wind into vertex space from world space | 
					
						
							|  |  |  |  | 	// if we used it directly in vertex space, rotated blades of grass wouldn't behave properly | 
					
						
							|  |  |  |  | 	vec2 vert_space_horizontal_dir = | 
					
						
							|  |  |  |  | 			(inverse(MODEL_MATRIX) * vec4(wind_horizontal_direction, 0.0, 0.0)).xy; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	vert_space_horizontal_dir = normalize(vert_space_horizontal_dir); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	vec3 bump_wind = vec3( | 
					
						
							|  |  |  |  | 		wind_noise_intensity * vert_space_horizontal_dir.x, | 
					
						
							|  |  |  |  | 		1.0 - wind_noise_intensity, | 
					
						
							|  |  |  |  | 		wind_noise_intensity * vert_space_horizontal_dir.y); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	normalize(bump_wind); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	bump_wind *= vec3(wind_strength, wind_vertical_strength, wind_strength); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	vec3 dir_to_character = character_position - MODEL_MATRIX[3].xyz; | 
					
						
							|  |  |  |  | 	float distance_to_character = length(dir_to_character); | 
					
						
							|  |  |  |  | 	float falloff = 1.0 - smoothstep(0.0, 1.0, distance_to_character/character_radius); | 
					
						
							|  |  |  |  | 	dir_to_character = (inverse(MODEL_MATRIX) * vec4(dir_to_character, 0.0)).xyz; | 
					
						
							|  |  |  |  | 	dir_to_character = normalize(dir_to_character); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	float falloff_curve = texture(character_distance_falloff_curve, vec2(falloff)).x; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	vec3 vertex_offset =  bump_wind * displacement_affect + normalize(-dir_to_character) * falloff_curve * character_push_strength * displacement_affect; | 
					
						
							|  |  |  |  | 	 | 
					
						
							|  |  |  |  | 	vertex_offset = smoothstep(0.0, 1.0, vertex_offset); // VERTEX.y越大,扰动幅度越大 | 
					
						
							|  |  |  |  | 	VERTEX += normalize(-dir_to_character) * falloff_curve * character_push_strength * displacement_affect; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void fragment() { | 
					
						
							|  |  |  |  | 	ALBEDO = texture(color_ramp, vec2(1.0 - UV.y, 0)).rgb ; | 
					
						
							|  |  |  |  | } |