Browse Source

Merge pull request #86000 from jsjtxietian/add-missing-model_normal_matrix

Add `model_normal_matrix` for fragment shader
Rémi Verschelde 1 year ago
parent
commit
333f0f910f

+ 10 - 0
drivers/gles3/shaders/scene.glsl

@@ -583,6 +583,8 @@ void main() {
 
 
 #define SHADER_IS_SRGB true
 #define SHADER_IS_SRGB true
 
 
+#define FLAGS_NON_UNIFORM_SCALE (1 << 4)
+
 /* Varyings */
 /* Varyings */
 
 
 #if defined(COLOR_USED)
 #if defined(COLOR_USED)
@@ -955,6 +957,7 @@ ivec2 multiview_uv(ivec2 uv) {
 
 
 uniform highp mat4 world_transform;
 uniform highp mat4 world_transform;
 uniform mediump float opaque_prepass_threshold;
 uniform mediump float opaque_prepass_threshold;
+uniform highp uint model_flags;
 
 
 #if defined(RENDER_MATERIAL)
 #if defined(RENDER_MATERIAL)
 layout(location = 0) out vec4 albedo_output_buffer;
 layout(location = 0) out vec4 albedo_output_buffer;
@@ -1521,6 +1524,13 @@ void main() {
 	vec3 light_vertex = vertex;
 	vec3 light_vertex = vertex;
 #endif //LIGHT_VERTEX_USED
 #endif //LIGHT_VERTEX_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
 #CODE : FRAGMENT
 	}
 	}

+ 7 - 0
servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl

@@ -1030,6 +1030,13 @@ void fragment_shader(in SceneData scene_data) {
 	vec3 light_vertex = vertex;
 	vec3 light_vertex = vertex;
 #endif //LIGHT_VERTEX_USED
 #endif //LIGHT_VERTEX_USED
 
 
+	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;
 	mat4 read_view_matrix = scene_data.view_matrix;
 	vec2 read_viewport_size = scene_data.viewport_size;
 	vec2 read_viewport_size = scene_data.viewport_size;
 	{
 	{

+ 7 - 0
servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl

@@ -839,6 +839,13 @@ void main() {
 	vec3 light_vertex = vertex;
 	vec3 light_vertex = vertex;
 #endif //LIGHT_VERTEX_USED
 #endif //LIGHT_VERTEX_USED
 
 
+	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;
 	mat4 read_view_matrix = scene_data.view_matrix;
 	vec2 read_viewport_size = scene_data.viewport_size;
 	vec2 read_viewport_size = scene_data.viewport_size;