From 8ad335eae0038f68ec5d87e821ca6454b4cf46a2 Mon Sep 17 00:00:00 2001 From: Kaleb Reid <78945904+Kaleb-Reid@users.noreply.github.com> Date: Tue, 26 Aug 2025 18:50:44 -0700 Subject: [PATCH] Divide screen texture by luminance multiplier in compatibility --- drivers/gles3/storage/material_storage.cpp | 1 + servers/rendering/shader_compiler.cpp | 24 ++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 87244fcc20c..4833641d1b4 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1423,6 +1423,7 @@ MaterialStorage::MaterialStorage() { actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; + actions.apply_luminance_multiplier = true; // apply luminance multiplier to screen texture actions.check_multiview_samplers = RasterizerGLES3::get_singleton()->is_xr_enabled(); actions.global_buffer_array_variable = "global_shader_uniforms"; actions.instance_uniform_index_variable = "instance_offset"; diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index 6f49a8fe4ec..e367b26df23 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -1323,18 +1323,22 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } code += data_type_name + "(" + node_code + ", " + sampler_name + ")"; - } else if (actions.check_multiview_samplers && correct_texture_uniform && RS::get_singleton()->is_low_end()) { + } else if (correct_texture_uniform && RS::get_singleton()->is_low_end()) { // Texture function on low end hardware (i.e. OpenGL). - // We just need to know if the texture supports multiview. if (shader->uniforms.has(texture_uniform)) { const ShaderLanguage::ShaderNode::Uniform &u = shader->uniforms[texture_uniform]; + if (actions.check_multiview_samplers) { + if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE) { + multiview_uv_needed = true; + } else if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { + multiview_uv_needed = true; + } else if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE) { + multiview_uv_needed = true; + } + } if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE) { - multiview_uv_needed = true; - } else if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - multiview_uv_needed = true; - } else if (u.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE) { - multiview_uv_needed = true; + is_screen_texture = true; } } @@ -1353,7 +1357,11 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } code += ")"; if (is_screen_texture && !texture_func_returns_data && actions.apply_luminance_multiplier) { - code = "(" + code + " * vec4(vec3(sc_luminance_multiplier()), 1.0))"; + if (RS::get_singleton()->is_low_end()) { + code = "(" + code + " / vec4(vec3(scene_data_block.data.luminance_multiplier), 1.0))"; + } else { + code = "(" + code + " * vec4(vec3(sc_luminance_multiplier()), 1.0))"; + } } if (is_normal_roughness_texture && !texture_func_returns_data) { code = "normal_roughness_compatibility(" + code + ")";