summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2022-06-17 21:07:04 +0200
committerGitHub <noreply@github.com>2022-06-17 21:07:04 +0200
commit0daa868ab432d71442b76fa9bcfe3723abfc8718 (patch)
tree867000091ec5caa8d2afbe45039423baf951f958 /editor
parenta95e9af688ac0af147e8e44c0c247fa0405d93c8 (diff)
parent04d5626bc0ee8c6d900a9a8fdb63d29e8ec59211 (diff)
Merge pull request #62023 from Calinou/detect-3d-small-textures-no-vram-compress
Disable VRAM compression by default for small textures in Detect 3D
Diffstat (limited to 'editor')
-rw-r--r--editor/import/resource_importer_texture.cpp53
-rw-r--r--editor/import/resource_importer_texture.h5
2 files changed, 39 insertions, 19 deletions
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 Ref<CompressedTexture2D
}
singleton->make_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<CompressedTexture2D> &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;