|
36 | 36 | <script type="module"> |
37 | 37 |
|
38 | 38 | import * as THREE from 'three/webgpu'; |
| 39 | + import { pass } from 'three/tsl'; |
| 40 | + import { bloom } from 'three/addons/tsl/display/BloomNode.js'; |
39 | 41 |
|
40 | 42 | import { Inspector } from 'three/addons/inspector/Inspector.js'; |
41 | 43 |
|
|
44 | 46 | import { SkyMesh } from 'three/addons/objects/SkyMesh.js'; |
45 | 47 |
|
46 | 48 | let container; |
47 | | - let camera, scene, renderer; |
48 | | - let controls, water, sun, mesh; |
| 49 | + let camera, scene, renderer, postProcessing; |
| 50 | + let controls, water, sun, mesh, bloomPass; |
49 | 51 |
|
50 | 52 | init(); |
51 | 53 |
|
|
60 | 62 | renderer.setSize( window.innerWidth, window.innerHeight ); |
61 | 63 | renderer.setAnimationLoop( render ); |
62 | 64 | renderer.toneMapping = THREE.ACESFilmicToneMapping; |
63 | | - renderer.toneMappingExposure = 0.5; |
| 65 | + renderer.toneMappingExposure = 0.1; |
64 | 66 | renderer.inspector = new Inspector(); |
65 | 67 | container.appendChild( renderer.domElement ); |
66 | 68 |
|
|
71 | 73 | camera = new THREE.PerspectiveCamera( 55, window.innerWidth / window.innerHeight, 1, 20000 ); |
72 | 74 | camera.position.set( 30, 30, 100 ); |
73 | 75 |
|
| 76 | + // Post-processing |
| 77 | + |
| 78 | + postProcessing = new THREE.PostProcessing( renderer ); |
| 79 | + |
| 80 | + const scenePass = pass( scene, camera ); |
| 81 | + const scenePassColor = scenePass.getTextureNode( 'output' ); |
| 82 | + |
| 83 | + bloomPass = bloom( scenePassColor ); |
| 84 | + bloomPass.threshold.value = 0; |
| 85 | + bloomPass.strength.value = 0.1; |
| 86 | + bloomPass.radius.value = 0; |
| 87 | + |
| 88 | + postProcessing.outputNode = scenePassColor.add( bloomPass ); |
| 89 | + |
74 | 90 | // |
75 | 91 |
|
76 | 92 | sun = new THREE.Vector3(); |
|
110 | 126 |
|
111 | 127 | const parameters = { |
112 | 128 | elevation: 2, |
113 | | - azimuth: 180 |
| 129 | + azimuth: 180, |
| 130 | + exposure: 0.1 |
114 | 131 | }; |
115 | 132 |
|
116 | 133 | const pmremGenerator = new THREE.PMREMGenerator( renderer ); |
|
164 | 181 | const folderSky = gui.addFolder( 'Sky' ); |
165 | 182 | folderSky.add( parameters, 'elevation', 0, 90, 0.1 ).onChange( updateSun ); |
166 | 183 | folderSky.add( parameters, 'azimuth', - 180, 180, 0.1 ).onChange( updateSun ); |
| 184 | + folderSky.add( parameters, 'exposure', 0, 1, 0.0001 ).onChange( function ( value ) { |
| 185 | + |
| 186 | + renderer.toneMappingExposure = value; |
167 | 187 |
|
| 188 | + } ); |
168 | 189 |
|
169 | 190 | const folderWater = gui.addFolder( 'Water' ); |
170 | 191 | folderWater.add( water.distortionScale, 'value', 0, 8, 0.1 ).name( 'distortionScale' ); |
171 | 192 | folderWater.add( water.size, 'value', 0.1, 10, 0.1 ).name( 'size' ); |
172 | 193 |
|
| 194 | + const folderBloom = gui.addFolder( 'Bloom' ); |
| 195 | + folderBloom.add( bloomPass.strength, 'value', 0, 3, 0.01 ).name( 'strength' ); |
| 196 | + folderBloom.add( bloomPass.radius, 'value', 0, 1, 0.01 ).name( 'radius' ); |
| 197 | + |
173 | 198 | // |
174 | 199 |
|
175 | 200 | window.addEventListener( 'resize', onWindowResize ); |
|
193 | 218 | mesh.rotation.x = time * 0.5; |
194 | 219 | mesh.rotation.z = time * 0.51; |
195 | 220 |
|
196 | | - renderer.render( scene, camera ); |
| 221 | + postProcessing.render(); |
197 | 222 |
|
198 | 223 | } |
199 | 224 |
|
|
0 commit comments