2
0

webgpu_rtt.html 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <html lang="en">
  2. <head>
  3. <title>WebGPU RTT</title>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  6. <link type="text/css" rel="stylesheet" href="main.css">
  7. </head>
  8. <body>
  9. <div id="info">
  10. <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> WebGPU - RTT<br/>(Chrome Canary with flag: --enable-unsafe-webgpu)
  11. </div>
  12. <script type="module">
  13. import * as THREE from '../build/three.module.js';
  14. import WebGPURenderer from './jsm/renderers/webgpu/WebGPURenderer.js';
  15. import WebGPU from './jsm/renderers/webgpu/WebGPU.js';
  16. let camera, scene, renderer;
  17. let cameraFX, sceneFX, renderTarget;
  18. let box;
  19. const dpr = window.devicePixelRatio;
  20. init().then( animate ).catch( error );
  21. async function init() {
  22. if ( WebGPU.isAvailable() === false ) {
  23. document.body.appendChild( WebGPU.getErrorMessage() );
  24. throw 'No WebGPU support';
  25. }
  26. camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.1, 10 );
  27. camera.position.z = 4;
  28. scene = new THREE.Scene();
  29. scene.background = new THREE.Color( 0x222222 );
  30. // textured mesh
  31. const loader = new THREE.TextureLoader();
  32. const texture = loader.load( './textures/uv_grid_opengl.jpg' );
  33. const geometryBox = new THREE.BoxBufferGeometry();
  34. const materialBox = new THREE.MeshBasicMaterial( { map: texture } );
  35. box = new THREE.Mesh( geometryBox, materialBox );
  36. scene.add( box );
  37. //
  38. renderer = new WebGPURenderer();
  39. renderer.setPixelRatio( dpr );
  40. renderer.setSize( window.innerWidth, window.innerHeight );
  41. document.body.appendChild( renderer.domElement );
  42. // @TODO Rename WebGLRenderTarget to RenderTarget? Or introduce WebGPURenderTarget?
  43. renderTarget = new THREE.WebGLRenderTarget( window.innerWidth * dpr, window.innerHeight * dpr );
  44. window.addEventListener( 'resize', onWindowResize, false );
  45. // FX
  46. cameraFX = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  47. sceneFX = new THREE.Scene();
  48. const geometryFX = new THREE.PlaneBufferGeometry( 2, 2 );
  49. // @TODO Until NodeMaterial is available just copy the beauty pass to screen
  50. const materialFX = new THREE.MeshBasicMaterial( { map: renderTarget.texture } );
  51. const quad = new THREE.Mesh( geometryFX, materialFX );
  52. sceneFX.add( quad );
  53. //
  54. return renderer.init();
  55. }
  56. function onWindowResize() {
  57. camera.aspect = window.innerWidth / window.innerHeight;
  58. camera.updateProjectionMatrix();
  59. renderer.setSize( window.innerWidth, window.innerHeight );
  60. renderTarget.setSize( window.innerWidth * dpr, window.innerHeight * dpr );
  61. }
  62. function animate() {
  63. requestAnimationFrame( animate );
  64. box.rotation.x += 0.01;
  65. box.rotation.y += 0.02;
  66. renderer.setRenderTarget( renderTarget );
  67. renderer.render( scene, camera );
  68. renderer.setRenderTarget( null );
  69. renderer.render( sceneFX, cameraFX );
  70. }
  71. function error( error ) {
  72. console.error( error );
  73. }
  74. </script>
  75. </body>
  76. </html>