59 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| shader_type spatial;
 | |
| 
 | |
| uniform sampler2D LAYER_1_ALBEDO : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_1_NORMAL_MAP : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_2_ALBEDO : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_2_NORMAL_MAP : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_3_ALBEDO : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_3_NORMAL_MAP : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_4_ALBEDO : hint_default_black;
 | |
| 
 | |
| uniform sampler2D LAYER_4_NORMAL_MAP : hint_default_black;
 | |
| 
 | |
| uniform float MAX_HEIGHT = 100.0;
 | |
| 
 | |
| uniform vec2 SIZE;
 | |
| 
 | |
| uniform sampler2D TERRAIN_MAP : hint_default_transparent, repeat_disable;
 | |
| 
 | |
| void fragment() {
 | |
| 	vec2 uv = UV * SIZE;
 | |
| 	vec2 uv_alt = uv * -0.25;
 | |
| 	vec3 splat_map = texture(TERRAIN_MAP, UV).rgb;
 | |
| 	float blank = clamp(1.0 - splat_map.r - splat_map.g - splat_map.b, 0.0, 1.0);
 | |
| 
 | |
| 	ALBEDO = blank * 0.5 * (texture(LAYER_1_ALBEDO, uv).rgb + texture(LAYER_1_ALBEDO, uv_alt).rgb);
 | |
| 	ALBEDO += splat_map.r * 0.5 * (texture(LAYER_2_ALBEDO, uv).rgb + texture(LAYER_2_ALBEDO, uv_alt).rgb);
 | |
| 	ALBEDO += splat_map.g * 0.5 * (texture(LAYER_3_ALBEDO, uv).rgb + texture(LAYER_3_ALBEDO, uv_alt).rgb);
 | |
| 	ALBEDO += splat_map.b * 0.5 * (texture(LAYER_4_ALBEDO, uv).rgb + texture(LAYER_4_ALBEDO, uv_alt).rgb);
 | |
| 
 | |
| 	NORMAL_MAP = blank * 0.5 * (texture(LAYER_1_NORMAL_MAP, uv).rgb + texture(LAYER_1_NORMAL_MAP, uv_alt).rgb);
 | |
| 	NORMAL_MAP += splat_map.r * 0.5 * (texture(LAYER_1_NORMAL_MAP, uv).rgb + texture(LAYER_2_NORMAL_MAP, uv_alt).rgb);
 | |
| 	NORMAL_MAP += splat_map.g * 0.5 * (texture(LAYER_2_NORMAL_MAP, uv).rgb + texture(LAYER_3_NORMAL_MAP, uv_alt).rgb);
 | |
| 	NORMAL_MAP += splat_map.b * 0.5 * (texture(LAYER_3_NORMAL_MAP, uv).rgb + texture(LAYER_4_NORMAL_MAP, uv_alt).rgb);
 | |
| }
 | |
| 
 | |
| float height(vec2 uv) {
 | |
| 	return MAX_HEIGHT * texture(TERRAIN_MAP, uv).a;
 | |
| }
 | |
| 
 | |
| void vertex() {
 | |
| 	VERTEX.y = height(UV);
 | |
| 
 | |
| 	vec2 texel_size = UV / SIZE;
 | |
| 
 | |
| 	vec4 h = vec4(
 | |
| 		height(UV + (texel_size * vec2(0, -1))),
 | |
| 		height(UV + (texel_size * vec2(-1, 0))),
 | |
| 		height(UV + (texel_size * vec2( 1, 0))),
 | |
| 		height(UV + (texel_size * vec2( 0, 1))));
 | |
| 
 | |
| 	NORMAL = normalize(vec3(h.y - h.z, 2.0, h.x - h.w));
 | |
| }
 |