1
0

WebGPUTextureUtils.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import {
  2. QuadMesh,
  3. NodeMaterial,
  4. WebGPURenderer,
  5. CanvasTexture
  6. } from 'three';
  7. import { texture, uv } from 'three/tsl';
  8. let _renderer;
  9. const _quadMesh = /*@__PURE__*/ new QuadMesh();
  10. export async function decompress( blitTexture, maxTextureSize = Infinity, renderer = null ) {
  11. if ( renderer === null ) {
  12. renderer = _renderer = new WebGPURenderer();
  13. await renderer.init();
  14. }
  15. const material = new NodeMaterial();
  16. material.fragmentNode = texture( blitTexture ).uv( uv().flipY() );
  17. const width = Math.min( blitTexture.image.width, maxTextureSize );
  18. const height = Math.min( blitTexture.image.height, maxTextureSize );
  19. const currentOutputColorSpace = renderer.outputColorSpace;
  20. renderer.setSize( width, height );
  21. renderer.outputColorSpace = blitTexture.colorSpace;
  22. _quadMesh.material = material;
  23. _quadMesh.render( renderer );
  24. renderer.outputColorSpace = currentOutputColorSpace;
  25. const canvas = document.createElement( 'canvas' );
  26. const context = canvas.getContext( '2d' );
  27. canvas.width = width;
  28. canvas.height = height;
  29. context.drawImage( renderer.domElement, 0, 0, width, height );
  30. const readableTexture = new CanvasTexture( canvas );
  31. readableTexture.minFilter = blitTexture.minFilter;
  32. readableTexture.magFilter = blitTexture.magFilter;
  33. readableTexture.wrapS = blitTexture.wrapS;
  34. readableTexture.wrapT = blitTexture.wrapT;
  35. readableTexture.colorSpace = blitTexture.colorSpace;
  36. readableTexture.name = blitTexture.name;
  37. if ( _renderer !== null ) {
  38. _renderer.dispose();
  39. _renderer = null;
  40. }
  41. return readableTexture;
  42. }