From 04d5626bc0ee8c6d900a9a8fdb63d29e8ec59211 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Tue, 14 Jun 2022 12:55:24 +0200 Subject: Disable VRAM compression by default for small textures in Detect 3D This is done to prevent reducing texture quality when it doesn't save much video memory, especially for pixel art. The size threshold can be adjusted in the project settings. To get the previous behavior where textures detected to be used in 3D had their compression mode always set to VRAM, set this to the lowest value (16). --- editor/import/resource_importer_texture.cpp | 53 ++++++++++++++++++++--------- editor/import/resource_importer_texture.h | 5 +-- 2 files changed, 39 insertions(+), 19 deletions(-) (limited to 'editor/import') diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index deb3047864..a055dca8ad 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -65,6 +65,15 @@ void ResourceImporterTexture::_texture_reimport_3d(const Refmake_flags[path].flags |= MAKE_3D_FLAG; + + // For small textures, don't use VRAM compression as it decreases quality too much compared to the memory saved. + // The minimum size for VRAM compression is defined on each axis. + // It is then squared to handle non-square input texture sizes in a more human-readable manner. + const float minimum_size = float(GLOBAL_GET("rendering/textures/vram_compression/minimum_size")); + if (p_tex->get_width() * p_tex->get_height() >= int(Math::pow(minimum_size, 2.0f) - CMP_EPSILON)) { + // Texture is larger than `minimum_size × minimum_size` pixels (if square). + singleton->make_flags[path].flags |= MAKE_VRAM_COMPRESS_FLAG; + } } void ResourceImporterTexture::_texture_reimport_normal(const Ref &p_tex) { @@ -103,7 +112,33 @@ void ResourceImporterTexture::update_imports() { bool changed = false; - if (E.value.flags & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0) { + if (E.value.flags & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d/compress_to"))) { + if (E.value.flags & MAKE_VRAM_COMPRESS_FLAG) { + // Texture is large enough to benefit from VRAM compression. + const int compress_to = cf->get_value("params", "detect_3d/compress_to"); + String compress_string; + if (compress_to == 1) { + cf->set_value("params", "compress/mode", COMPRESS_VRAM_COMPRESSED); + compress_string = "VRAM Compressed (S3TC/ETC/BPTC)"; + } else if (compress_to == 2) { + cf->set_value("params", "compress/mode", COMPRESS_BASIS_UNIVERSAL); + compress_string = "Basis Universal"; + } + print_line(vformat(TTR("%s: Texture detected as used in 3D. Enabling mipmap generation and setting the texture compression mode to %s."), String(E.key), compress_string)); + } else { + print_line(vformat(TTR("%s: Small texture detected as used in 3D. Enabling mipmap generation but not VRAM compression."), String(E.key))); + } + + cf->set_value("params", "mipmaps/generate", true); + cf->set_value("params", "detect_3d/compress_to", 0); + + changed = true; + } + + if (E.value.flags & MAKE_NORMAL_FLAG && int(cf->get_value("params", "compress/normal_map")) == 0 && int(cf->get_value("params", "compress/mode")) != COMPRESS_LOSSLESS) { + // Normal map compression is not available for textures with Lossless compression. + // This is ignored in the importer, but printing a message about normal map compression + // being enabled in this case is misleading. print_line(vformat(TTR("%s: Texture detected as used as a normal map in 3D. Enabling red-green texture compression to reduce memory usage (blue channel is discarded)."), String(E.key))); cf->set_value("params", "compress/normal_map", 1); changed = true; @@ -116,22 +151,6 @@ void ResourceImporterTexture::update_imports() { changed = true; } - if (E.value.flags & MAKE_3D_FLAG && bool(cf->get_value("params", "detect_3d/compress_to"))) { - const int compress_to = cf->get_value("params", "detect_3d/compress_to"); - String compress_string; - cf->set_value("params", "detect_3d/compress_to", 0); - if (compress_to == 1) { - cf->set_value("params", "compress/mode", COMPRESS_VRAM_COMPRESSED); - compress_string = "VRAM Compressed (S3TC/ETC/BPTC)"; - } else if (compress_to == 2) { - cf->set_value("params", "compress/mode", COMPRESS_BASIS_UNIVERSAL); - compress_string = "Basis Universal"; - } - print_line(vformat(TTR("%s: Texture detected as used in 3D. Enabling mipmap generation and setting the texture compression mode to %s."), String(E.key), compress_string)); - cf->set_value("params", "mipmaps/generate", true); - changed = true; - } - if (changed) { cf->save(src_path); to_reimport.push_back(E.key); diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h index 7def2d4f77..e65c15ae78 100644 --- a/editor/import/resource_importer_texture.h +++ b/editor/import/resource_importer_texture.h @@ -54,8 +54,9 @@ public: protected: enum { MAKE_3D_FLAG = 1, - MAKE_ROUGHNESS_FLAG = 2, - MAKE_NORMAL_FLAG = 4 + MAKE_VRAM_COMPRESS_FLAG = 2, + MAKE_ROUGHNESS_FLAG = 4, + MAKE_NORMAL_FLAG = 8, }; Mutex mutex; -- cgit v1.2.3