From c7276273d8451268f1c2ffa44c9f60168ec6807a Mon Sep 17 00:00:00 2001 From: clayjohn Date: Fri, 3 Oct 2025 12:44:34 -0700 Subject: [PATCH] Fix scene shader crash due to rename of view matrix and inverse view matrix --- .../scene_shader_forward_clustered.cpp | 6 +++--- .../scene_shader_forward_mobile.cpp | 6 +++--- .../shaders/scene_forward_lights_inc.glsl | 19 +++++++++++++++---- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index d09bae814fc..f6714580bd7 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -762,10 +762,10 @@ void SceneShaderForwardClustered::init(const String p_defines) { actions.renames["LIGHT_VERTEX"] = "light_vertex"; actions.renames["NODE_POSITION_WORLD"] = "read_model_matrix[3].xyz"; - actions.renames["CAMERA_POSITION_WORLD"] = "scene_data.inv_view_matrix[3].xyz"; - actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data.inv_view_matrix[2].xyz"; + actions.renames["CAMERA_POSITION_WORLD"] = "inv_view_matrix[3].xyz"; + actions.renames["CAMERA_DIRECTION_WORLD"] = "inv_view_matrix[2].xyz"; actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data.camera_visible_layers"; - actions.renames["NODE_POSITION_VIEW"] = "(scene_data.view_matrix * read_model_matrix)[3].xyz"; + actions.renames["NODE_POSITION_VIEW"] = "(read_view_matrix * read_model_matrix)[3].xyz"; actions.renames["VIEW_INDEX"] = "ViewIndex"; actions.renames["VIEW_MONO_LEFT"] = "0"; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index fae637c3706..c939ad1f4c0 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -696,10 +696,10 @@ void SceneShaderForwardMobile::init(const String p_defines) { actions.renames["LIGHT_VERTEX"] = "light_vertex"; actions.renames["NODE_POSITION_WORLD"] = "read_model_matrix[3].xyz"; - actions.renames["CAMERA_POSITION_WORLD"] = "scene_data.inv_view_matrix[3].xyz"; - actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data.inv_view_matrix[2].xyz"; + actions.renames["CAMERA_POSITION_WORLD"] = "inv_view_matrix[3].xyz"; + actions.renames["CAMERA_DIRECTION_WORLD"] = "inv_view_matrix[2].xyz"; actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data.camera_visible_layers"; - actions.renames["NODE_POSITION_VIEW"] = "(scene_data.view_matrix * read_model_matrix)[3].xyz"; + actions.renames["NODE_POSITION_VIEW"] = "(read_view_matrix * read_model_matrix)[3].xyz"; actions.renames["VIEW_INDEX"] = "ViewIndex"; actions.renames["VIEW_MONO_LEFT"] = "0"; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index 9d8db2401bf..9b4643325af 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -81,15 +81,26 @@ void light_compute(hvec3 N, hvec3 L, hvec3 V, half A, hvec3 light_color, bool is inout hvec3 diffuse_light, inout hvec3 specular_light) { #if defined(LIGHT_CODE_USED) // Light is written by the user shader. - mat4 inv_view_matrix = scene_data_block.data.inv_view_matrix; - mat4 read_view_matrix = scene_data_block.data.view_matrix; + mat4 inv_view_matrix = transpose(mat4(scene_data_block.data.inv_view_matrix[0], + scene_data_block.data.inv_view_matrix[1], + scene_data_block.data.inv_view_matrix[2], + vec4(0.0, 0.0, 0.0, 1.0))); + mat4 read_view_matrix = transpose(mat4(scene_data_block.data.view_matrix[0], + scene_data_block.data.view_matrix[1], + scene_data_block.data.view_matrix[2], + vec4(0.0, 0.0, 0.0, 1.0))); #ifdef USING_MOBILE_RENDERER - mat4 read_model_matrix = instances.data[draw_call.instance_index].transform; + uint instance_index = draw_call.instance_index; #else - mat4 read_model_matrix = instances.data[instance_index_interp].transform; + uint instance_index = instance_index_interp; #endif + mat4 read_model_matrix = transpose(mat4(instances.data[instance_index].transform[0], + instances.data[instance_index].transform[1], + instances.data[instance_index].transform[2], + vec4(0.0, 0.0, 0.0, 1.0))); + #undef projection_matrix #define projection_matrix scene_data_block.data.projection_matrix #undef inv_projection_matrix