From d2b855c49491643d7d0bcb4ad429e8e9403aa241 Mon Sep 17 00:00:00 2001 From: jsjtxietian Date: Sun, 10 Dec 2023 21:32:36 +0800 Subject: [PATCH] Add model_normal_matrix for fragment shader --- drivers/gles3/shaders/scene.glsl | 11 +++++++++++ .../forward_clustered/scene_forward_clustered.glsl | 8 ++++++++ .../shaders/forward_mobile/scene_forward_mobile.glsl | 7 +++++++ 3 files changed, 26 insertions(+) diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index 1d9ba623c45c..e7619bb7eeda 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -553,6 +553,8 @@ void main() { #define SHADER_IS_SRGB true +#define FLAGS_NON_UNIFORM_SCALE (1 << 4) + /* Varyings */ #if defined(COLOR_USED) @@ -878,6 +880,7 @@ vec2 multiview_uv(vec2 uv) { uniform highp mat4 world_transform; uniform mediump float opaque_prepass_threshold; +uniform highp uint model_flags; layout(location = 0) out vec4 frag_color; @@ -1332,6 +1335,14 @@ void main() { float alpha_antialiasing_edge = 0.0; vec2 alpha_texture_coordinate = vec2(0.0, 0.0); #endif // ALPHA_ANTIALIASING_EDGE_USED + + highp mat3 model_normal_matrix; + if (bool(model_flags & uint(FLAGS_NON_UNIFORM_SCALE))) { + model_normal_matrix = transpose(inverse(mat3(model_matrix))); + } else { + model_normal_matrix = mat3(model_matrix); + } + { #CODE : FRAGMENT } diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 604e623005ad..b0235695925f 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -979,6 +979,14 @@ void fragment_shader(in SceneData scene_data) { inv_view_matrix[1][3] = 0.0; inv_view_matrix[2][3] = 0.0; #endif + + mat3 model_normal_matrix; + if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_NON_UNIFORM_SCALE)) { + model_normal_matrix = transpose(inverse(mat3(read_model_matrix))); + } else { + model_normal_matrix = mat3(read_model_matrix); + } + mat4 read_view_matrix = scene_data.view_matrix; vec2 read_viewport_size = scene_data.viewport_size; { diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index a3774f0f1c0d..0d18cb0669ab 100644 --- a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -809,6 +809,13 @@ void main() { inv_view_matrix[2][3] = 0.0; #endif + mat3 model_normal_matrix; + if (bool(instances.data[draw_call.instance_index].flags & INSTANCE_FLAGS_NON_UNIFORM_SCALE)) { + model_normal_matrix = transpose(inverse(mat3(read_model_matrix))); + } else { + model_normal_matrix = mat3(read_model_matrix); + } + mat4 read_view_matrix = scene_data.view_matrix; vec2 read_viewport_size = scene_data.viewport_size;