From 5d274d647c774de0a5a01ab10a77dc70c992933f Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Mon, 1 Jul 2024 13:33:17 +0200 Subject: [PATCH 1/2] Node: Add `Lut3DNode`. --- examples/files.json | 1 + .../webgpu_postprocessing_3dlut.jpg | Bin 0 -> 56743 bytes examples/webgpu_postprocessing_3dlut.html | 195 ++++++++++++++++++ src/nodes/Nodes.js | 1 + src/nodes/display/Lut3DNode.js | 53 +++++ 5 files changed, 250 insertions(+) create mode 100644 examples/screenshots/webgpu_postprocessing_3dlut.jpg create mode 100644 examples/webgpu_postprocessing_3dlut.html create mode 100644 src/nodes/display/Lut3DNode.js diff --git a/examples/files.json b/examples/files.json index ada08df9ad6529..e5c5c4e737c898 100644 --- a/examples/files.json +++ b/examples/files.json @@ -367,6 +367,7 @@ "webgpu_pmrem_equirectangular", "webgpu_pmrem_scene", "webgpu_portal", + "webgpu_postprocessing_3dlut", "webgpu_postprocessing_afterimage", "webgpu_postprocessing_anamorphic", "webgpu_postprocessing_dof", diff --git a/examples/screenshots/webgpu_postprocessing_3dlut.jpg b/examples/screenshots/webgpu_postprocessing_3dlut.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e184a811d47e80403be228fee4f7ae3843f2bbb GIT binary patch literal 56743 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 a88TEKsHGi^OWG(6rH#NJtxFU)KmXZPe)p09 literal 0 HcmV?d00001 diff --git a/examples/webgpu_postprocessing_3dlut.html b/examples/webgpu_postprocessing_3dlut.html new file mode 100644 index 00000000000000..042c6cba64d8b5 --- /dev/null +++ b/examples/webgpu_postprocessing_3dlut.html @@ -0,0 +1,195 @@ + + + + three.js webgpu - 3d luts + + + + + + +
+ three.js - 3D LUTs
+ Battle Damaged Sci-fi Helmet by + theblueturtle_
+ Royal Esplanade from HDRI Haven
+ LUTs from RocketStock, FreePresets.com +
+ + + + + + + diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index 1b1fdd2230c978..b43ab243b3851b 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -132,6 +132,7 @@ export { default as DepthOfFieldNode, dof } from './display/DepthOfFieldNode.js' export { default as DotScreenNode, dotScreen } from './display/DotScreenNode.js'; export { default as RGBShiftNode, rgbShift } from './display/RGBShiftNode.js'; export { default as FilmNode, film } from './display/FilmNode.js'; +export { default as Lut3DNode, lut3D } from './display/Lut3DNode.js'; export { default as PassNode, pass, texturePass, depthPass } from './display/PassNode.js'; diff --git a/src/nodes/display/Lut3DNode.js b/src/nodes/display/Lut3DNode.js new file mode 100644 index 00000000000000..54cc3d922a8fce --- /dev/null +++ b/src/nodes/display/Lut3DNode.js @@ -0,0 +1,53 @@ +import TempNode from '../core/TempNode.js'; +import { addNodeElement, tslFn, nodeObject, vec3, vec4, float } from '../shadernode/ShaderNode.js'; +import { uniform } from '../core/UniformNode.js'; +import { mix } from '../math/MathNode.js'; + +class Lut3DNode extends TempNode { + + constructor( inputNode, lutNode, size, intensityNode ) { + + super(); + + this.inputNode = inputNode; + this.lutNode = lutNode; + this.size = uniform( size ); + this.intensityNode = intensityNode; + + } + + setup() { + + const { inputNode, lutNode } = this; + + const sampleLut = ( uv ) => lutNode.uv( uv ); + + const lut3D = tslFn( () => { + + const base = inputNode; + + // pull the sample in by half a pixel so the sample begins at the center of the edge pixels. + + const pixelWidth = float( 1.0 ).div( this.size ); + const halfPixelWidth = float( 0.5 ).div( this.size ); + const uvw = vec3( halfPixelWidth ).add( base.rgb.mul( float( 1.0 ).sub( pixelWidth ) ) ); + + const lutValue = vec4( sampleLut( uvw ).rgb, base.a ); + + return vec4( mix( base, lutValue, this.intensityNode ) ); + + } ); + + const outputNode = lut3D(); + + return outputNode; + + } + +} + +export const lut3D = ( node, lut, size, intensity ) => nodeObject( new Lut3DNode( nodeObject( node ), nodeObject( lut ), size, nodeObject( intensity ) ) ); + +addNodeElement( 'lut3D', lut3D ); + +export default Lut3DNode; From b3c0cb5ca5086ba68638b32a50dc7ab6d44e7fb1 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Mon, 1 Jul 2024 13:44:28 +0200 Subject: [PATCH 2/2] E2E: Add example to exception list. --- test/e2e/puppeteer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/e2e/puppeteer.js b/test/e2e/puppeteer.js index bb55bdc4fc1cfa..9e906fc6f297b2 100644 --- a/test/e2e/puppeteer.js +++ b/test/e2e/puppeteer.js @@ -124,6 +124,7 @@ const exceptionList = [ // WebGPURenderer: Unknown problem 'webgpu_postprocessing_afterimage', + 'webgpu_postprocessing_3dlut', 'webgpu_backdrop_water', 'webgpu_camera_logarithmicdepthbuffer', 'webgpu_clipping',