Browse Source

AgX: add required gamut mapping (#27413)

WestLangley 1 year ago
parent
commit
b3aa4c6422

+ 15 - 7
src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js

@@ -105,7 +105,11 @@ vec3 agxDefaultContrastApprox( vec3 x ) {
 
 
 }
 }
 
 
-// Input and output encoded as Linear-sRGB.
+// AgX Tone Mapping implementation based on Filament, which in turn is based
+// on Blender's implementation using rec 2020 primaries
+// https://github.com/google/filament/pull/7236
+// Inputs and outputs are encoded as Linear-sRGB.
+
 vec3 AgXToneMapping( vec3 color ) {
 vec3 AgXToneMapping( vec3 color ) {
 
 
 	// AgX constants
 	// AgX constants
@@ -122,15 +126,16 @@ vec3 AgXToneMapping( vec3 color ) {
 		vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )
 		vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )
 	);
 	);
 
 
-	const float AgxMinEv = - 12.47393;  // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY)
-	const float AgxMaxEv = 4.026069;    // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY)
+	// LOG2_MIN      = -10.0
+	// LOG2_MAX      =  +6.5
+	// MIDDLE_GRAY   =  0.18
+	const float AgxMinEv = - 12.47393;  // log2( pow( 2, LOG2_MIN ) * MIDDLE_GRAY )
+	const float AgxMaxEv = 4.026069;    // log2( pow( 2, LOG2_MAX ) * MIDDLE_GRAY )
 
 
-	// AGX Tone Mapping implementation based on Filament, which is in turn based
-	// on Blender's implementation for rec 2020 colors:
-	// https://github.com/google/filament/pull/7236
-	color = LINEAR_SRGB_TO_LINEAR_REC2020 * color;
 	color *= toneMappingExposure;
 	color *= toneMappingExposure;
 
 
+	color = LINEAR_SRGB_TO_LINEAR_REC2020 * color;
+
 	color = AgXInsetMatrix * color;
 	color = AgXInsetMatrix * color;
 
 
 	// Log2 encoding
 	// Log2 encoding
@@ -153,6 +158,9 @@ vec3 AgXToneMapping( vec3 color ) {
 
 
 	color = LINEAR_REC2020_TO_LINEAR_SRGB * color;
 	color = LINEAR_REC2020_TO_LINEAR_SRGB * color;
 
 
+	// Gamut mapping. Simple clamp for now.
+	color = clamp( color, 0.0, 1.0 );
+
 	return color;
 	return color;
 
 
 }
 }