chore: added terrain shader & material
This commit is contained in:
parent
0cdfba5707
commit
957a39af14
4 changed files with 209 additions and 0 deletions
57
project/assets/style/terrain_material.tres
Normal file
57
project/assets/style/terrain_material.tres
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
[gd_resource type="ShaderMaterial" format=3 uid="uid://b2gybv8h8h0u0"]
|
||||
|
||||
[ext_resource type="Material" uid="uid://xkuv2ykmgtvy" path="res://assets/style/terrain_outline_material.tres" id="1_3a5j4"]
|
||||
[ext_resource type="Shader" uid="uid://c60nelvuk52q5" path="res://assets/style/terrain_shader.gdshader" id="1_8t1yb"]
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_3a5j4"]
|
||||
colors = PackedColorArray(0.26064, 0.36, 0.1944, 1, 0.30121058, 0.44419527, 0.22999996, 1)
|
||||
|
||||
[sub_resource type="FastNoiseLite" id="FastNoiseLite_2vqw0"]
|
||||
frequency = 0.005
|
||||
fractal_gain = 0.818
|
||||
fractal_weighted_strength = 0.25
|
||||
|
||||
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_2skdn"]
|
||||
width = 1024
|
||||
height = 1024
|
||||
noise = SubResource("FastNoiseLite_2vqw0")
|
||||
color_ramp = SubResource("Gradient_3a5j4")
|
||||
seamless = true
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_2vqw0"]
|
||||
colors = PackedColorArray(0.5593756, 0.55937564, 0.5593755, 1, 0.4236506, 0.42365065, 0.42365053, 1)
|
||||
|
||||
[sub_resource type="FastNoiseLite" id="FastNoiseLite_2skdn"]
|
||||
noise_type = 0
|
||||
frequency = 0.0192
|
||||
|
||||
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_pkl7k"]
|
||||
noise = SubResource("FastNoiseLite_2skdn")
|
||||
color_ramp = SubResource("Gradient_2vqw0")
|
||||
seamless = true
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
next_pass = ExtResource("1_3a5j4")
|
||||
shader = ExtResource("1_8t1yb")
|
||||
shader_parameter/floor_1_albedo = SubResource("NoiseTexture2D_2skdn")
|
||||
shader_parameter/floor_1_roughness = 0.7
|
||||
shader_parameter/floor_1_tiling = 3.0
|
||||
shader_parameter/floor_1_specular = 0.5
|
||||
shader_parameter/floor_1_metallic = 0.5
|
||||
shader_parameter/floor_2_roughness = 0.7
|
||||
shader_parameter/floor_2_tiling = 500.0
|
||||
shader_parameter/floor_2_specular = 0.5
|
||||
shader_parameter/floor_2_metallic = 0.5
|
||||
shader_parameter/floor_3_roughness = 0.7
|
||||
shader_parameter/floor_3_tiling = 500.0
|
||||
shader_parameter/floor_3_specular = 0.5
|
||||
shader_parameter/floor_3_metallic = 0.5
|
||||
shader_parameter/region_blending = 1.0
|
||||
shader_parameter/slope_threshold = 0.315
|
||||
shader_parameter/slope_blend_distance = 0.05
|
||||
shader_parameter/slope_albedo = SubResource("NoiseTexture2D_pkl7k")
|
||||
shader_parameter/slope_tiling = 0.01
|
||||
shader_parameter/slope_roughness = 0.7
|
||||
shader_parameter/slope_specular = 0.5
|
||||
shader_parameter/slope_metallic = 0.5
|
||||
32
project/assets/style/terrain_outline_material.tres
Normal file
32
project/assets/style/terrain_outline_material.tres
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
[gd_resource type="StandardMaterial3D" format=3 uid="uid://xkuv2ykmgtvy"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_e6s0j"]
|
||||
render_priority = 1
|
||||
transparency = 2
|
||||
alpha_scissor_threshold = 1.0
|
||||
alpha_antialiasing_mode = 0
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0, 0, 0, 1)
|
||||
grow = true
|
||||
grow_amount = 0.239
|
||||
proximity_fade_enabled = true
|
||||
proximity_fade_distance = 7.82
|
||||
stencil_mode = 3
|
||||
stencil_flags = 1
|
||||
stencil_compare = 5
|
||||
metadata/_stencil_owned = true
|
||||
|
||||
[resource]
|
||||
next_pass = SubResource("StandardMaterial3D_e6s0j")
|
||||
transparency = 2
|
||||
alpha_scissor_threshold = 1.0
|
||||
alpha_antialiasing_mode = 0
|
||||
cull_mode = 1
|
||||
shading_mode = 0
|
||||
diffuse_mode = 3
|
||||
specular_mode = 2
|
||||
albedo_color = Color(1, 1, 1, 0)
|
||||
proximity_fade_distance = 0.1
|
||||
stencil_mode = 1
|
||||
stencil_flags = 2
|
||||
stencil_outline_thickness = 0.0
|
||||
119
project/assets/style/terrain_shader.gdshader
Normal file
119
project/assets/style/terrain_shader.gdshader
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
shader_type spatial;
|
||||
render_mode blend_mix, depth_draw_opaque, diffuse_lambert, specular_schlick_ggx, skip_vertex_transform;
|
||||
|
||||
varying vec3 var_model_normal;
|
||||
varying vec3 var_vertex_position;
|
||||
|
||||
group_uniforms Floor1;
|
||||
uniform sampler2D floor_1_albedo : source_color, hint_default_black, filter_linear_mipmap;
|
||||
uniform sampler2D floor_1_normal : hint_normal, filter_linear_mipmap;
|
||||
uniform float floor_1_roughness = 0.7;
|
||||
uniform float floor_1_tiling = 500.0;
|
||||
uniform float floor_1_specular = 0.5;
|
||||
uniform float floor_1_metallic = 0.5;
|
||||
|
||||
group_uniforms Floor2;
|
||||
uniform sampler2D floor_2_albedo : source_color, hint_default_black, filter_linear_mipmap;
|
||||
uniform sampler2D floor_2_normal : hint_normal, filter_linear_mipmap;
|
||||
uniform float floor_2_roughness = 0.7;
|
||||
uniform float floor_2_tiling = 500.0;
|
||||
uniform float floor_2_specular = 0.5;
|
||||
uniform float floor_2_metallic = 0.5;
|
||||
|
||||
group_uniforms Floor3;
|
||||
uniform sampler2D floor_3_albedo : source_color, hint_default_black, filter_linear_mipmap;
|
||||
uniform sampler2D floor_3_normal : hint_normal, filter_linear_mipmap;
|
||||
uniform float floor_3_roughness = 0.7;
|
||||
uniform float floor_3_tiling = 500.0;
|
||||
uniform float floor_3_specular = 0.5;
|
||||
uniform float floor_3_metallic = 0.5;
|
||||
|
||||
group_uniforms Regions;
|
||||
uniform sampler2D floor_region_map : hint_default_black, filter_linear_mipmap;
|
||||
uniform float region_blending : hint_range(0, 10) = 1.0;
|
||||
|
||||
group_uniforms Slope.Textures;
|
||||
uniform sampler2D slope_albedo : source_color, hint_default_white;
|
||||
uniform sampler2D slope_normal : hint_normal, filter_linear_mipmap;
|
||||
|
||||
uniform float slope_tiling = 100.0;
|
||||
uniform float slope_roughness = 0.7;
|
||||
uniform float slope_specular = 0.5;
|
||||
uniform float slope_metallic = 0.5;
|
||||
|
||||
group_uniforms; group_uniforms Slope;
|
||||
uniform float slope_threshold = 0.9;
|
||||
uniform float slope_blend_distance = 0.05;
|
||||
|
||||
void vertex() {
|
||||
var_model_normal = NORMAL;
|
||||
var_vertex_position = (vec4(VERTEX, 1.0) * MODEL_MATRIX).xyz;
|
||||
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||
NORMAL = normalize(MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
|
||||
TANGENT = normalize(MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz;
|
||||
BINORMAL = normalize(MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz;
|
||||
}
|
||||
|
||||
vec3 lerp(vec3 a, vec3 b, float t) {
|
||||
return (1.0 - t) * a + b * t;
|
||||
}
|
||||
|
||||
float lerpf(float a, float b, float t) {
|
||||
return (1.0 - t) * a + b * t;
|
||||
}
|
||||
|
||||
vec2 lerp2(vec2 a, vec2 b, float t) {
|
||||
return (1.0 - t) * a + b * t;
|
||||
}
|
||||
|
||||
// adapted from https://github.com/Experience-Monks/glsl-fast-gaussian-blur/blob/master/9.glsl
|
||||
vec4 sample_texture_blurred(sampler2D tex, vec2 uv) {
|
||||
if(region_blending == 0.0) // short-circuit for zero case
|
||||
return texture(tex, uv);
|
||||
vec4 color = vec4(0.0);
|
||||
vec2 resolution = vec2(textureSize(tex, 0));
|
||||
vec2 offset_1 = vec2(1.3846153846) * region_blending;
|
||||
vec2 offset_2 = vec2(3.2307692308) * region_blending;
|
||||
// add weighted samples. Magic numbers are pre-computed gaussian function results
|
||||
color += texture(tex, uv) * 0.2270270270;
|
||||
color += texture(tex, uv + (offset_1 / resolution)) * 0.3162162162;
|
||||
color += texture(tex, uv - (offset_1 / resolution)) * 0.3162162162;
|
||||
color += texture(tex, uv + (offset_2 / resolution)) * 0.0702702703;
|
||||
color += texture(tex, uv - (offset_2 / resolution)) * 0.0702702703;
|
||||
return color;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
float slope_blend = clamp(slope_threshold + ((acos(abs(var_model_normal.y)) / (PI * 0.5) - slope_threshold) * 1.0/slope_blend_distance), 0.0, 1.0);
|
||||
|
||||
vec4 region_masks = sample_texture_blurred(floor_region_map, UV);
|
||||
vec2 sqr_normal = normalize(var_model_normal.xz * var_model_normal.xz);
|
||||
float biplanar_index = round(abs(sqr_normal.x));
|
||||
vec2 slope_uv = lerp2(var_vertex_position.xy, var_vertex_position.yz, biplanar_index);
|
||||
|
||||
ALBEDO = texture(floor_1_albedo, UV * floor_1_tiling).xyz;
|
||||
ALBEDO = lerp(ALBEDO, texture(floor_2_albedo, UV * floor_2_tiling).xyz, region_masks.x);
|
||||
ALBEDO = lerp(ALBEDO, texture(floor_3_albedo, UV * floor_3_tiling).xyz, region_masks.y);
|
||||
ALBEDO = lerp(ALBEDO, texture(slope_albedo, slope_uv * slope_tiling).xyz, slope_blend);
|
||||
//ALBEDO = region_masks.xyz;
|
||||
|
||||
NORMAL_MAP = texture(floor_1_normal, UV * floor_1_tiling).xyz;
|
||||
NORMAL_MAP = lerp(NORMAL_MAP, texture(floor_2_normal, UV * floor_2_tiling).xyz, region_masks.x);
|
||||
NORMAL_MAP = lerp(NORMAL_MAP, texture(floor_3_normal, UV * floor_3_tiling).xyz, region_masks.y);
|
||||
NORMAL_MAP = lerp(NORMAL_MAP, texture(slope_normal, slope_uv * slope_tiling).xyz, slope_blend);
|
||||
|
||||
SPECULAR = floor_1_specular;
|
||||
SPECULAR = lerpf(SPECULAR, floor_2_specular, region_masks.x);
|
||||
SPECULAR = lerpf(SPECULAR, floor_3_specular, region_masks.y);
|
||||
SPECULAR = lerpf(SPECULAR, slope_specular, slope_blend);
|
||||
|
||||
ROUGHNESS = floor_1_roughness;
|
||||
ROUGHNESS = lerpf(ROUGHNESS, floor_2_roughness, region_masks.x);
|
||||
ROUGHNESS = lerpf(ROUGHNESS, floor_3_roughness, region_masks.y);
|
||||
ROUGHNESS = lerpf(ROUGHNESS, slope_roughness, slope_blend);
|
||||
|
||||
METALLIC = floor_1_metallic;
|
||||
METALLIC = lerpf(METALLIC, floor_2_metallic, region_masks.x);
|
||||
METALLIC = lerpf(METALLIC, floor_3_metallic, region_masks.y);
|
||||
METALLIC = lerpf(METALLIC, slope_metallic, slope_blend);
|
||||
}
|
||||
1
project/assets/style/terrain_shader.gdshader.uid
Normal file
1
project/assets/style/terrain_shader.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://c60nelvuk52q5
|
||||
Loading…
Add table
Add a link
Reference in a new issue