From 73b60d4db81fcdcc63d1f45a55cbce6c02ae4098 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Wed, 21 Jan 2026 17:31:27 -0800 Subject: [PATCH] Add a new tone mapper (#9614) The new tone mapper, dubbed "GT7" in the code, is based on the Gran Turismo 7 tone mapper, as described in the SIGGRAPH 2025 presentation called "Driving Toward Reality: Physically Based Tone Mapping and Perceptual Fidelity in Gran Turismo 7". This tone mapper exhibits fewer hue skews than the other tone mappers, at the exception of PBR Neutral. The GT7 tone mapper is however better at preserving the perception of high dynamic range. The tone mapper, as implemented, targets an SDR paper white of 250 nits, using 100 cd/m^2 as the reference luminance (for values of 1.0 in the linear HDR framebuffer). This can result in an overall darker image compared to the other tone mappers but this can be controlled through camera settings, post- processing exposure, or lighting intensity. The GT7 tone mapper also allows to target HDR output, and could be made customizable via APIs if desired. The current implementation offers a fixed aesthetic solution. --- .../src/main/cpp/ToneMapper.cpp | 5 + .../google/android/filament/ToneMapper.java | 15 ++ filament/include/filament/ToneMapper.h | 29 ++- filament/src/ColorSpaceUtils.h | 108 +++++++---- filament/src/ToneMapper.cpp | 182 ++++++++++++++++++ libs/viewer/include/viewer/Settings.h | 3 +- libs/viewer/src/Settings.cpp | 3 + libs/viewer/src/ViewerGui.cpp | 5 +- 8 files changed, 305 insertions(+), 45 deletions(-) diff --git a/android/filament-android/src/main/cpp/ToneMapper.cpp b/android/filament-android/src/main/cpp/ToneMapper.cpp index 860b95508b..a42a336461 100644 --- a/android/filament-android/src/main/cpp/ToneMapper.cpp +++ b/android/filament-android/src/main/cpp/ToneMapper.cpp @@ -52,6 +52,11 @@ Java_com_google_android_filament_ToneMapper_nCreatePBRNeutralToneMapper(JNIEnv*, return (jlong) new PBRNeutralToneMapper(); } +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_ToneMapper_nCreateGT7ToneMapper(JNIEnv*, jclass) { + return (jlong) new GT7ToneMapper(); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_ToneMapper_nCreateAgxToneMapper(JNIEnv*, jclass, jint look) { return (jlong) new AgxToneMapper(AgxToneMapper::AgxLook(look)); diff --git a/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java b/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java index 89b12541c2..3d81b96632 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java +++ b/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java @@ -24,6 +24,7 @@ package com.google.android.filament; *
  • ACESLegacyToneMapper
  • *
  • FilmicToneMapper
  • *
  • PBRNeutralToneMapper
  • + *
  • GT7ToneMapper
  • * *
  • Debug/validation tone mapping operators
  • *