Viewport.Pathtracer.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import * as THREE from 'three';
  2. import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';
  3. import {
  4. PathTracingSceneGenerator,
  5. PathTracingRenderer,
  6. PhysicalPathTracingMaterial
  7. } from 'three-gpu-pathtracer';
  8. function ViewportPathtracer( renderer ) {
  9. let pathtracer = null;
  10. let quad = null;
  11. function init( scene, camera ) {
  12. if ( pathtracer === null ) {
  13. pathtracer = new PathTracingRenderer( renderer );
  14. pathtracer.setSize( renderer.domElement.offsetWidth, renderer.domElement.offsetHeight );
  15. pathtracer.alpha = true;
  16. pathtracer.camera = camera;
  17. pathtracer.material = new PhysicalPathTracingMaterial();
  18. pathtracer.tiles.set( 3, 4 );
  19. quad = new FullScreenQuad( new THREE.MeshBasicMaterial( {
  20. map: pathtracer.target.texture,
  21. blending: THREE.CustomBlending
  22. } ) );
  23. }
  24. pathtracer.material.backgroundBlur = scene.backgroundBlurriness;
  25. pathtracer.reset();
  26. const generator = new PathTracingSceneGenerator();
  27. const { bvh, textures, materials, lights } = generator.generate( scene );
  28. const ptGeometry = bvh.geometry;
  29. const ptMaterial = pathtracer.material;
  30. ptMaterial.bvh.updateFrom( bvh );
  31. ptMaterial.attributesArray.updateFrom(
  32. ptGeometry.attributes.normal,
  33. ptGeometry.attributes.tangent,
  34. ptGeometry.attributes.uv,
  35. ptGeometry.attributes.color,
  36. );
  37. ptMaterial.materialIndexAttribute.updateFrom( ptGeometry.attributes.materialIndex );
  38. ptMaterial.textures.setTextures( renderer, 2048, 2048, textures );
  39. ptMaterial.materials.updateFrom( materials, textures );
  40. ptMaterial.lights.updateFrom( lights );
  41. if ( scene.environment && scene.environment.isTexture === true ) {
  42. ptMaterial.envMapInfo.updateFrom( scene.environment );
  43. }
  44. }
  45. function setSize( width, height ) {
  46. if ( pathtracer === null ) return;
  47. pathtracer.setSize( width, height );
  48. pathtracer.reset();
  49. }
  50. function update() {
  51. if ( pathtracer === null ) return;
  52. pathtracer.update();
  53. renderer.autoClear = false;
  54. quad.render( renderer );
  55. renderer.autoClear = true;
  56. }
  57. function reset() {
  58. if ( pathtracer === null ) return;
  59. pathtracer.reset();
  60. }
  61. return {
  62. init: init,
  63. setSize: setSize,
  64. update: update,
  65. reset: reset
  66. };
  67. }
  68. export { ViewportPathtracer };