summaryrefslogtreecommitdiff
path: root/editor/import/resource_importer_texture.cpp
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2022-04-27 08:01:34 +0200
committerGitHub <noreply@github.com>2022-04-27 08:01:34 +0200
commit6e67dc0881f803376a5c53444120db215e98a838 (patch)
tree0d3eb6cf72c150781c7c860279a002a306c91ea0 /editor/import/resource_importer_texture.cpp
parent3541890f4d0ade19a3a23f4f939c491249d858aa (diff)
parent2694138060829260aec88e94655f1063b8b525f6 (diff)
Merge pull request #58164 from Calinou/import-hdr-add-clamp-exposure-option
Add an option to clamp HDR exposure to reduce environment fireflies
Diffstat (limited to 'editor/import/resource_importer_texture.cpp')
-rw-r--r--editor/import/resource_importer_texture.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp
index de51a28c5a..8c038d0311 100644
--- a/editor/import/resource_importer_texture.cpp
+++ b/editor/import/resource_importer_texture.cpp
@@ -221,6 +221,7 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/normal_map_invert_y"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/hdr_as_srgb"), false));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/hdr_clamp_exposure"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "process/size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "detect_3d/compress_to", PROPERTY_HINT_ENUM, "Disabled,VRAM Compressed,Basis Universal"), (p_preset == PRESET_DETECT) ? 1 : 0));
@@ -414,6 +415,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
const bool stream = false;
const int size_limit = p_options["process/size_limit"];
const bool hdr_as_srgb = p_options["process/hdr_as_srgb"];
+ const bool hdr_clamp_exposure = p_options["process/hdr_clamp_exposure"];
const int normal = p_options["compress/normal_map"];
const int hdr_compression = p_options["compress/hdr_compression"];
const int bptc_ldr = p_options["compress/bptc_ldr"];
@@ -485,6 +487,34 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
}
}
+ if (hdr_clamp_exposure) {
+ // Clamp HDR exposure following Filament's tonemapping formula.
+ // This can be used to reduce fireflies in environment maps or reduce the influence
+ // of the sun from an HDRI panorama on environment lighting (when a DirectionalLight3D is used instead).
+ const int height = image->get_height();
+ const int width = image->get_width();
+
+ // These values are chosen arbitrarily and seem to produce good results with 4,096 samples.
+ const float linear = 4096.0;
+ const float compressed = 16384.0;
+
+ for (int i = 0; i < width; i++) {
+ for (int j = 0; j < height; j++) {
+ const Color color = image->get_pixel(i, j);
+ const float luma = color.get_luminance();
+
+ Color clamped_color;
+ if (luma <= linear) {
+ clamped_color = color;
+ } else {
+ clamped_color = (color / luma) * ((linear * linear - compressed * luma) / (2 * linear - compressed - luma));
+ }
+
+ image->set_pixel(i, j, clamped_color);
+ }
+ }
+ }
+
if (compress_mode == COMPRESS_BASIS_UNIVERSAL && image->get_format() >= Image::FORMAT_RF) {
//basis universal does not support float formats, fall back
compress_mode = COMPRESS_VRAM_COMPRESSED;