Browse Source

add support for cineon tone mapping.

Ben Houston 9 years ago
parent
commit
8ed3615868

+ 2 - 1
examples/webgl_tonemapping.html

@@ -72,7 +72,8 @@
 				None: THREE.NoToneMapping,
 				None: THREE.NoToneMapping,
 				Linear: THREE.LinearToneMapping,
 				Linear: THREE.LinearToneMapping,
 				Reinhard: THREE.ReinhardToneMapping,
 				Reinhard: THREE.ReinhardToneMapping,
-				Uncharted2: THREE.Uncharted2ToneMapping
+				Uncharted2: THREE.Uncharted2ToneMapping,
+				Cineon: THREE.CineonToneMapping
 			};
 			};
 
 
 			var camera, scene, renderer, controls, objects = [];
 			var camera, scene, renderer, controls, objects = [];

+ 2 - 1
src/Three.js

@@ -214,7 +214,8 @@ THREE.AddOperation = 2;
 THREE.NoToneMapping = 0; // do not do any tone mapping, not even exposure (required for special purpose passes.)
 THREE.NoToneMapping = 0; // do not do any tone mapping, not even exposure (required for special purpose passes.)
 THREE.LinearToneMapping = 1; // only apply exposure.
 THREE.LinearToneMapping = 1; // only apply exposure.
 THREE.ReinhardToneMapping = 2;
 THREE.ReinhardToneMapping = 2;
-THREE.Uncharted2ToneMapping = 3;
+THREE.Uncharted2ToneMapping = 3; // John Hable
+THREE.CineonToneMapping = 4;  // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson
 
 
 // Mapping modes
 // Mapping modes
 
 

+ 15 - 1
src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl

@@ -3,11 +3,14 @@
 uniform float toneMappingExposure;
 uniform float toneMappingExposure;
 uniform float toneMappingWhitePoint;
 uniform float toneMappingWhitePoint;
 
 
+// exposure only
 vec3 LinearToneMapping( vec3 color ) {
 vec3 LinearToneMapping( vec3 color ) {
 
 
   return toneMappingExposure * color;
   return toneMappingExposure * color;
 
 
 }
 }
+
+// source: https://www.cs.utah.edu/~reinhard/cdrom/
 vec3 ReinhardToneMapping( vec3 color ) {
 vec3 ReinhardToneMapping( vec3 color ) {
 
 
   color *= toneMappingExposure;
   color *= toneMappingExposure;
@@ -15,11 +18,22 @@ vec3 ReinhardToneMapping( vec3 color ) {
 
 
 }
 }
 
 
+// source: http://filmicgames.com/archives/75
 #define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )
 #define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )
-
 vec3 Uncharted2ToneMapping( vec3 color ) {
 vec3 Uncharted2ToneMapping( vec3 color ) {
 
 
+  // John Hable's filmic operator from Uncharted 2 video game
   color *= toneMappingExposure;
   color *= toneMappingExposure;
   return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );
   return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );
 
 
 }
 }
+
+// source: http://filmicgames.com/archives/75
+vec3 OptimizedCineonToneMapping( vec3 color ) {
+
+  // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson
+  color *= toneMappingExposure;
+  color = max( vec3( 0.0 ), color - 0.004 );
+  return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );
+
+}

+ 3 - 0
src/renderers/webgl/WebGLProgram.js

@@ -59,6 +59,9 @@ THREE.WebGLProgram = ( function () {
 			case THREE.Uncharted2ToneMapping:
 			case THREE.Uncharted2ToneMapping:
 				toneMappingName = "Uncharted2";
 				toneMappingName = "Uncharted2";
 				break;
 				break;
+			case THREE.CineonToneMapping:
+				toneMappingName = "OptimizedCineon";
+				break;
 			default:
 			default:
 				throw new Error( 'unsupported toneMapping: ' + toneMapping );
 				throw new Error( 'unsupported toneMapping: ' + toneMapping );