Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions examples/js/WebGL.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
( function () {

var WEBGL = {
isWebGLAvailable: function () {
class WEBGL {

static isWebGLAvailable() {

try {

var canvas = document.createElement( 'canvas' );
const canvas = document.createElement( 'canvas' );
return !! ( window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ) );

} catch ( e ) {
Expand All @@ -14,12 +15,13 @@

}

},
isWebGL2Available: function () {
}

static isWebGL2Available() {

try {

var canvas = document.createElement( 'canvas' );
const canvas = document.createElement( 'canvas' );
return !! ( window.WebGL2RenderingContext && canvas.getContext( 'webgl2' ) );

} catch ( e ) {
Expand All @@ -28,29 +30,32 @@

}

},
getWebGLErrorMessage: function () {
}

static getWebGLErrorMessage() {

return this.getErrorMessage( 1 );

},
getWebGL2ErrorMessage: function () {
}

static getWebGL2ErrorMessage() {

return this.getErrorMessage( 2 );

},
getErrorMessage: function ( version ) {
}

var names = {
static getErrorMessage( version ) {

const names = {
1: 'WebGL',
2: 'WebGL 2'
};
var contexts = {
const contexts = {
1: window.WebGLRenderingContext,
2: window.WebGL2RenderingContext
};
var message = 'Your $0 does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">$1</a>';
var element = document.createElement( 'div' );
let message = 'Your $0 does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">$1</a>';
const element = document.createElement( 'div' );
element.id = 'webglmessage';
element.style.fontFamily = 'monospace';
element.style.fontSize = '13px';
Expand All @@ -77,7 +82,8 @@
return element;

}
};

}

THREE.WEBGL = WEBGL;

Expand Down
218 changes: 127 additions & 91 deletions examples/js/postprocessing/AdaptiveToneMappingPass.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,81 +8,108 @@
* Full-screen tone-mapping shader based on http://www.graphics.cornell.edu/~jaf/publications/sig02_paper.pdf
*/

var AdaptiveToneMappingPass = function ( adaptive, resolution ) {

THREE.Pass.call( this );
this.resolution = resolution !== undefined ? resolution : 256;
this.needsInit = true;
this.adaptive = adaptive !== undefined ? !! adaptive : true;
this.luminanceRT = null;
this.previousLuminanceRT = null;
this.currentLuminanceRT = null;
if ( THREE.CopyShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.CopyShader' );
var copyShader = THREE.CopyShader;
this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
this.materialCopy = new THREE.ShaderMaterial( {
uniforms: this.copyUniforms,
vertexShader: copyShader.vertexShader,
fragmentShader: copyShader.fragmentShader,
blending: THREE.NoBlending,
depthTest: false
} );
if ( THREE.LuminosityShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.LuminosityShader' );
this.materialLuminance = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( THREE.LuminosityShader.uniforms ),
vertexShader: THREE.LuminosityShader.vertexShader,
fragmentShader: THREE.LuminosityShader.fragmentShader,
blending: THREE.NoBlending
} );
this.adaptLuminanceShader = {
defines: {
'MIP_LEVEL_1X1': ( Math.log( this.resolution ) / Math.log( 2.0 ) ).toFixed( 1 )
},
uniforms: {
'lastLum': {
value: null
},
'currentLum': {
value: null
},
'minLuminance': {
value: 0.01
class AdaptiveToneMappingPass extends THREE.Pass {

constructor( adaptive, resolution ) {

super();
this.resolution = resolution !== undefined ? resolution : 256;
this.needsInit = true;
this.adaptive = adaptive !== undefined ? !! adaptive : true;
this.luminanceRT = null;
this.previousLuminanceRT = null;
this.currentLuminanceRT = null;
if ( THREE.CopyShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.CopyShader' );
const copyShader = THREE.CopyShader;
this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
this.materialCopy = new THREE.ShaderMaterial( {
uniforms: this.copyUniforms,
vertexShader: copyShader.vertexShader,
fragmentShader: copyShader.fragmentShader,
blending: THREE.NoBlending,
depthTest: false
} );
if ( THREE.LuminosityShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.LuminosityShader' );
this.materialLuminance = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( THREE.LuminosityShader.uniforms ),
vertexShader: THREE.LuminosityShader.vertexShader,
fragmentShader: THREE.LuminosityShader.fragmentShader,
blending: THREE.NoBlending
} );
this.adaptLuminanceShader = {
defines: {
'MIP_LEVEL_1X1': ( Math.log( this.resolution ) / Math.log( 2.0 ) ).toFixed( 1 )
},
'delta': {
value: 0.016
uniforms: {
'lastLum': {
value: null
},
'currentLum': {
value: null
},
'minLuminance': {
value: 0.01
},
'delta': {
value: 0.016
},
'tau': {
value: 1.0
}
},
'tau': {
value: 1.0
}
},
vertexShader: [ 'varying vec2 vUv;', 'void main() {', ' vUv = uv;', ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', '}' ].join( '\n' ),
fragmentShader: [ 'varying vec2 vUv;', 'uniform sampler2D lastLum;', 'uniform sampler2D currentLum;', 'uniform float minLuminance;', 'uniform float delta;', 'uniform float tau;', 'void main() {', ' vec4 lastLum = texture2D( lastLum, vUv, MIP_LEVEL_1X1 );', ' vec4 currentLum = texture2D( currentLum, vUv, MIP_LEVEL_1X1 );', ' float fLastLum = max( minLuminance, lastLum.r );', ' float fCurrentLum = max( minLuminance, currentLum.r );', //The adaption seems to work better in extreme lighting differences
//if the input luminance is squared.
' fCurrentLum *= fCurrentLum;', // Adapt the luminance using Pattanaik's technique
' float fAdaptedLum = fLastLum + (fCurrentLum - fLastLum) * (1.0 - exp(-delta * tau));', // "fAdaptedLum = sqrt(fAdaptedLum);",
' gl_FragColor.r = fAdaptedLum;', '}' ].join( '\n' )
};
this.materialAdaptiveLum = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( this.adaptLuminanceShader.uniforms ),
vertexShader: this.adaptLuminanceShader.vertexShader,
fragmentShader: this.adaptLuminanceShader.fragmentShader,
defines: Object.assign( {}, this.adaptLuminanceShader.defines ),
blending: THREE.NoBlending
} );
if ( THREE.ToneMapShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.ToneMapShader' );
this.materialToneMap = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( THREE.ToneMapShader.uniforms ),
vertexShader: THREE.ToneMapShader.vertexShader,
fragmentShader: THREE.ToneMapShader.fragmentShader,
blending: THREE.NoBlending
} );
this.fsQuad = new THREE.Pass.FullScreenQuad( null );

};

AdaptiveToneMappingPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
constructor: AdaptiveToneMappingPass,
render: function ( renderer, writeBuffer, readBuffer, deltaTime
vertexShader: `varying vec2 vUv;

void main() {

vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

}`,
fragmentShader: `varying vec2 vUv;

uniform sampler2D lastLum;
uniform sampler2D currentLum;
uniform float minLuminance;
uniform float delta;
uniform float tau;

void main() {

vec4 lastLum = texture2D( lastLum, vUv, MIP_LEVEL_1X1 );
vec4 currentLum = texture2D( currentLum, vUv, MIP_LEVEL_1X1 );

float fLastLum = max( minLuminance, lastLum.r );
float fCurrentLum = max( minLuminance, currentLum.r );

//The adaption seems to work better in extreme lighting differences
//if the input luminance is squared.
fCurrentLum *= fCurrentLum;

// Adapt the luminance using Pattanaik's technique
float fAdaptedLum = fLastLum + (fCurrentLum - fLastLum) * (1.0 - exp(-delta * tau));
// "fAdaptedLum = sqrt(fAdaptedLum);
gl_FragColor.r = fAdaptedLum;
}`
};
this.materialAdaptiveLum = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( this.adaptLuminanceShader.uniforms ),
vertexShader: this.adaptLuminanceShader.vertexShader,
fragmentShader: this.adaptLuminanceShader.fragmentShader,
defines: Object.assign( {}, this.adaptLuminanceShader.defines ),
blending: THREE.NoBlending
} );
if ( THREE.ToneMapShader === undefined ) console.error( 'THREE.AdaptiveToneMappingPass relies on THREE.ToneMapShader' );
this.materialToneMap = new THREE.ShaderMaterial( {
uniforms: THREE.UniformsUtils.clone( THREE.ToneMapShader.uniforms ),
vertexShader: THREE.ToneMapShader.vertexShader,
fragmentShader: THREE.ToneMapShader.fragmentShader,
blending: THREE.NoBlending
} );
this.fsQuad = new THREE.FullScreenQuad( null );

}

render( renderer, writeBuffer, readBuffer, deltaTime
/*, maskActive*/
) {

Expand Down Expand Up @@ -135,8 +162,9 @@

}

},
reset: function () {
}

reset() {

// render targets
if ( this.luminanceRT ) {
Expand All @@ -157,7 +185,7 @@

}

var pars = {
const pars = {
minFilter: THREE.LinearFilter,
magFilter: THREE.LinearFilter,
format: THREE.RGBAFormat
Expand Down Expand Up @@ -192,8 +220,9 @@
// renderer.render( this.scene, this.camera, this.previousLuminanceRT );
// renderer.render( this.scene, this.camera, this.currentLuminanceRT );

},
setAdaptive: function ( adaptive ) {
}

setAdaptive( adaptive ) {

if ( adaptive ) {

Expand All @@ -211,17 +240,19 @@

this.materialToneMap.needsUpdate = true;

},
setAdaptionRate: function ( rate ) {
}

setAdaptionRate( rate ) {

if ( rate ) {

this.materialAdaptiveLum.uniforms.tau.value = Math.abs( rate );

}

},
setMinLuminance: function ( minLum ) {
}

setMinLuminance( minLum ) {

if ( minLum ) {

Expand All @@ -230,35 +261,39 @@

}

},
setMaxLuminance: function ( maxLum ) {
}

setMaxLuminance( maxLum ) {

if ( maxLum ) {

this.materialToneMap.uniforms.maxLuminance.value = maxLum;

}

},
setAverageLuminance: function ( avgLum ) {
}

setAverageLuminance( avgLum ) {

if ( avgLum ) {

this.materialToneMap.uniforms.averageLuminance.value = avgLum;

}

},
setMiddleGrey: function ( middleGrey ) {
}

setMiddleGrey( middleGrey ) {

if ( middleGrey ) {

this.materialToneMap.uniforms.middleGrey.value = middleGrey;

}

},
dispose: function () {
}

dispose() {

if ( this.luminanceRT ) {

Expand Down Expand Up @@ -303,7 +338,8 @@
}

}
} );

}

THREE.AdaptiveToneMappingPass = AdaptiveToneMappingPass;

Expand Down
Loading