|
|
@@ -7,16 +7,24 @@
|
|
|
<title>three.js webgpu - postprocessing - Screen Space Reflections (SSR)</title>
|
|
|
<meta charset="utf-8">
|
|
|
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
|
|
|
- <link type="text/css" rel="stylesheet" href="main.css">
|
|
|
+ <link type="text/css" rel="stylesheet" href="example.css">
|
|
|
</head>
|
|
|
|
|
|
<body>
|
|
|
|
|
|
- <div id="info">
|
|
|
- <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgpu - postprocessing - screen space reflections<br />
|
|
|
- <a href="https://skfb.ly/6tqYD" target="_blank" rel="noopener">Steampunk Camera</a> by
|
|
|
- <a href="https://sketchfab.com/lumoize" target="_blank" rel="noopener">dylanheyes</a> is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener">Creative Commons Attribution</a>.<br />
|
|
|
- </div>
|
|
|
+ <div id="info">
|
|
|
+ <a href="https://threejs.org/" target="_blank" rel="noopener" class="logo-link"></a>
|
|
|
+
|
|
|
+ <div class="title-wrapper">
|
|
|
+ <a href="https://threejs.org/" target="_blank" rel="noopener">three.js</a><span>SSR</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <small>
|
|
|
+ Screen Space Reflections.<br />
|
|
|
+ <a href="https://skfb.ly/6tqYD" target="_blank" rel="noopener">Steampunk Camera</a> by
|
|
|
+ <a href="https://sketchfab.com/lumoize" target="_blank" rel="noopener">dylanheyes</a> is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener">Creative Commons Attribution</a>.
|
|
|
+ </small>
|
|
|
+ </div>
|
|
|
|
|
|
<script type="importmap">
|
|
|
{
|
|
|
@@ -40,8 +48,7 @@
|
|
|
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
|
|
|
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
|
|
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
|
|
|
- import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
|
|
|
- import Stats from 'three/addons/libs/stats.module.js';
|
|
|
+ import { Inspector } from 'three/addons/inspector/Inspector.js';
|
|
|
|
|
|
const params = {
|
|
|
quality: 0.5,
|
|
|
@@ -54,7 +61,7 @@
|
|
|
};
|
|
|
|
|
|
let camera, scene, model, renderer, postProcessing, ssrPass;
|
|
|
- let gui, stats, controls;
|
|
|
+ let controls;
|
|
|
|
|
|
init();
|
|
|
|
|
|
@@ -105,6 +112,7 @@
|
|
|
renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
renderer.setAnimationLoop( animate );
|
|
|
renderer.toneMapping = THREE.ACESFilmicToneMapping;
|
|
|
+ renderer.inspector = new Inspector();
|
|
|
document.body.appendChild( renderer.domElement );
|
|
|
|
|
|
await renderer.init();
|
|
|
@@ -127,10 +135,14 @@
|
|
|
metalrough: vec2( metalness, roughness ) // pack metalness and roughness into a single attachment
|
|
|
} ) );
|
|
|
|
|
|
- const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
|
- const scenePassNormal = scenePass.getTextureNode( 'normal' );
|
|
|
- const scenePassDepth = scenePass.getTextureNode( 'depth' );
|
|
|
- const scenePassMetalRough = scenePass.getTextureNode( 'metalrough' );
|
|
|
+ const scenePassColor = scenePass.getTextureNode( 'output' ).toInspector( 'Color' );
|
|
|
+ const scenePassNormal = scenePass.getTextureNode( 'normal' ).toInspector( 'Normal' );
|
|
|
+ const scenePassDepth = scenePass.getTextureNode( 'depth' ).toInspector( 'Depth', () => {
|
|
|
+
|
|
|
+ return scenePass.getLinearDepthNode();
|
|
|
+
|
|
|
+ } );
|
|
|
+ const scenePassMetalRough = scenePass.getTextureNode( 'metalrough' ).toInspector( 'Metalness-Roughness' );
|
|
|
|
|
|
// optional: optimize bandwidth by reducing the texture precision for normals and metal/roughness
|
|
|
|
|
|
@@ -148,7 +160,7 @@
|
|
|
|
|
|
//
|
|
|
|
|
|
- ssrPass = ssr( scenePassColor, scenePassDepth, sceneNormal, scenePassMetalRough.r, scenePassMetalRough.g );
|
|
|
+ ssrPass = ssr( scenePassColor, scenePassDepth, sceneNormal, scenePassMetalRough.r, scenePassMetalRough.g ).toInspector( 'SSR' );
|
|
|
|
|
|
// blend SSR over beauty
|
|
|
|
|
|
@@ -162,22 +174,17 @@
|
|
|
controls.enableDamping = true;
|
|
|
controls.update();
|
|
|
|
|
|
- // stats
|
|
|
-
|
|
|
- stats = new Stats();
|
|
|
- document.body.appendChild( stats.dom );
|
|
|
-
|
|
|
window.addEventListener( 'resize', onWindowResize );
|
|
|
|
|
|
// GUI
|
|
|
|
|
|
- gui = new GUI();
|
|
|
+ const gui = renderer.inspector.createParameters( 'Settings' );
|
|
|
const ssrFolder = gui.addFolder( 'SSR' );
|
|
|
- ssrFolder.add( params, 'quality' ).min( 0 ).max( 1 ).onChange( updateParameters );
|
|
|
- ssrFolder.add( params, 'blurQuality' ).min( 1 ).max( 3 ).step( 1 ).onChange( updateParameters );
|
|
|
- ssrFolder.add( params, 'maxDistance' ).min( 0 ).max( 1 ).onChange( updateParameters );
|
|
|
- ssrFolder.add( params, 'opacity' ).min( 0 ).max( 1 ).onChange( updateParameters );
|
|
|
- ssrFolder.add( params, 'thickness' ).min( 0 ).max( 0.05 ).onChange( updateParameters );
|
|
|
+ ssrFolder.add( params, 'quality', 0, 1 ).onChange( updateParameters );
|
|
|
+ ssrFolder.add( params, 'blurQuality', 1, 3 ).step( 1 ).onChange( updateParameters );
|
|
|
+ ssrFolder.add( params, 'maxDistance', 0, 1 ).onChange( updateParameters );
|
|
|
+ ssrFolder.add( params, 'opacity', 0, 1 ).onChange( updateParameters );
|
|
|
+ ssrFolder.add( params, 'thickness', 0, 0.05 ).onChange( updateParameters );
|
|
|
ssrFolder.add( params, 'enabled' ).onChange( () => {
|
|
|
|
|
|
if ( params.enabled === true ) {
|
|
|
@@ -194,7 +201,7 @@
|
|
|
|
|
|
} );
|
|
|
const modelFolder = gui.addFolder( 'Model' );
|
|
|
- modelFolder.add( params, 'roughness' ).min( 0 ).max( 1 ).onChange( ( value ) => {
|
|
|
+ modelFolder.add( params, 'roughness', 0, 1 ).onChange( ( value ) => {
|
|
|
|
|
|
model.traverse( function ( object ) {
|
|
|
|
|
|
@@ -233,14 +240,10 @@
|
|
|
|
|
|
function animate() {
|
|
|
|
|
|
- stats.begin();
|
|
|
-
|
|
|
controls.update();
|
|
|
|
|
|
postProcessing.render();
|
|
|
-
|
|
|
- stats.end();
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
</script>
|