Skip to content

Commit fcda93b

Browse files
committed
macro variation as insert and simplify filter inserts
1 parent b38199f commit fcda93b

File tree

9 files changed

+78
-60
lines changed

9 files changed

+78
-60
lines changed

Terrain3D.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@
224224
<None Include="src\shaders\debug_views.glsl" />
225225
<None Include="src\shaders\displacement.glsl" />
226226
<None Include="src\shaders\displacement_buffer.glsl" />
227+
<None Include="src\shaders\macro_variation.glsl" />
227228
<None Include="src\shaders\main.glsl" />
228229
<None Include="src\shaders\overlays.glsl" />
229230
<None Include="src\shaders\pbr_views.glsl">

project/demo/Demo.tscn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ _shader_parameters = {
5252
&"macro_variation": true,
5353
"macro_variation1": Color(0.855, 0.8625, 0.9, 1),
5454
"macro_variation2": Color(0.9, 0.885, 0.81, 1),
55-
&"macro_variation_enabled": true,
5655
"macro_variation_slope": 0.333,
5756
"mipmap_bias": 1.0,
5857
&"mipmaps": null,
@@ -77,6 +76,7 @@ _shader_parameters = {
7776
world_background = 2
7877
auto_shader_enabled = true
7978
dual_scaling_enabled = true
79+
macro_variation_enabled = true
8080
displacement_sharpness = 0.25
8181

8282
[node name="Demo" type="Node"]

src/shaders/displacement_buffer.glsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ uniform highp sampler2DArray _height_maps : repeat_disable;
5454
uniform highp sampler2DArray _control_maps : repeat_disable;
5555
//INSERT: TEXTURE_SAMPLERS_NEAREST
5656
//INSERT: TEXTURE_SAMPLERS_LINEAR
57+
uniform highp sampler2DArray _texture_array_albedo : source_color, FILTER_METHOD, repeat_enable;
58+
uniform highp sampler2DArray _texture_array_normal : hint_normal, FILTER_METHOD, repeat_enable;
5759

5860
// Public uniforms
5961
group_uniforms general;

src/shaders/macro_variation.glsl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright © 2025 Cory Petkovsek, Roope Palmroos, and Contributors.
2+
3+
R"(
4+
5+
//INSERT: MACRO_VARIATION_UNIFORMS
6+
group_uniforms macro_variation;
7+
uniform vec3 macro_variation1 : source_color = vec3(1.);
8+
uniform vec3 macro_variation2 : source_color = vec3(1.);
9+
uniform float macro_variation_slope : hint_range(0., 1.) = 0.333;
10+
uniform highp sampler2D noise_texture : source_color, FILTER_METHOD, repeat_enable;
11+
uniform float noise1_scale : hint_range(0.001, 1.) = 0.04; // Used for macro variation 1. Scaled up 10x
12+
uniform float noise1_angle : hint_range(0, 6.283) = 0.;
13+
uniform vec2 noise1_offset = vec2(0.5);
14+
uniform float noise2_scale : hint_range(0.001, 1.) = 0.076; // Used for macro variation 2. Scaled up 10x
15+
group_uniforms;
16+
17+
//INSERT: MACRO_VARIATION
18+
// Macro variation. 2 lookups
19+
{
20+
float noise1 = texture(noise_texture, rotate_vec2(fma(uv, vec2(noise1_scale * .1), noise1_offset) , vec2(cos(noise1_angle), sin(noise1_angle)))).r;
21+
float noise2 = texture(noise_texture, uv * noise2_scale * .1).r;
22+
vec3 macrov = mix(macro_variation1, vec3(1.), noise1);
23+
macrov *= mix(macro_variation2, vec3(1.), noise2);
24+
mat.albedo_height.rgb *= mix(vec3(1.0), macrov, clamp(w_normal.y + macro_variation_slope, 0., 1.));
25+
}
26+
27+
)"

src/shaders/main.glsl

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ uniform highp sampler2DArray _height_maps : repeat_disable;
7171
uniform highp sampler2DArray _control_maps : repeat_disable;
7272
//INSERT: TEXTURE_SAMPLERS_NEAREST
7373
//INSERT: TEXTURE_SAMPLERS_LINEAR
74+
uniform highp sampler2DArray _color_maps : source_color, FILTER_METHOD, repeat_disable;
75+
uniform highp sampler2DArray _texture_array_albedo : source_color, FILTER_METHOD, repeat_enable;
76+
uniform highp sampler2DArray _texture_array_normal : hint_normal, FILTER_METHOD, repeat_enable;
7477
// Public uniforms
7578

7679
group_uniforms general;
@@ -84,18 +87,7 @@ group_uniforms;
8487
//INSERT: AUTO_SHADER_UNIFORMS
8588
//INSERT: DISPLACEMENT_UNIFORMS
8689
//INSERT: DUAL_SCALING_UNIFORMS
87-
group_uniforms macro_variation;
88-
uniform bool macro_variation_enabled = true;
89-
uniform vec3 macro_variation1 : source_color = vec3(1.);
90-
uniform vec3 macro_variation2 : source_color = vec3(1.);
91-
uniform float macro_variation_slope : hint_range(0., 1.) = 0.333;
92-
//INSERT: NOISE_SAMPLER_NEAREST
93-
//INSERT: NOISE_SAMPLER_LINEAR
94-
uniform float noise1_scale : hint_range(0.001, 1.) = 0.04; // Used for macro variation 1. Scaled up 10x
95-
uniform float noise1_angle : hint_range(0, 6.283) = 0.;
96-
uniform vec2 noise1_offset = vec2(0.5);
97-
uniform float noise2_scale : hint_range(0.001, 1.) = 0.076; // Used for macro variation 2. Scaled up 10x
98-
group_uniforms;
90+
//INSERT: MACRO_VARIATION_UNIFORMS
9991

10092
group_uniforms mipmaps;
10193
uniform float bias_distance : hint_range(0.0, 16384.0, 0.1) = 512.0;
@@ -620,21 +612,13 @@ void fragment() {
620612
mat.ao *= weight_inv;
621613
mat.ao_affect *= weight_inv;
622614

623-
// Macro variation. 2 lookups
624-
vec3 macrov = vec3(1.);
625-
if (macro_variation_enabled) {
626-
float noise1 = texture(noise_texture, rotate_vec2(fma(uv, vec2(noise1_scale * .1), noise1_offset) , vec2(cos(noise1_angle), sin(noise1_angle)))).r;
627-
float noise2 = texture(noise_texture, uv * noise2_scale * .1).r;
628-
macrov = mix(macro_variation1, vec3(1.), noise1);
629-
macrov *= mix(macro_variation2, vec3(1.), noise2);
630-
macrov = mix(vec3(1.0), macrov, clamp(w_normal.y + macro_variation_slope, 0., 1.));
631-
}
615+
//INSERT: MACRO_VARIATION
632616

633617
// Wetness/roughness modifier, converting 0 - 1 range to -1 to 1 range, clamped to Godot roughness values
634618
float roughness = clamp(fma(color_map.a - 0.5, 2.0, mat.normal_rough.a), 0., 1.);
635619

636620
// Apply PBR
637-
ALBEDO = mat.albedo_height.rgb * color_map.rgb * macrov;
621+
ALBEDO = mat.albedo_height.rgb * color_map.rgb;
638622
ROUGHNESS = roughness;
639623
SPECULAR = 1. - mat.normal_rough.a;
640624
// Repack final normal map value.

src/shaders/samplers.glsl

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,10 @@ R"(
44

55
//INSERT: TEXTURE_SAMPLERS_LINEAR
66
#define FILTER_LINEAR
7-
uniform highp sampler2DArray _color_maps : source_color, filter_linear_mipmap_anisotropic, repeat_disable;
8-
uniform highp sampler2DArray _texture_array_albedo : source_color, filter_linear_mipmap_anisotropic, repeat_enable;
9-
uniform highp sampler2DArray _texture_array_normal : hint_normal, filter_linear_mipmap_anisotropic, repeat_enable;
7+
#define FILTER_METHOD filter_linear_mipmap_anisotropic
108

119
//INSERT: TEXTURE_SAMPLERS_NEAREST
1210
#define FILTER_NEAREST
13-
uniform highp sampler2DArray _color_maps : source_color, filter_nearest_mipmap_anisotropic, repeat_disable;
14-
uniform highp sampler2DArray _texture_array_albedo : source_color, filter_nearest_mipmap_anisotropic, repeat_enable;
15-
uniform highp sampler2DArray _texture_array_normal : hint_normal, filter_nearest_mipmap_anisotropic, repeat_enable;
16-
17-
//INSERT: NOISE_SAMPLER_LINEAR
18-
uniform highp sampler2D noise_texture : source_color, filter_linear_mipmap_anisotropic, repeat_enable;
19-
20-
//INSERT: NOISE_SAMPLER_NEAREST
21-
uniform highp sampler2D noise_texture : source_color, filter_nearest_mipmap_anisotropic, repeat_enable;
11+
#define FILTER_METHOD filter_nearest_mipmap_anisotropic
2212

2313
)"

src/terrain_3d_data.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ Vector3 Terrain3DData::get_texture_id(const Vector3 &p_global_position) const {
754754
// If material available, autoshader enabled, and pixel set to auto
755755
if (_terrain) {
756756
Ref<Terrain3DMaterial> t_material = _terrain->get_material();
757-
bool auto_enabled = t_material->get_auto_shader();
757+
bool auto_enabled = t_material->get_auto_shader_enabled();
758758
bool control_auto = is_auto(src);
759759
if (auto_enabled && control_auto) {
760760
real_t auto_slope = real_t(t_material->get_shader_param("auto_slope"));

src/terrain_3d_material.cpp

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ void Terrain3DMaterial::_preload_shaders() {
3939
#include "shaders/displacement.glsl"
4040
, "displacement");
4141
_parse_shader(
42+
#include "shaders/macro_variation.glsl"
43+
, "displacement");
44+
_parse_shader(
4245
#include "shaders/debug_views.glsl"
4346
, "debug_views");
4447
_parse_shader(
@@ -147,22 +150,23 @@ String Terrain3DMaterial::_generate_shader_code() const {
147150
}
148151
if (_texture_filtering == LINEAR) {
149152
excludes.push_back("TEXTURE_SAMPLERS_NEAREST");
150-
excludes.push_back("NOISE_SAMPLER_NEAREST");
151153
} else {
152154
excludes.push_back("TEXTURE_SAMPLERS_LINEAR");
153-
excludes.push_back("NOISE_SAMPLER_LINEAR");
154155
}
155-
if (!_auto_shader) {
156+
if (!_auto_shader_enabled) {
156157
excludes.push_back("AUTO_SHADER_UNIFORMS");
157158
excludes.push_back("AUTO_SHADER");
158159
}
159-
if (!_dual_scaling) {
160+
if (!_dual_scaling_enabled) {
160161
excludes.push_back("DUAL_SCALING_UNIFORMS");
161162
excludes.push_back("DUAL_SCALING");
162163
excludes.push_back("DUAL_SCALING_CONDITION_0");
163164
excludes.push_back("DUAL_SCALING_CONDITION_1");
164165
excludes.push_back("DUAL_SCALING_MIX");
165-
excludes.push_back("TRI_SCALING");
166+
}
167+
if (!_macro_variation_enabled) {
168+
excludes.push_back("MACRO_VARIATION_UNIFORMS");
169+
excludes.push_back("MACRO_VARIATION");
166170
}
167171
if (_terrain->get_tessellation_level() == 0) {
168172
excludes.push_back("DISPLACEMENT_UNIFORMS");
@@ -268,12 +272,10 @@ String Terrain3DMaterial::_generate_buffer_shader_code() {
268272
Array excludes;
269273
if (_texture_filtering == LINEAR) {
270274
excludes.push_back("TEXTURE_SAMPLERS_NEAREST");
271-
excludes.push_back("NOISE_SAMPLER_NEAREST");
272275
} else {
273276
excludes.push_back("TEXTURE_SAMPLERS_LINEAR");
274-
excludes.push_back("NOISE_SAMPLER_LINEAR");
275277
}
276-
if (!_auto_shader) {
278+
if (!_auto_shader_enabled) {
277279
excludes.push_back("AUTO_SHADER_UNIFORMS");
278280
excludes.push_back("AUTO_SHADER");
279281
}
@@ -731,18 +733,24 @@ void Terrain3DMaterial::set_texture_filtering(const TextureFiltering p_filtering
731733
_update_shader();
732734
}
733735

734-
void Terrain3DMaterial::set_auto_shader(const bool p_enabled) {
735-
SET_IF_DIFF(_auto_shader, p_enabled);
736+
void Terrain3DMaterial::set_auto_shader_enabled(const bool p_enabled) {
737+
SET_IF_DIFF(_auto_shader_enabled, p_enabled);
736738
LOG(INFO, "Enable auto shader: ", p_enabled);
737739
_update_shader();
738740
}
739741

740-
void Terrain3DMaterial::set_dual_scaling(const bool p_enabled) {
741-
SET_IF_DIFF(_dual_scaling, p_enabled);
742+
void Terrain3DMaterial::set_dual_scaling_enabled(const bool p_enabled) {
743+
SET_IF_DIFF(_dual_scaling_enabled, p_enabled);
742744
LOG(INFO, "Enable dual scaling: ", p_enabled);
743745
_update_shader();
744746
}
745747

748+
void Terrain3DMaterial::set_macro_variation_enabled(const bool p_enabled) {
749+
SET_IF_DIFF(_macro_variation_enabled, p_enabled);
750+
LOG(INFO, "Enable macro variation: ", p_enabled);
751+
_update_shader();
752+
}
753+
746754
void Terrain3DMaterial::set_shader_override_enabled(const bool p_enabled) {
747755
SET_IF_DIFF(_shader_override_enabled, p_enabled);
748756
LOG(INFO, "Enable shader override: ", p_enabled);
@@ -1169,10 +1177,12 @@ void Terrain3DMaterial::_bind_methods() {
11691177
ClassDB::bind_method(D_METHOD("get_world_background"), &Terrain3DMaterial::get_world_background);
11701178
ClassDB::bind_method(D_METHOD("set_texture_filtering", "filtering"), &Terrain3DMaterial::set_texture_filtering);
11711179
ClassDB::bind_method(D_METHOD("get_texture_filtering"), &Terrain3DMaterial::get_texture_filtering);
1172-
ClassDB::bind_method(D_METHOD("set_auto_shader", "enabled"), &Terrain3DMaterial::set_auto_shader);
1173-
ClassDB::bind_method(D_METHOD("get_auto_shader"), &Terrain3DMaterial::get_auto_shader);
1174-
ClassDB::bind_method(D_METHOD("set_dual_scaling", "enabled"), &Terrain3DMaterial::set_dual_scaling);
1175-
ClassDB::bind_method(D_METHOD("get_dual_scaling"), &Terrain3DMaterial::get_dual_scaling);
1180+
ClassDB::bind_method(D_METHOD("set_auto_shader_enabled", "enabled"), &Terrain3DMaterial::set_auto_shader_enabled);
1181+
ClassDB::bind_method(D_METHOD("get_auto_shader_enabled"), &Terrain3DMaterial::get_auto_shader_enabled);
1182+
ClassDB::bind_method(D_METHOD("set_dual_scaling_enabled", "enabled"), &Terrain3DMaterial::set_dual_scaling_enabled);
1183+
ClassDB::bind_method(D_METHOD("get_dual_scaling_enabled"), &Terrain3DMaterial::get_dual_scaling_enabled);
1184+
ClassDB::bind_method(D_METHOD("set_macro_variation_enabled", "enabled"), &Terrain3DMaterial::set_macro_variation_enabled);
1185+
ClassDB::bind_method(D_METHOD("get_macro_variation_enabled"), &Terrain3DMaterial::get_macro_variation_enabled);
11761186

11771187
ClassDB::bind_method(D_METHOD("set_shader_override_enabled", "enabled"), &Terrain3DMaterial::set_shader_override_enabled);
11781188
ClassDB::bind_method(D_METHOD("is_shader_override_enabled"), &Terrain3DMaterial::is_shader_override_enabled);
@@ -1246,8 +1256,9 @@ void Terrain3DMaterial::_bind_methods() {
12461256
// These must be different from the names of uniform groups
12471257
ADD_PROPERTY(PropertyInfo(Variant::INT, "world_background", PROPERTY_HINT_ENUM, "None,Flat,Noise"), "set_world_background", "get_world_background");
12481258
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_filtering", PROPERTY_HINT_ENUM, "Linear,Nearest"), "set_texture_filtering", "get_texture_filtering");
1249-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_shader_enabled"), "set_auto_shader", "get_auto_shader");
1250-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dual_scaling_enabled"), "set_dual_scaling", "get_dual_scaling");
1259+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_shader_enabled"), "set_auto_shader_enabled", "get_auto_shader_enabled");
1260+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dual_scaling_enabled"), "set_dual_scaling_enabled", "get_dual_scaling_enabled");
1261+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "macro_variation_enabled"), "set_macro_variation_enabled", "get_macro_variation_enabled");
12511262
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shader_override_enabled"), "set_shader_override_enabled", "is_shader_override_enabled");
12521263
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shader_override", PROPERTY_HINT_RESOURCE_TYPE, "Shader"), "set_shader_override", "get_shader_override");
12531264

src/terrain_3d_material.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ class Terrain3DMaterial : public Resource {
4747
// Material Features
4848
WorldBackground _world_background = FLAT;
4949
TextureFiltering _texture_filtering = LINEAR;
50-
bool _dual_scaling = false;
51-
bool _auto_shader = false;
50+
bool _dual_scaling_enabled = false;
51+
bool _auto_shader_enabled = false;
52+
bool _macro_variation_enabled = false;
5253

5354
// Overlays
5455
bool _show_region_grid = false;
@@ -116,10 +117,12 @@ class Terrain3DMaterial : public Resource {
116117
WorldBackground get_world_background() const { return _world_background; }
117118
void set_texture_filtering(const TextureFiltering p_filtering);
118119
TextureFiltering get_texture_filtering() const { return _texture_filtering; }
119-
void set_auto_shader(const bool p_enabled);
120-
bool get_auto_shader() const { return _auto_shader; }
121-
void set_dual_scaling(const bool p_enabled);
122-
bool get_dual_scaling() const { return _dual_scaling; }
120+
void set_auto_shader_enabled(const bool p_enabled);
121+
bool get_auto_shader_enabled() const { return _auto_shader_enabled; }
122+
void set_dual_scaling_enabled(const bool p_enabled);
123+
bool get_dual_scaling_enabled() const { return _dual_scaling_enabled; }
124+
void set_macro_variation_enabled(const bool p_enabled);
125+
bool get_macro_variation_enabled() const { return _macro_variation_enabled; }
123126

124127
void set_shader_override_enabled(const bool p_enabled);
125128
bool is_shader_override_enabled() const { return _shader_override_enabled; }

0 commit comments

Comments
 (0)