|
@@ -65,19 +65,18 @@
|
|
|
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
|
|
|
import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';
|
|
|
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';
|
|
|
- import { GammaCorrectionShader } from 'three/addons/shaders/GammaCorrectionShader.js';
|
|
|
+ import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
|
|
|
|
|
|
- const ENTIRE_SCENE = 0, BLOOM_SCENE = 1;
|
|
|
+ const BLOOM_SCENE = 1;
|
|
|
|
|
|
const bloomLayer = new THREE.Layers();
|
|
|
bloomLayer.set( BLOOM_SCENE );
|
|
|
|
|
|
const params = {
|
|
|
- exposure: 1,
|
|
|
- bloomStrength: 5,
|
|
|
- bloomThreshold: 0,
|
|
|
- bloomRadius: 0,
|
|
|
- scene: 'Scene with Glow'
|
|
|
+ threshold: 0,
|
|
|
+ strength: 3,
|
|
|
+ radius: 0.5,
|
|
|
+ exposure: 1
|
|
|
};
|
|
|
|
|
|
const darkMaterial = new THREE.MeshBasicMaterial( { color: 'black' } );
|
|
@@ -86,7 +85,6 @@
|
|
|
const renderer = new THREE.WebGLRenderer( { antialias: true } );
|
|
|
renderer.setPixelRatio( window.devicePixelRatio );
|
|
|
renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
- renderer.toneMapping = THREE.ReinhardToneMapping;
|
|
|
document.body.appendChild( renderer.domElement );
|
|
|
|
|
|
const scene = new THREE.Scene();
|
|
@@ -106,9 +104,9 @@
|
|
|
const renderScene = new RenderPass( scene, camera );
|
|
|
|
|
|
const bloomPass = new UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 );
|
|
|
- bloomPass.threshold = params.bloomThreshold;
|
|
|
- bloomPass.strength = params.bloomStrength;
|
|
|
- bloomPass.radius = params.bloomRadius;
|
|
|
+ bloomPass.threshold = params.threshold;
|
|
|
+ bloomPass.strength = params.strength;
|
|
|
+ bloomPass.radius = params.radius;
|
|
|
|
|
|
const bloomComposer = new EffectComposer( renderer );
|
|
|
bloomComposer.renderToScreen = false;
|
|
@@ -128,7 +126,7 @@
|
|
|
);
|
|
|
mixPass.needsSwap = true;
|
|
|
|
|
|
- const outputPass = new ShaderPass( GammaCorrectionShader );
|
|
|
+ const outputPass = new OutputPass( THREE.ReinhardToneMapping );
|
|
|
|
|
|
const finalComposer = new EffectComposer( renderer );
|
|
|
finalComposer.addPass( renderScene );
|
|
@@ -143,52 +141,34 @@
|
|
|
|
|
|
const gui = new GUI();
|
|
|
|
|
|
- gui.add( params, 'scene', [ 'Scene with Glow', 'Glow only', 'Scene only' ] ).onChange( function ( value ) {
|
|
|
+ const bloomFolder = gui.addFolder( 'bloom' );
|
|
|
|
|
|
- switch ( value ) {
|
|
|
-
|
|
|
- case 'Scene with Glow':
|
|
|
- bloomComposer.renderToScreen = false;
|
|
|
- break;
|
|
|
- case 'Glow only':
|
|
|
- bloomComposer.renderToScreen = true;
|
|
|
- break;
|
|
|
- case 'Scene only':
|
|
|
- // nothing to do
|
|
|
- break;
|
|
|
-
|
|
|
- }
|
|
|
+ bloomFolder.add( params, 'threshold', 0.0, 1.0 ).onChange( function ( value ) {
|
|
|
|
|
|
+ bloomPass.threshold = Number( value );
|
|
|
render();
|
|
|
|
|
|
} );
|
|
|
|
|
|
- const folder = gui.addFolder( 'Bloom Parameters' );
|
|
|
+ bloomFolder.add( params, 'strength', 0.0, 10.0 ).onChange( function ( value ) {
|
|
|
|
|
|
- folder.add( params, 'exposure', 0.1, 2 ).onChange( function ( value ) {
|
|
|
-
|
|
|
- renderer.toneMappingExposure = Math.pow( value, 4.0 );
|
|
|
+ bloomPass.strength = Number( value );
|
|
|
render();
|
|
|
|
|
|
} );
|
|
|
|
|
|
- folder.add( params, 'bloomThreshold', 0.0, 1.0 ).onChange( function ( value ) {
|
|
|
+ bloomFolder.add( params, 'radius', 0.0, 1.0 ).step( 0.01 ).onChange( function ( value ) {
|
|
|
|
|
|
- bloomPass.threshold = Number( value );
|
|
|
+ bloomPass.radius = Number( value );
|
|
|
render();
|
|
|
|
|
|
} );
|
|
|
|
|
|
- folder.add( params, 'bloomStrength', 0.0, 10.0 ).onChange( function ( value ) {
|
|
|
-
|
|
|
- bloomPass.strength = Number( value );
|
|
|
- render();
|
|
|
-
|
|
|
- } );
|
|
|
+ const toneMappingFolder = gui.addFolder( 'tone mapping' );
|
|
|
|
|
|
- folder.add( params, 'bloomRadius', 0.0, 1.0 ).step( 0.01 ).onChange( function ( value ) {
|
|
|
+ toneMappingFolder.add( params, 'exposure', 0.1, 2 ).onChange( function ( value ) {
|
|
|
|
|
|
- bloomPass.radius = Number( value );
|
|
|
+ outputPass.toneMappingExposure = Math.pow( value, 4.0 );
|
|
|
render();
|
|
|
|
|
|
} );
|
|
@@ -270,42 +250,12 @@
|
|
|
|
|
|
function render() {
|
|
|
|
|
|
- switch ( params.scene ) {
|
|
|
-
|
|
|
- case 'Scene only':
|
|
|
- renderer.render( scene, camera );
|
|
|
- break;
|
|
|
- case 'Glow only':
|
|
|
- renderBloom( false );
|
|
|
- break;
|
|
|
- case 'Scene with Glow':
|
|
|
- default:
|
|
|
- // render scene with bloom
|
|
|
- renderBloom( true );
|
|
|
-
|
|
|
- // render the entire scene, then render bloom scene on top
|
|
|
- finalComposer.render();
|
|
|
- break;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+ scene.traverse( darkenNonBloomed );
|
|
|
+ bloomComposer.render();
|
|
|
+ scene.traverse( restoreMaterial );
|
|
|
|
|
|
- function renderBloom( mask ) {
|
|
|
-
|
|
|
- if ( mask === true ) {
|
|
|
-
|
|
|
- scene.traverse( darkenNonBloomed );
|
|
|
- bloomComposer.render();
|
|
|
- scene.traverse( restoreMaterial );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- camera.layers.set( BLOOM_SCENE );
|
|
|
- bloomComposer.render();
|
|
|
- camera.layers.set( ENTIRE_SCENE );
|
|
|
-
|
|
|
- }
|
|
|
+ // render the entire scene, then render bloom scene on top
|
|
|
+ finalComposer.render();
|
|
|
|
|
|
}
|
|
|
|