diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 8e86a7a0406..8ba77f36acf 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1134,6 +1134,10 @@
Lower-end override for [member rendering/quality/shading/force_lambert_over_burley] on mobile devices, due to performance concerns or driver support.
+
+ If [code]true[/code] and available on the target device, enables high floating point precision for all shader computations in GLES2.
+ [b]Warning:[/b] High floating point precision can be extremely slow on older devices and is often not available at all. Use with caution.
+
If [code]true[/code], forces vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can be used to optimize performance on low-end mobile devices.
diff --git a/drivers/gles2/shader_gles2.cpp b/drivers/gles2/shader_gles2.cpp
index dc422f70a8f..8f1d40358c5 100644
--- a/drivers/gles2/shader_gles2.cpp
+++ b/drivers/gles2/shader_gles2.cpp
@@ -32,6 +32,7 @@
#include "core/os/memory.h"
#include "core/print_string.h"
+#include "core/project_settings.h"
#include "core/string_builder.h"
#include "rasterizer_gles2.h"
#include "rasterizer_storage_gles2.h"
@@ -180,6 +181,12 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
strings.push_back("#define USE_HIGHP_PRECISION\n");
#endif
+ if (GLOBAL_GET("rendering/gles2/compatibility/enable_high_float.Android")) {
+ // enable USE_HIGHP_PRECISION but safeguarded by an availability check as highp support is optional in GLES2
+ // see Section 4.5.4 of the GLSL_ES_Specification_1.00
+ strings.push_back("#ifdef GL_FRAGMENT_PRECISION_HIGH\n #define USE_HIGHP_PRECISION\n#endif\n");
+ }
+
#endif
#ifdef ANDROID_ENABLED
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index 71502cad741..d88ef711da7 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -2444,6 +2444,7 @@ VisualServer::VisualServer() {
GLOBAL_DEF("rendering/batching/debug/flash_batching", false);
GLOBAL_DEF("rendering/batching/debug/diagnose_frame", false);
GLOBAL_DEF("rendering/gles2/compatibility/disable_half_float", false);
+ GLOBAL_DEF("rendering/gles2/compatibility/enable_high_float.Android", false);
GLOBAL_DEF("rendering/batching/precision/uv_contract", false);
GLOBAL_DEF("rendering/batching/precision/uv_contract_amount", 100);