diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 8e86a7a0406d..8ba77f36acf2 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 dc422f70a8ff..8f1d40358c51 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 71502cad7417..d88ef711da73 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);