WebGPUTextureUtils.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import {
  2. QuadMesh,
  3. NodeMaterial,
  4. WebGPURenderer,
  5. CanvasTexture
  6. } from 'three';
  7. import { texture, uv } from 'three/tsl';
  8. /**
  9. * @module WebGPUTextureUtils
  10. * @three_import import * as WebGPUTextureUtils from 'three/addons/utils/WebGPUTextureUtils.js';
  11. */
  12. let _renderer;
  13. const _quadMesh = /*@__PURE__*/ new QuadMesh();
  14. /**
  15. * Returns an uncompressed version of the given compressed texture.
  16. *
  17. * This module can only be used with {@link WebGPURenderer}. When using {@link WebGLRenderer},
  18. * import the function from {@link WebGLTextureUtils}.
  19. *
  20. * @async
  21. * @param {CompressedTexture} blitTexture - The compressed texture.
  22. * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.
  23. * @param {?WebGPURenderer} [renderer=null] - A reference to a renderer.
  24. * @return {Promise<CanvasTexture>} A Promise that resolved with the uncompressed texture.
  25. */
  26. export async function decompress( blitTexture, maxTextureSize = Infinity, renderer = null ) {
  27. if ( renderer === null ) {
  28. renderer = _renderer = new WebGPURenderer();
  29. await renderer.init();
  30. }
  31. const material = new NodeMaterial();
  32. material.fragmentNode = texture( blitTexture, uv().flipY() );
  33. const width = Math.min( blitTexture.image.width, maxTextureSize );
  34. const height = Math.min( blitTexture.image.height, maxTextureSize );
  35. const currentOutputColorSpace = renderer.outputColorSpace;
  36. renderer.setSize( width, height );
  37. renderer.outputColorSpace = blitTexture.colorSpace;
  38. _quadMesh.material = material;
  39. _quadMesh.render( renderer );
  40. renderer.outputColorSpace = currentOutputColorSpace;
  41. const canvas = document.createElement( 'canvas' );
  42. const context = canvas.getContext( '2d' );
  43. canvas.width = width;
  44. canvas.height = height;
  45. context.drawImage( renderer.domElement, 0, 0, width, height );
  46. const readableTexture = new CanvasTexture( canvas );
  47. readableTexture.minFilter = blitTexture.minFilter;
  48. readableTexture.magFilter = blitTexture.magFilter;
  49. readableTexture.wrapS = blitTexture.wrapS;
  50. readableTexture.wrapT = blitTexture.wrapT;
  51. readableTexture.colorSpace = blitTexture.colorSpace;
  52. readableTexture.name = blitTexture.name;
  53. if ( _renderer !== null ) {
  54. _renderer.dispose();
  55. _renderer = null;
  56. }
  57. return readableTexture;
  58. }