| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | ( function () {	/** * Full-screen tone-mapping shader based on http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf */	var ToneMapShader = {		uniforms: {			'tDiffuse': {				value: null			},			'averageLuminance': {				value: 1.0			},			'luminanceMap': {				value: null			},			'maxLuminance': {				value: 16.0			},			'minLuminance': {				value: 0.01			},			'middleGrey': {				value: 0.6			}		},		vertexShader:  /* glsl */  `		varying vec2 vUv;		void main() {			vUv = uv;			gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );		}`,		fragmentShader:  /* glsl */  `		#include <common>		uniform sampler2D tDiffuse;		varying vec2 vUv;		uniform float middleGrey;		uniform float minLuminance;		uniform float maxLuminance;		#ifdef ADAPTED_LUMINANCE			uniform sampler2D luminanceMap;		#else			uniform float averageLuminance;		#endif		vec3 ToneMap( vec3 vColor ) {			#ifdef ADAPTED_LUMINANCE				// Get the calculated average luminance				float fLumAvg = texture2D(luminanceMap, vec2(0.5, 0.5)).r;			#else				float fLumAvg = averageLuminance;			#endif			// Calculate the luminance of the current pixel			float fLumPixel = linearToRelativeLuminance( vColor );			// Apply the modified operator (Eq. 4)			float fLumScaled = (fLumPixel * middleGrey) / max( minLuminance, fLumAvg );			float fLumCompressed = (fLumScaled * (1.0 + (fLumScaled / (maxLuminance * maxLuminance)))) / (1.0 + fLumScaled);			return fLumCompressed * vColor;		}		void main() {			vec4 texel = texture2D( tDiffuse, vUv );			gl_FragColor = vec4( ToneMap( texel.xyz ), texel.w );		}`	};	THREE.ToneMapShader = ToneMapShader;} )();
 |