Skip to content

Commit

Permalink
TextureUtils: Add WebGPU version. (#29348)
Browse files Browse the repository at this point in the history
* TextureUtils: Add WebGPU version.

* TextureUtilsGPU: Clean up.

* TextureUtilsGPU: Fix uv coords.
  • Loading branch information
Mugen87 authored Sep 9, 2024
1 parent e9aebe2 commit 94f287d
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/jsm/utils/TextureUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ export function decompress( texture, maxTextureSize = Infinity, renderer = null
readableTexture.magFilter = texture.magFilter;
readableTexture.wrapS = texture.wrapS;
readableTexture.wrapT = texture.wrapT;
readableTexture.colorSpace = texture.colorSpace;
readableTexture.name = texture.name;

if ( _renderer ) {
Expand Down
63 changes: 63 additions & 0 deletions examples/jsm/utils/TextureUtilsGPU.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import {
QuadMesh,
NodeMaterial,
WebGPURenderer,
CanvasTexture
} from 'three';
import { texture, uv } from 'three/tsl';

let _renderer;
const _quadMesh = /*@__PURE__*/ new QuadMesh();

export async function decompress( blitTexture, maxTextureSize = Infinity, renderer = null ) {

if ( renderer === null ) {

renderer = _renderer = new WebGPURenderer();
await renderer.init();

}

const material = new NodeMaterial();
material.fragmentNode = texture( blitTexture ).uv( uv().flipY() );

const width = Math.min( blitTexture.image.width, maxTextureSize );
const height = Math.min( blitTexture.image.height, maxTextureSize );

const currentOutputColorSpace = renderer.outputColorSpace;

renderer.setSize( width, height );
renderer.outputColorSpace = blitTexture.colorSpace;

_quadMesh.material = material;
_quadMesh.render( renderer );

renderer.outputColorSpace = currentOutputColorSpace;

const canvas = document.createElement( 'canvas' );
const context = canvas.getContext( '2d' );

canvas.width = width;
canvas.height = height;

context.drawImage( renderer.domElement, 0, 0, width, height );

const readableTexture = new CanvasTexture( canvas );

readableTexture.minFilter = blitTexture.minFilter;
readableTexture.magFilter = blitTexture.magFilter;
readableTexture.wrapS = blitTexture.wrapS;
readableTexture.wrapT = blitTexture.wrapT;
readableTexture.colorSpace = blitTexture.colorSpace;
readableTexture.name = blitTexture.name;

if ( _renderer !== null ) {

_renderer.dispose();
_renderer = null;

}

return readableTexture;

}

0 comments on commit 94f287d

Please sign in to comment.