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 059a409ec6a..0bf37130bb7 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 @@ -404,7 +404,27 @@ void vertex_shader(vec3 vertex_input, float roughness_highp = 1.0; +#ifdef USE_DOUBLE_PRECISION mat4 modelview = scene_data.view_matrix * model_matrix; + + // We separate the basis from the origin because the basis is fine with single point precision. + // Then we combine the translations from the model matrix and the view matrix using emulated doubles. + // We add the result to the vertex and ignore the final lost precision. + vec3 model_origin = model_matrix[3].xyz; + if (sc_multimesh()) { + modelview = modelview * matrix; + + vec3 instance_origin = mat3(model_matrix) * matrix[3].xyz; + model_origin = double_add_vec3(model_origin, model_precision, instance_origin, vec3(0.0), model_precision); + } + + // Overwrite the translation part of modelview with improved precision. + vec3 temp_precision; // Will be ignored. + modelview[3].xyz = double_add_vec3(model_origin, model_precision, scene_data.inv_view_matrix[3].xyz, view_precision, temp_precision); + modelview[3].xyz = mat3(scene_data.view_matrix) * modelview[3].xyz; +#else + mat4 modelview = scene_data.view_matrix * model_matrix; +#endif mat3 modelview_normal = mat3(scene_data.view_matrix) * model_normal_matrix; mat4 read_view_matrix = scene_data.view_matrix; vec2 read_viewport_size = scene_data.viewport_size; @@ -421,22 +441,8 @@ void vertex_shader(vec3 vertex_input, // using local coordinates (default) #if !defined(SKIP_TRANSFORM_USED) && !defined(VERTEX_WORLD_COORDS_USED) -#ifdef USE_DOUBLE_PRECISION - // We separate the basis from the origin because the basis is fine with single point precision. - // Then we combine the translations from the model matrix and the view matrix using emulated doubles. - // We add the result to the vertex and ignore the final lost precision. - vec3 model_origin = model_matrix[3].xyz; - if (sc_multimesh()) { - vertex = mat3(matrix) * vertex; - model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision); - } - vertex = mat3(inv_view_matrix * modelview) * vertex; - vec3 temp_precision; // Will be ignored. - vertex += double_add_vec3(model_origin, model_precision, scene_data.inv_view_matrix[3].xyz, view_precision, temp_precision); - vertex = mat3(scene_data.view_matrix) * vertex; -#else vertex = (modelview * vec4(vertex, 1.0)).xyz; -#endif + #ifdef NORMAL_USED normal = modelview_normal * normal; #endif 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 0c2b1f19515..0b47bd34398 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 @@ -432,10 +432,30 @@ void vertex_shader(in vec3 vertex, float roughness_highp = 1.0; - mat4 modelview = view_matrix * model_matrix; - mat3 modelview_normal = mat3(view_matrix) * model_normal_matrix; - mat4 read_view_matrix = view_matrix; - vec2 read_viewport_size = viewport_size; +#ifdef USE_DOUBLE_PRECISION + mat4 modelview = scene_data.view_matrix * model_matrix; + + // We separate the basis from the origin because the basis is fine with single point precision. + // Then we combine the translations from the model matrix and the view matrix using emulated doubles. + // We add the result to the vertex and ignore the final lost precision. + vec3 model_origin = model_matrix[3].xyz; + if (sc_multimesh()) { + modelview = modelview * matrix; + + vec3 instance_origin = mat3(model_matrix) * matrix[3].xyz; + model_origin = double_add_vec3(model_origin, model_precision, instance_origin, vec3(0.0), model_precision); + } + + // Overwrite the translation part of modelview with improved precision. + vec3 temp_precision; // Will be ignored. + modelview[3].xyz = double_add_vec3(model_origin, model_precision, scene_data.inv_view_matrix[3].xyz, view_precision, temp_precision); + modelview[3].xyz = mat3(scene_data.view_matrix) * modelview[3].xyz; +#else + mat4 modelview = scene_data.view_matrix * model_matrix; +#endif + mat3 modelview_normal = mat3(scene_data.view_matrix) * model_normal_matrix; + mat4 read_view_matrix = scene_data.view_matrix; + vec2 read_viewport_size = scene_data.viewport_size; { #CODE : VERTEX @@ -450,22 +470,8 @@ void vertex_shader(in vec3 vertex, // using local coordinates (default) #if !defined(SKIP_TRANSFORM_USED) && !defined(VERTEX_WORLD_COORDS_USED) -#ifdef USE_DOUBLE_PRECISION - // We separate the basis from the origin because the basis is fine with single point precision. - // Then we combine the translations from the model matrix and the view matrix using emulated doubles. - // We add the result to the vertex and ignore the final lost precision. - vec3 model_origin = model_matrix[3].xyz; - if (sc_multimesh()) { - vertex = mat3(matrix) * vertex; - model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision); - } - vertex = mat3(inv_view_matrix * modelview) * vertex; - vec3 temp_precision; - vertex += double_add_vec3(model_origin, model_precision, inv_view_matrix[3].xyz, view_precision, temp_precision); - vertex = mat3(view_matrix) * vertex; -#else vertex = (modelview * vec4(vertex, 1.0)).xyz; -#endif + #ifdef NORMAL_USED normal_highp = modelview_normal * normal_highp; #endif