Explorar o código

inline tone mapping mostly works.

Ben Houston %!s(int64=9) %!d(string=hai) anos
pai
achega
b701b7eb00

+ 7 - 0
src/Three.js

@@ -209,6 +209,13 @@ THREE.MultiplyOperation = 0;
 THREE.MixOperation = 1;
 THREE.AddOperation = 2;
 
+// Tone Mapping modes
+
+THREE.NoToneMapping = 0; // do not even apply exposure.
+THREE.LinearToneMapping = 0; // only apply exposure.
+THREE.ReinhardToneMapping = 1;
+THREE.Uncharted2ToneMapping = 2;
+
 // Mapping modes
 
 THREE.UVMapping = 300;

+ 17 - 0
src/renderers/WebGLRenderer.js

@@ -55,6 +55,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 	this.gammaInput = false;
 	this.gammaOutput = false;
 
+	// tone mapping
+
+	this.toneMapping = THREE.LinearToneMapping;
+	this.toneMappingExposure = 1.0;
+	this.toneMappingWhitePoint = 1.0;
+
 	// morphs
 
 	this.maxMorphTargets = 8;
@@ -1696,6 +1702,17 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			}
 
+
+			if ( p_uniforms.toneMappingExposure !== undefined ) {
+
+				_gl.uniform1f( p_uniforms.toneMappingExposure, _this.toneMappingExposure );
+			}
+
+			if ( p_uniforms.toneMappingWhitePoint !== undefined ) {
+
+				_gl.uniform1f( p_uniforms.toneMappingWhitePoint, _this.toneMappingWhitePoint );
+
+			}
 		}
 
 		// skinning uniforms must be set even if material didn't change

+ 1 - 0
src/renderers/shaders/ShaderChunk/encodings_fragment.glsl

@@ -0,0 +1 @@
+  gl_FragColor = linearToOutputTexel( gl_FragColor );

+ 0 - 0
src/renderers/shaders/ShaderChunk/encodings.glsl → src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl


+ 5 - 0
src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl

@@ -0,0 +1,5 @@
+#if defined( TONE_MAPPING )
+
+  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );
+
+#endif

+ 25 - 0
src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl

@@ -0,0 +1,25 @@
+#define saturate(a) clamp( a, 0.0, 1.0 )
+
+uniform float toneMappingExposure;
+uniform float toneMappingWhitePoint;
+
+vec3 LinearToneMapping( vec3 color ) {
+
+  return toneMappingExposure * color;
+
+}
+vec3 ReinhardToneMapping( vec3 color ) {
+
+  color *= toneMappingExposure;
+  return saturate( color / ( vec3( 1.0 ) + color ) );
+
+}
+
+#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 ) {
+
+  color *= toneMappingExposure;
+  return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );
+
+}

+ 3 - 1
src/renderers/shaders/ShaderLib/linedashed_frag.glsl

@@ -27,8 +27,10 @@ void main() {
 
 	outgoingLight = diffuseColor.rgb; // simple shader
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 

+ 3 - 1
src/renderers/shaders/ShaderLib/meshbasic_frag.glsl

@@ -42,8 +42,10 @@ void main() {
 
 	#include <envmap_fragment>
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 

+ 3 - 1
src/renderers/shaders/ShaderLib/meshlambert_frag.glsl

@@ -69,8 +69,10 @@ void main() {
 
 	#include <envmap_fragment>
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 

+ 3 - 1
src/renderers/shaders/ShaderLib/meshphong_frag.glsl

@@ -53,8 +53,10 @@ void main() {
 
 	#include <envmap_fragment>
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 

+ 3 - 1
src/renderers/shaders/ShaderLib/meshstandard_frag.glsl

@@ -65,8 +65,10 @@ void main() {
 
 	vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 

+ 4 - 2
src/renderers/shaders/ShaderLib/points_frag.glsl

@@ -20,9 +20,11 @@ void main() {
 
 	outgoingLight = diffuseColor.rgb;
 
-	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
+	gl_FragColor = vec4( outgoingLight, diffuseColor.a );
 
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
 	#include <fog_fragment>
-	#include <premultiply_alpha_fragment>
+	#include <premultiplied_alpha_fragment>
 
 }

+ 26 - 1
src/renderers/webgl/WebGLProgram.js

@@ -46,6 +46,28 @@ THREE.WebGLProgram = ( function () {
 
 	}
 
+	function getToneMappingFunction( functionName, toneMapping ) {
+		var toneMappingName;
+
+		switch( toneMapping ) {
+			case THREE.LinearToneMapping:
+				toneMappingName = "Linear";
+				break;
+			case THREE.ReinhardToneMapping:
+				toneMappingName = "Reinhard";
+				break;
+			case THREE.Uncharted2ToneMapping:
+				toneMappingName = "Uncharted2";
+				break;
+			default:
+				throw new Error( 'unsupported toneMapping: ' + toneMapping );
+
+		}
+		return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }";
+
+	}
+
+
 	function generateExtensions( extensions, parameters, rendererExtensions ) {
 
 		extensions = extensions || {};
@@ -501,8 +523,11 @@ THREE.WebGLProgram = ( function () {
 				'uniform mat4 viewMatrix;',
 				'uniform vec3 cameraPosition;',
 
-				( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? THREE.ShaderChunk[ 'encodings' ] : '',
+				( parameters.toneMapping !== THREE.NoToneMapping ) ? "#define TONE_MAPPING" : '',
+				( parameters.toneMapping !== THREE.NoToneMapping ) ? THREE.ShaderChunk[ 'tonemapping_pars_fragment' ] : '',  // this code is required here because it is used by the toneMapping() function defined below
+				( parameters.toneMapping !== THREE.NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '',
 
+				( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? THREE.ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
 				parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
 				parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
 				parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',

+ 3 - 1
src/renderers/webgl/WebGLPrograms.js

@@ -23,7 +23,7 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
 		"maxBones", "useVertexTexture", "morphTargets", "morphNormals",
 		"maxMorphTargets", "maxMorphNormals", "premultipliedAlpha",
 		"numDirLights", "numPointLights", "numSpotLights", "numHemiLights",
-		"shadowMapEnabled", "pointLightShadows",
+		"shadowMapEnabled", "pointLightShadows", "toneMapping",
 		"shadowMapType",
 		"alphaTest", "doubleSided", "flipSided"
 	];
@@ -175,6 +175,8 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
 			shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,
 			shadowMapType: renderer.shadowMap.type,
 
+			toneMapping: renderer.toneMapping,
+
 			premultipliedAlpha: ( material.blending === THREE.PremultipliedAlphaBlending ),
 			alphaTest: material.alphaTest,
 			doubleSided: material.side === THREE.DoubleSide,

+ 4 - 1
utils/build/includes/common.json

@@ -138,7 +138,8 @@
 	"src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/encodings.glsl",
+	"src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/encodings_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/envmap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl",
@@ -185,6 +186,8 @@
 	"src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/uv2_vertex.glsl",