diff --git a/examples/js/shaders/ACESFilmicToneMappingShader.js b/examples/js/shaders/ACESFilmicToneMappingShader.js new file mode 100644 index 0000000000000000000000000000000000000000..a2c806a074422cacfdc4ef4ae72d2b0406ce35b6 --- /dev/null +++ b/examples/js/shaders/ACESFilmicToneMappingShader.js @@ -0,0 +1,88 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * + * ACES Filmic Tone Mapping Shader by Stephen Hill + * source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs + */ + +THREE.ACESFilmicToneMappingShader = { + + uniforms: { + + 'tDiffuse': { value: null }, + 'exposure': { value: 1.0 } + + }, + + vertexShader: [ + + 'varying vec2 vUv;', + + 'void main() {', + + ' vUv = uv;', + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + + ].join( '\n' ), + + fragmentShader: [ + + '#define saturate(a) clamp( a, 0.0, 1.0 )', + + 'uniform sampler2D tDiffuse;', + + 'uniform float exposure;', + + 'varying vec2 vUv;', + + 'vec3 RRTAndODTFit( vec3 v ) {', + + ' vec3 a = v * ( v + 0.0245786 ) - 0.000090537;', + ' vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;', + ' return a / b;', + + '}', + + 'vec3 ACESFilmicToneMapping( vec3 color ) {', + + // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT + ' const mat3 ACESInputMat = mat3(', + ' vec3( 0.59719, 0.07600, 0.02840 ),', // transposed from source + ' vec3( 0.35458, 0.90834, 0.13383 ),', + ' vec3( 0.04823, 0.01566, 0.83777 )', + ' );', + + // ODT_SAT => XYZ => D60_2_D65 => sRGB + ' const mat3 ACESOutputMat = mat3(', + ' vec3( 1.60475, -0.10208, -0.00327 ),', // transposed from source + ' vec3( -0.53108, 1.10813, -0.07276 ),', + ' vec3( -0.07367, -0.00605, 1.07602 )', + ' );', + + ' color = ACESInputMat * color;', + + // Apply RRT and ODT + ' color = RRTAndODTFit( color );', + + ' color = ACESOutputMat * color;', + + // Clamp to [0, 1] + ' return saturate( color );', + + '}', + + 'void main() {', + + ' vec4 tex = texture2D( tDiffuse, vUv );', + + ' tex.rgb *= exposure;', // pre-exposed, outside of the tone mapping function + + ' gl_FragColor = vec4( ACESFilmicToneMapping( tex.rgb ), tex.a );', + + '}' + + ].join( '\n' ) + +}; diff --git a/examples/jsm/shaders/ACESFilmicToneMappingShader.js b/examples/jsm/shaders/ACESFilmicToneMappingShader.js new file mode 100644 index 0000000000000000000000000000000000000000..527457b4d37dcad8f5cc1210e6e2a4884dcddd3f --- /dev/null +++ b/examples/jsm/shaders/ACESFilmicToneMappingShader.js @@ -0,0 +1,92 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * + * ACES Filmic Tone Mapping Shader by Stephen Hill + * source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs + */ + + + +var ACESFilmicToneMappingShader = { + + uniforms: { + + 'tDiffuse': { value: null }, + 'exposure': { value: 1.0 } + + }, + + vertexShader: [ + + 'varying vec2 vUv;', + + 'void main() {', + + ' vUv = uv;', + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + + ].join( '\n' ), + + fragmentShader: [ + + '#define saturate(a) clamp( a, 0.0, 1.0 )', + + 'uniform sampler2D tDiffuse;', + + 'uniform float exposure;', + + 'varying vec2 vUv;', + + 'vec3 RRTAndODTFit( vec3 v ) {', + + ' vec3 a = v * ( v + 0.0245786 ) - 0.000090537;', + ' vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;', + ' return a / b;', + + '}', + + 'vec3 ACESFilmicToneMapping( vec3 color ) {', + + // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT + ' const mat3 ACESInputMat = mat3(', + ' vec3( 0.59719, 0.07600, 0.02840 ),', // transposed from source + ' vec3( 0.35458, 0.90834, 0.13383 ),', + ' vec3( 0.04823, 0.01566, 0.83777 )', + ' );', + + // ODT_SAT => XYZ => D60_2_D65 => sRGB + ' const mat3 ACESOutputMat = mat3(', + ' vec3( 1.60475, -0.10208, -0.00327 ),', // transposed from source + ' vec3( -0.53108, 1.10813, -0.07276 ),', + ' vec3( -0.07367, -0.00605, 1.07602 )', + ' );', + + ' color = ACESInputMat * color;', + + // Apply RRT and ODT + ' color = RRTAndODTFit( color );', + + ' color = ACESOutputMat * color;', + + // Clamp to [0, 1] + ' return saturate( color );', + + '}', + + 'void main() {', + + ' vec4 tex = texture2D( tDiffuse, vUv );', + + ' tex.rgb *= exposure;', // pre-exposed, outside of the tone mapping function + + ' gl_FragColor = vec4( ACESFilmicToneMapping( tex.rgb ), tex.a );', + + '}' + + ].join( '\n' ) + +}; + +export { ACESFilmicToneMappingShader }; diff --git a/utils/modularize.js b/utils/modularize.js index b3d9cfa005996aa3e2d1e44a1d09ee5e7c153a09..21f1df664bf48a574b8a26296b4a6fa7ea0cd679 100644 --- a/utils/modularize.js +++ b/utils/modularize.js @@ -171,6 +171,7 @@ var files = [ { path: 'renderers/Projector.js', dependencies: [], ignoreList: [] }, { path: 'renderers/SVGRenderer.js', dependencies: [ { name: 'Projector', path: 'renderers/Projector.js' }, { name: 'RenderableFace', path: 'renderers/Projector.js' }, { name: 'RenderableLine', path: 'renderers/Projector.js' }, { name: 'RenderableSprite', path: 'renderers/Projector.js' } ], ignoreList: [] }, + { path: 'shaders/ACESFilmicToneMappingShader.js', dependencies: [], ignoreList: [] }, { path: 'shaders/AfterimageShader.js', dependencies: [], ignoreList: [] }, { path: 'shaders/BasicShader.js', dependencies: [], ignoreList: [] }, { path: 'shaders/BleachBypassShader.js', dependencies: [], ignoreList: [] },