|
@@ -28,7 +28,7 @@
|
|
|
import * as THREE from 'three';
|
|
|
import { timerLocal, vec2, uv, texture, mix, checker, normalLocal, positionLocal, color, oscSine, attribute, MeshBasicNodeMaterial, PointsNodeMaterial, LineBasicNodeMaterial } from 'three/nodes';
|
|
|
|
|
|
- import { DDSLoader } from 'three/addons/loaders/DDSLoader.js';
|
|
|
+ import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';
|
|
|
|
|
|
import WebGPU from 'three/addons/capabilities/WebGPU.js';
|
|
|
import WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';
|
|
@@ -39,7 +39,7 @@
|
|
|
|
|
|
init();
|
|
|
|
|
|
- function init() {
|
|
|
+ async function init() {
|
|
|
|
|
|
if ( WebGPU.isAvailable() === false ) {
|
|
|
|
|
@@ -55,6 +55,15 @@
|
|
|
scene = new THREE.Scene();
|
|
|
scene.background = new THREE.Color( 0x222222 );
|
|
|
|
|
|
+ //
|
|
|
+
|
|
|
+ renderer = new WebGPURenderer( { requiredFeatures: [ 'texture-compression-bc', 'texture-compression-astc' ] } );
|
|
|
+ renderer.setPixelRatio( window.devicePixelRatio );
|
|
|
+ renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
+ renderer.setAnimationLoop( animate );
|
|
|
+ document.body.appendChild( renderer.domElement );
|
|
|
+ await renderer.init();
|
|
|
+
|
|
|
// textures
|
|
|
|
|
|
const textureLoader = new THREE.TextureLoader();
|
|
@@ -67,10 +76,11 @@
|
|
|
textureDisplace.wrapS = THREE.RepeatWrapping;
|
|
|
textureDisplace.wrapT = THREE.RepeatWrapping;
|
|
|
|
|
|
- // compressed texture
|
|
|
+ const ktxLoader = new KTX2Loader()
|
|
|
+ .setTranscoderPath( 'jsm/libs/basis/' )
|
|
|
+ .detectSupport( renderer );
|
|
|
|
|
|
- const ddsLoader = new DDSLoader();
|
|
|
- const dxt5Texture = ddsLoader.load( './textures/compressed/explosion_dxt5_mip.dds' );
|
|
|
+ const ktxTexture = await ktxLoader.loadAsync( './textures/compressed/sample_uastc_zstd.ktx2' );
|
|
|
|
|
|
// box mesh
|
|
|
|
|
@@ -114,7 +124,6 @@
|
|
|
const geometryPlane = new THREE.PlaneGeometry();
|
|
|
const materialPlane = new MeshBasicNodeMaterial();
|
|
|
materialPlane.colorNode = texture( createDataTexture() ).add( color( 0x0000FF ) );
|
|
|
- materialPlane.opacityNode = texture( dxt5Texture ).a;
|
|
|
materialPlane.transparent = true;
|
|
|
|
|
|
const plane = new THREE.Mesh( geometryPlane, materialPlane );
|
|
@@ -124,14 +133,15 @@
|
|
|
// compressed texture
|
|
|
|
|
|
const materialCompressed = new MeshBasicNodeMaterial();
|
|
|
- materialCompressed.colorNode = texture( dxt5Texture );
|
|
|
+ materialCompressed.colorNode = texture( ktxTexture );
|
|
|
materialCompressed.emissiveNode = oscSine().mix( color( 0x663300 ), color( 0x0000FF ) );
|
|
|
materialCompressed.alphaTestNode = oscSine();
|
|
|
materialCompressed.transparent = true;
|
|
|
|
|
|
- const boxCompressed = new THREE.Mesh( geometryBox, materialCompressed );
|
|
|
- boxCompressed.position.set( - 2, 1, 0 );
|
|
|
- scene.add( boxCompressed );
|
|
|
+ const geo = flipY( new THREE.PlaneGeometry() );
|
|
|
+ const planeCompressed = new THREE.Mesh( geo, materialCompressed );
|
|
|
+ planeCompressed.position.set( - 2, 1, 0 );
|
|
|
+ scene.add( planeCompressed );
|
|
|
|
|
|
// points
|
|
|
|
|
@@ -171,14 +181,6 @@
|
|
|
line.position.set( 2, 1, 0 );
|
|
|
scene.add( line );
|
|
|
|
|
|
- //
|
|
|
-
|
|
|
- renderer = new WebGPURenderer( { requiredFeatures: [ 'texture-compression-bc' ] } );
|
|
|
- renderer.setPixelRatio( window.devicePixelRatio );
|
|
|
- renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
- renderer.setAnimationLoop( animate );
|
|
|
- document.body.appendChild( renderer.domElement );
|
|
|
-
|
|
|
window.addEventListener( 'resize', onWindowResize );
|
|
|
|
|
|
}
|
|
@@ -194,8 +196,12 @@
|
|
|
|
|
|
function animate() {
|
|
|
|
|
|
- box.rotation.x += 0.01;
|
|
|
- box.rotation.y += 0.02;
|
|
|
+ if ( box ) {
|
|
|
+
|
|
|
+ box.rotation.x += 0.01;
|
|
|
+ box.rotation.y += 0.02;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
renderer.render( scene, camera );
|
|
|
|
|
@@ -232,6 +238,21 @@
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /** Correct UVs to be compatible with `flipY=false` textures. */
|
|
|
+ function flipY( geometry ) {
|
|
|
+
|
|
|
+ const uv = geometry.attributes.uv;
|
|
|
+
|
|
|
+ for ( let i = 0; i < uv.count; i ++ ) {
|
|
|
+
|
|
|
+ uv.setY( i, 1 - uv.getY( i ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return geometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
</script>
|
|
|
</body>
|
|
|
</html>
|