super-three 0.179.0 → 0.184.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +14522 -12207
- package/build/three.core.js +12005 -10954
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +2270 -1005
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +63 -18
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +16573 -7890
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +16533 -7888
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +12 -4
- package/examples/jsm/animation/CCDIKSolver.js +8 -4
- package/examples/jsm/controls/ArcballControls.js +15 -12
- package/examples/jsm/controls/DragControls.js +9 -59
- package/examples/jsm/controls/FirstPersonControls.js +61 -57
- package/examples/jsm/controls/FlyControls.js +5 -1
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +113 -10
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +9 -9
- package/examples/jsm/controls/TransformControls.js +35 -3
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -2
- package/examples/jsm/exporters/GLTFExporter.js +185 -34
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +31 -5
- package/examples/jsm/geometries/DecalGeometry.js +3 -3
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +21 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +110 -13
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +542 -0
- package/examples/jsm/inspector/RendererInspector.js +425 -0
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +238 -0
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +380 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +268 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +2072 -0
- package/examples/jsm/inspector/ui/Style.js +1667 -0
- package/examples/jsm/inspector/ui/Tab.js +265 -0
- package/examples/jsm/inspector/ui/Values.js +476 -0
- package/examples/jsm/inspector/ui/utils.js +69 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +3 -3
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +27 -4029
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +692 -53
- package/examples/jsm/loaders/FBXLoader.js +237 -39
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +159 -185
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +485 -0
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +162 -53
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +9 -41
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -2
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +91 -7
- package/examples/jsm/objects/SkyMesh.js +151 -17
- package/examples/jsm/objects/Water.js +7 -6
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +11 -13
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +175 -61
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +21 -8
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +7 -6
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +52 -10
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +23 -9
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
- package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +59 -9
- package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +81 -20
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +638 -0
- package/examples/jsm/tsl/display/SSRNode.js +186 -69
- package/examples/jsm/tsl/display/SSSNode.js +490 -0
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +381 -75
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
- package/package.json +27 -38
- package/src/Three.Core.js +7 -3
- package/src/Three.TSL.js +61 -16
- package/src/Three.WebGPU.Nodes.js +7 -0
- package/src/Three.WebGPU.js +11 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +21 -5
- package/src/animation/AnimationMixer.js +9 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +54 -14
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +11 -10
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +100 -7
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +24 -12
- package/src/core/Clock.js +7 -0
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +55 -6
- package/src/core/Raycaster.js +4 -3
- package/src/core/RenderTarget.js +14 -5
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +259 -57
- package/src/extras/TextureUtils.js +6 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +10 -8
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +9 -3
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +4 -1
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +13 -2
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +30 -2
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +4 -4
- package/src/loaders/ImageBitmapLoader.js +17 -13
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +9 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +6 -4
- package/src/loaders/ObjectLoader.js +57 -17
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +5 -4
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +18 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +11 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +11 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +2 -1
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +22 -3
- package/src/materials/nodes/Line2NodeMaterial.js +36 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +95 -35
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +23 -21
- package/src/math/Matrix2.js +14 -10
- package/src/math/Matrix3.js +15 -11
- package/src/math/Matrix4.js +94 -81
- package/src/math/Plane.js +5 -4
- package/src/math/Quaternion.js +60 -84
- package/src/math/Sphere.js +1 -1
- package/src/math/Spherical.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -65
- package/src/nodes/TSL.js +11 -8
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +30 -3
- package/src/nodes/accessors/Camera.js +260 -13
- package/src/nodes/accessors/ClippingNode.js +10 -9
- package/src/nodes/accessors/CubeTextureNode.js +32 -6
- package/src/nodes/accessors/InstanceNode.js +164 -39
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +16 -15
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +51 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
- package/src/nodes/accessors/ReferenceNode.js +11 -10
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -24
- package/src/nodes/accessors/StorageTextureNode.js +62 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +41 -31
- package/src/nodes/accessors/TextureNode.js +193 -63
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +25 -5
- package/src/nodes/code/FunctionNode.js +25 -3
- package/src/nodes/core/ArrayNode.js +22 -2
- package/src/nodes/core/AssignNode.js +6 -5
- package/src/nodes/core/AttributeNode.js +5 -4
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +133 -15
- package/src/nodes/core/IndexNode.js +4 -3
- package/src/nodes/core/InputNode.js +3 -2
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +264 -46
- package/src/nodes/core/NodeBuilder.js +453 -87
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +31 -23
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +25 -97
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +34 -3
- package/src/nodes/core/PropertyNode.js +26 -3
- package/src/nodes/core/StackNode.js +99 -23
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +22 -8
- package/src/nodes/core/StructTypeNode.js +13 -18
- package/src/nodes/core/SubBuildNode.js +4 -4
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +37 -13
- package/src/nodes/core/VarNode.js +96 -34
- package/src/nodes/core/VaryingNode.js +2 -18
- package/src/nodes/display/BlendModes.js +0 -63
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +18 -1
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +41 -5
- package/src/nodes/display/PassNode.js +175 -25
- package/src/nodes/display/RenderOutputNode.js +35 -9
- package/src/nodes/display/ScreenNode.js +47 -15
- package/src/nodes/display/ToneMappingNode.js +32 -5
- package/src/nodes/display/ToonOutlinePassNode.js +10 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +72 -14
- package/src/nodes/fog/Fog.js +18 -34
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +128 -46
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +44 -6
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
- package/src/nodes/gpgpu/ComputeNode.js +76 -38
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +34 -9
- package/src/nodes/lighting/LightsNode.js +10 -32
- package/src/nodes/lighting/PointShadowNode.js +167 -148
- package/src/nodes/lighting/ShadowFilterNode.js +55 -65
- package/src/nodes/lighting/ShadowNode.js +189 -44
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +25 -8
- package/src/nodes/math/MathNode.js +98 -57
- package/src/nodes/math/OperatorNode.js +8 -5
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +111 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -3
- package/src/nodes/tsl/TSLCore.js +488 -166
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +14 -13
- package/src/nodes/utils/EventNode.js +67 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +7 -4
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +60 -8
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +60 -1
- package/src/nodes/utils/RTTNode.js +14 -4
- package/src/nodes/utils/ReflectorNode.js +61 -11
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +12 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +46 -18
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +3 -2
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +12 -2
- package/src/objects/SkinnedMesh.js +29 -10
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +372 -179
- package/src/renderers/common/Animation.js +16 -4
- package/src/renderers/common/Attributes.js +16 -2
- package/src/renderers/common/Backend.js +137 -35
- package/src/renderers/common/Background.js +28 -14
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +83 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +55 -3
- package/src/renderers/common/Info.js +337 -6
- package/src/renderers/common/InspectorBase.js +151 -0
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +41 -8
- package/src/renderers/common/PostProcessing.js +9 -226
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +18 -2
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +32 -6
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +22 -6
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +927 -335
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +52 -14
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +208 -47
- package/src/renderers/common/TimestampQueryPool.js +70 -6
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +64 -2
- package/src/renderers/common/XRManager.js +79 -51
- package/src/renderers/common/extras/PMREMGenerator.js +176 -79
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +49 -0
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +8 -5
- package/src/renderers/shaders/UniformsUtils.js +52 -9
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +11 -5
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +63 -122
- package/src/renderers/webgl/WebGLPrograms.js +65 -52
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +191 -26
- package/src/renderers/webgl/WebGLState.js +79 -40
- package/src/renderers/webgl/WebGLTextures.js +234 -68
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
- package/src/renderers/webgl/WebGLUtils.js +8 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
- package/src/renderers/webgpu/WebGPUBackend.js +403 -253
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +5 -3
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
- package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +45 -29
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +5 -4
- package/src/textures/Texture.js +19 -7
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +344 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -144
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, TempNode, NodeUpdateType, Matrix4 } from 'three/webgpu';
|
|
2
|
-
import { add, float, If,
|
|
1
|
+
import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, TempNode, NodeUpdateType, Matrix4, DepthTexture, FloatType } from 'three/webgpu';
|
|
2
|
+
import { add, float, If, Fn, max, texture, uniform, uv, vec2, vec4, luminance, convertToTexture, passTexture, velocity, getViewPosition, viewZToPerspectiveDepth, struct, ivec2, mix, logarithmicDepthToViewZ, viewZToOrthographicDepth } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
5
|
const _size = /*@__PURE__*/ new Vector2();
|
|
@@ -14,6 +14,8 @@ let _rendererState;
|
|
|
14
14
|
* - {@link https://alextardif.com/TAA.html}
|
|
15
15
|
* - {@link https://www.elopezr.com/temporal-aa-and-the-quest-for-the-holy-trail/}
|
|
16
16
|
*
|
|
17
|
+
* Note: MSAA must be disabled when TRAA is in use.
|
|
18
|
+
*
|
|
17
19
|
* @augments TempNode
|
|
18
20
|
* @three_import import { traa } from 'three/addons/tsl/display/TRAANode.js';
|
|
19
21
|
*/
|
|
@@ -77,12 +79,46 @@ class TRAANode extends TempNode {
|
|
|
77
79
|
this.velocityNode = velocityNode;
|
|
78
80
|
|
|
79
81
|
/**
|
|
80
|
-
*
|
|
82
|
+
* The camera the scene is rendered with.
|
|
81
83
|
*
|
|
82
|
-
* @type {
|
|
84
|
+
* @type {Camera}
|
|
83
85
|
*/
|
|
84
86
|
this.camera = camera;
|
|
85
87
|
|
|
88
|
+
/**
|
|
89
|
+
* When the difference between the current and previous depth goes above this threshold,
|
|
90
|
+
* the history is considered invalid.
|
|
91
|
+
*
|
|
92
|
+
* @type {number}
|
|
93
|
+
* @default 0.0005
|
|
94
|
+
*/
|
|
95
|
+
this.depthThreshold = 0.0005;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The depth difference within the 3×3 neighborhood to consider a pixel as an edge.
|
|
99
|
+
*
|
|
100
|
+
* @type {number}
|
|
101
|
+
* @default 0.001
|
|
102
|
+
*/
|
|
103
|
+
this.edgeDepthDiff = 0.001;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The history becomes invalid as the pixel length of the velocity approaches this value.
|
|
107
|
+
*
|
|
108
|
+
* @type {number}
|
|
109
|
+
* @default 128
|
|
110
|
+
*/
|
|
111
|
+
this.maxVelocityLength = 128;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Whether to decrease the weight on the current frame when the velocity is more subpixel.
|
|
115
|
+
* This reduces blurriness under motion, but can introduce a square pattern artifact.
|
|
116
|
+
*
|
|
117
|
+
* @type {boolean}
|
|
118
|
+
* @default true
|
|
119
|
+
*/
|
|
120
|
+
this.useSubpixelCorrection = true;
|
|
121
|
+
|
|
86
122
|
/**
|
|
87
123
|
* The jitter index selects the current camera offset value.
|
|
88
124
|
*
|
|
@@ -106,7 +142,7 @@ class TRAANode extends TempNode {
|
|
|
106
142
|
* @private
|
|
107
143
|
* @type {?RenderTarget}
|
|
108
144
|
*/
|
|
109
|
-
this._historyRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
145
|
+
this._historyRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, depthTexture: new DepthTexture() } );
|
|
110
146
|
this._historyRenderTarget.texture.name = 'TRAANode.history';
|
|
111
147
|
|
|
112
148
|
/**
|
|
@@ -143,13 +179,78 @@ class TRAANode extends TempNode {
|
|
|
143
179
|
*/
|
|
144
180
|
this._originalProjectionMatrix = new Matrix4();
|
|
145
181
|
|
|
182
|
+
/**
|
|
183
|
+
* A uniform node holding the camera's near and far.
|
|
184
|
+
*
|
|
185
|
+
* @private
|
|
186
|
+
* @type {UniformNode<vec2>}
|
|
187
|
+
*/
|
|
188
|
+
this._cameraNearFar = uniform( new Vector2() );
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* A uniform node holding the camera world matrix.
|
|
192
|
+
*
|
|
193
|
+
* @private
|
|
194
|
+
* @type {UniformNode<mat4>}
|
|
195
|
+
*/
|
|
196
|
+
this._cameraWorldMatrix = uniform( new Matrix4() );
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* A uniform node holding the camera world matrix inverse.
|
|
200
|
+
*
|
|
201
|
+
* @private
|
|
202
|
+
* @type {UniformNode<mat4>}
|
|
203
|
+
*/
|
|
204
|
+
this._cameraWorldMatrixInverse = uniform( new Matrix4() );
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* A uniform node holding the camera projection matrix inverse.
|
|
208
|
+
*
|
|
209
|
+
* @private
|
|
210
|
+
* @type {UniformNode<mat4>}
|
|
211
|
+
*/
|
|
212
|
+
this._cameraProjectionMatrixInverse = uniform( new Matrix4() );
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* A uniform node holding the previous frame's view matrix.
|
|
216
|
+
*
|
|
217
|
+
* @private
|
|
218
|
+
* @type {UniformNode<mat4>}
|
|
219
|
+
*/
|
|
220
|
+
this._previousCameraWorldMatrix = uniform( new Matrix4() );
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* A uniform node holding the previous frame's projection matrix inverse.
|
|
224
|
+
*
|
|
225
|
+
* @private
|
|
226
|
+
* @type {UniformNode<mat4>}
|
|
227
|
+
*/
|
|
228
|
+
this._previousCameraProjectionMatrixInverse = uniform( new Matrix4() );
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A texture node for the previous depth buffer.
|
|
232
|
+
*
|
|
233
|
+
* @private
|
|
234
|
+
* @type {TextureNode}
|
|
235
|
+
*/
|
|
236
|
+
this._previousDepthNode = texture( new DepthTexture( 1, 1 ) );
|
|
237
|
+
|
|
146
238
|
/**
|
|
147
239
|
* Sync the post processing stack with the TRAA node.
|
|
240
|
+
*
|
|
148
241
|
* @private
|
|
149
242
|
* @type {boolean}
|
|
150
243
|
*/
|
|
151
244
|
this._needsPostProcessingSync = false;
|
|
152
245
|
|
|
246
|
+
/**
|
|
247
|
+
* The node used to render the scene's velocity.
|
|
248
|
+
*
|
|
249
|
+
* @private
|
|
250
|
+
* @type {?VelocityNode}
|
|
251
|
+
*/
|
|
252
|
+
this._velocityNode = null;
|
|
253
|
+
|
|
153
254
|
}
|
|
154
255
|
|
|
155
256
|
/**
|
|
@@ -192,7 +293,7 @@ class TRAANode extends TempNode {
|
|
|
192
293
|
this.camera.updateProjectionMatrix();
|
|
193
294
|
this._originalProjectionMatrix.copy( this.camera.projectionMatrix );
|
|
194
295
|
|
|
195
|
-
|
|
296
|
+
this._velocityNode.setProjectionMatrix( this._originalProjectionMatrix );
|
|
196
297
|
|
|
197
298
|
//
|
|
198
299
|
|
|
@@ -207,13 +308,13 @@ class TRAANode extends TempNode {
|
|
|
207
308
|
|
|
208
309
|
};
|
|
209
310
|
|
|
210
|
-
const jitterOffset =
|
|
311
|
+
const jitterOffset = _haltonOffsets[ this._jitterIndex ];
|
|
211
312
|
|
|
212
313
|
this.camera.setViewOffset(
|
|
213
314
|
|
|
214
315
|
viewOffset.fullWidth, viewOffset.fullHeight,
|
|
215
316
|
|
|
216
|
-
viewOffset.offsetX + jitterOffset[ 0 ]
|
|
317
|
+
viewOffset.offsetX + jitterOffset[ 0 ] - 0.5, viewOffset.offsetY + jitterOffset[ 1 ] - 0.5,
|
|
217
318
|
|
|
218
319
|
viewOffset.width, viewOffset.height
|
|
219
320
|
|
|
@@ -228,12 +329,12 @@ class TRAANode extends TempNode {
|
|
|
228
329
|
|
|
229
330
|
this.camera.clearViewOffset();
|
|
230
331
|
|
|
231
|
-
|
|
332
|
+
this._velocityNode.setProjectionMatrix( null );
|
|
232
333
|
|
|
233
334
|
// update jitter index
|
|
234
335
|
|
|
235
336
|
this._jitterIndex ++;
|
|
236
|
-
this._jitterIndex = this._jitterIndex % (
|
|
337
|
+
this._jitterIndex = this._jitterIndex % ( _haltonOffsets.length - 1 );
|
|
237
338
|
|
|
238
339
|
}
|
|
239
340
|
|
|
@@ -246,6 +347,18 @@ class TRAANode extends TempNode {
|
|
|
246
347
|
|
|
247
348
|
const { renderer } = frame;
|
|
248
349
|
|
|
350
|
+
// store previous frame matrices before updating current ones
|
|
351
|
+
|
|
352
|
+
this._previousCameraWorldMatrix.value.copy( this._cameraWorldMatrix.value );
|
|
353
|
+
this._previousCameraProjectionMatrixInverse.value.copy( this._cameraProjectionMatrixInverse.value );
|
|
354
|
+
|
|
355
|
+
// update camera matrices uniforms
|
|
356
|
+
|
|
357
|
+
this._cameraNearFar.value.set( this.camera.near, this.camera.far );
|
|
358
|
+
this._cameraWorldMatrix.value.copy( this.camera.matrixWorld );
|
|
359
|
+
this._cameraWorldMatrixInverse.value.copy( this.camera.matrixWorldInverse );
|
|
360
|
+
this._cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
|
|
361
|
+
|
|
249
362
|
// keep the TRAA in sync with the dimensions of the beauty node
|
|
250
363
|
|
|
251
364
|
const beautyRenderTarget = ( this.beautyNode.isRTTNode ) ? this.beautyNode.renderTarget : this.beautyNode.passNode.renderTarget;
|
|
@@ -274,13 +387,10 @@ class TRAANode extends TempNode {
|
|
|
274
387
|
|
|
275
388
|
if ( needsRestart === true ) {
|
|
276
389
|
|
|
277
|
-
//
|
|
278
|
-
|
|
279
|
-
renderer.setRenderTarget( this._historyRenderTarget );
|
|
280
|
-
renderer.clear();
|
|
390
|
+
// make sure render targets are initialized after the resize which triggers a dispose()
|
|
281
391
|
|
|
282
|
-
renderer.
|
|
283
|
-
renderer.
|
|
392
|
+
renderer.initRenderTarget( this._historyRenderTarget );
|
|
393
|
+
renderer.initRenderTarget( this._resolveRenderTarget );
|
|
284
394
|
|
|
285
395
|
// make sure to reset the history with the contents of the beauty buffer otherwise subsequent frames after the
|
|
286
396
|
// resize will fade from a darker color to the correct one because the history was cleared with black.
|
|
@@ -293,6 +403,7 @@ class TRAANode extends TempNode {
|
|
|
293
403
|
|
|
294
404
|
renderer.setRenderTarget( this._resolveRenderTarget );
|
|
295
405
|
_quadMesh.material = this._resolveMaterial;
|
|
406
|
+
_quadMesh.name = 'TRAA';
|
|
296
407
|
_quadMesh.render( renderer );
|
|
297
408
|
renderer.setRenderTarget( null );
|
|
298
409
|
|
|
@@ -300,6 +411,23 @@ class TRAANode extends TempNode {
|
|
|
300
411
|
|
|
301
412
|
renderer.copyTextureToTexture( this._resolveRenderTarget.texture, this._historyRenderTarget.texture );
|
|
302
413
|
|
|
414
|
+
// Copy current depth to previous depth buffer
|
|
415
|
+
|
|
416
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
417
|
+
|
|
418
|
+
// only allow the depth copy if the dimensions of the history render target match with the drawing
|
|
419
|
+
// render buffer and thus the depth texture of the scene. For some reasons, there are timing issues
|
|
420
|
+
// with WebGPU resulting in different size of the drawing buffer and the beauty render target when
|
|
421
|
+
// resizing the browser window. This does not happen with the WebGL backend
|
|
422
|
+
|
|
423
|
+
if ( this._historyRenderTarget.height === size.height && this._historyRenderTarget.width === size.width ) {
|
|
424
|
+
|
|
425
|
+
const currentDepth = this.depthNode.value;
|
|
426
|
+
renderer.copyTextureToTexture( currentDepth, this._historyRenderTarget.depthTexture );
|
|
427
|
+
this._previousDepthNode.value = this._historyRenderTarget.depthTexture;
|
|
428
|
+
|
|
429
|
+
}
|
|
430
|
+
|
|
303
431
|
// restore
|
|
304
432
|
|
|
305
433
|
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
@@ -314,20 +442,20 @@ class TRAANode extends TempNode {
|
|
|
314
442
|
*/
|
|
315
443
|
setup( builder ) {
|
|
316
444
|
|
|
317
|
-
const
|
|
445
|
+
const renderPipeline = builder.context.renderPipeline;
|
|
318
446
|
|
|
319
|
-
if (
|
|
447
|
+
if ( renderPipeline ) {
|
|
320
448
|
|
|
321
449
|
this._needsPostProcessingSync = true;
|
|
322
450
|
|
|
323
|
-
|
|
451
|
+
renderPipeline.context.onBeforeRenderPipeline = () => {
|
|
324
452
|
|
|
325
453
|
const size = builder.renderer.getDrawingBufferSize( _size );
|
|
326
454
|
this.setViewOffset( size.width, size.height );
|
|
327
455
|
|
|
328
456
|
};
|
|
329
457
|
|
|
330
|
-
|
|
458
|
+
renderPipeline.context.onAfterRenderPipeline = () => {
|
|
331
459
|
|
|
332
460
|
this.clearViewOffset();
|
|
333
461
|
|
|
@@ -335,74 +463,247 @@ class TRAANode extends TempNode {
|
|
|
335
463
|
|
|
336
464
|
}
|
|
337
465
|
|
|
338
|
-
|
|
339
|
-
const sampleTexture = this.beautyNode;
|
|
340
|
-
const depthTexture = this.depthNode;
|
|
341
|
-
const velocityTexture = this.velocityNode;
|
|
466
|
+
if ( builder.renderer.reversedDepthBuffer === true ) {
|
|
342
467
|
|
|
343
|
-
|
|
468
|
+
this._historyRenderTarget.depthTexture.type = FloatType;
|
|
344
469
|
|
|
345
|
-
|
|
470
|
+
}
|
|
346
471
|
|
|
347
|
-
|
|
348
|
-
const maxColor = vec4( - 10000 ).toVar();
|
|
349
|
-
const closestDepth = float( 1 ).toVar();
|
|
350
|
-
const closestDepthPixelPosition = vec2( 0 ).toVar();
|
|
472
|
+
if ( builder.context.velocity !== undefined ) {
|
|
351
473
|
|
|
352
|
-
|
|
353
|
-
// clamping the history color with the resulting min/max colors mitigates ghosting
|
|
474
|
+
this._velocityNode = builder.context.velocity;
|
|
354
475
|
|
|
355
|
-
|
|
476
|
+
} else {
|
|
356
477
|
|
|
357
|
-
|
|
478
|
+
this._velocityNode = velocity;
|
|
358
479
|
|
|
359
|
-
|
|
360
|
-
const colorNeighbor = max( vec4( 0 ), sampleTexture.sample( uvNeighbor ) ).toVar(); // use max() to avoid propagate garbage values
|
|
480
|
+
}
|
|
361
481
|
|
|
362
|
-
|
|
363
|
-
maxColor.assign( max( maxColor, colorNeighbor ) );
|
|
482
|
+
const logarithmicToPerspectiveDepth = ( depth ) => {
|
|
364
483
|
|
|
365
|
-
|
|
484
|
+
const { x: near, y: far } = this._cameraNearFar;
|
|
485
|
+
const viewZ = logarithmicDepthToViewZ( depth, near, far );
|
|
486
|
+
return viewZToPerspectiveDepth( viewZ, near, far );
|
|
366
487
|
|
|
367
|
-
|
|
488
|
+
};
|
|
368
489
|
|
|
369
|
-
|
|
490
|
+
const currentDepthStruct = struct( {
|
|
370
491
|
|
|
371
|
-
|
|
372
|
-
|
|
492
|
+
closestDepth: 'float',
|
|
493
|
+
closestPositionTexel: 'vec2',
|
|
494
|
+
farthestDepth: 'float',
|
|
495
|
+
|
|
496
|
+
} );
|
|
497
|
+
|
|
498
|
+
// Samples 3×3 neighborhood pixels and returns the closest and farthest depths.
|
|
499
|
+
const sampleCurrentDepth = Fn( ( [ positionTexel ] ) => {
|
|
500
|
+
|
|
501
|
+
const closestDepth = float( 2 ).toVar();
|
|
502
|
+
const closestPositionTexel = vec2( 0 ).toVar();
|
|
503
|
+
const farthestDepth = float( - 1 ).toVar();
|
|
504
|
+
|
|
505
|
+
for ( let x = - 1; x <= 1; ++ x ) {
|
|
506
|
+
|
|
507
|
+
for ( let y = - 1; y <= 1; ++ y ) {
|
|
508
|
+
|
|
509
|
+
const neighbor = positionTexel.add( vec2( x, y ) ).toVar();
|
|
510
|
+
let depth = this.depthNode.load( neighbor ).r;
|
|
511
|
+
if ( builder.renderer.reversedDepthBuffer ) depth = depth.oneMinus();
|
|
512
|
+
if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth );
|
|
513
|
+
depth = depth.toVar();
|
|
514
|
+
|
|
515
|
+
If( depth.lessThan( closestDepth ), () => {
|
|
516
|
+
|
|
517
|
+
closestDepth.assign( depth );
|
|
518
|
+
closestPositionTexel.assign( neighbor );
|
|
373
519
|
|
|
374
520
|
} );
|
|
375
521
|
|
|
376
|
-
|
|
522
|
+
If( depth.greaterThan( farthestDepth ), () => {
|
|
377
523
|
|
|
378
|
-
|
|
524
|
+
farthestDepth.assign( depth );
|
|
379
525
|
|
|
380
|
-
|
|
526
|
+
} );
|
|
381
527
|
|
|
382
|
-
|
|
528
|
+
}
|
|
383
529
|
|
|
384
|
-
|
|
385
|
-
const historyColor = historyTexture.sample( uvNode.sub( offset ) );
|
|
530
|
+
}
|
|
386
531
|
|
|
387
|
-
|
|
532
|
+
return currentDepthStruct( closestDepth, closestPositionTexel, farthestDepth );
|
|
388
533
|
|
|
389
|
-
|
|
534
|
+
} );
|
|
390
535
|
|
|
391
|
-
|
|
536
|
+
// Samples a previous depth and reproject it using the current camera matrices.
|
|
537
|
+
const samplePreviousDepth = ( uv ) => {
|
|
538
|
+
|
|
539
|
+
let depth = this._previousDepthNode.sample( uv ).r;
|
|
540
|
+
if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth );
|
|
541
|
+
const positionView = getViewPosition( uv, depth, this._previousCameraProjectionMatrixInverse );
|
|
542
|
+
const positionWorld = this._previousCameraWorldMatrix.mul( vec4( positionView, 1 ) ).xyz;
|
|
543
|
+
const viewZ = this._cameraWorldMatrixInverse.mul( vec4( positionWorld, 1 ) ).z;
|
|
544
|
+
return this.camera.isOrthographicCamera
|
|
545
|
+
? viewZToOrthographicDepth( viewZ, this._cameraNearFar.x, this._cameraNearFar.y )
|
|
546
|
+
: viewZToPerspectiveDepth( viewZ, this._cameraNearFar.x, this._cameraNearFar.y );
|
|
547
|
+
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
// Optimized version of AABB clipping.
|
|
551
|
+
// Reference: https://github.com/playdeadgames/temporal
|
|
552
|
+
const clipAABB = Fn( ( [ currentColor, historyColor, minColor, maxColor ] ) => {
|
|
553
|
+
|
|
554
|
+
const pClip = maxColor.rgb.add( minColor.rgb ).mul( 0.5 );
|
|
555
|
+
const eClip = maxColor.rgb.sub( minColor.rgb ).mul( 0.5 ).add( 1e-7 );
|
|
556
|
+
const vClip = historyColor.sub( vec4( pClip, currentColor.a ) );
|
|
557
|
+
const vUnit = vClip.xyz.div( eClip );
|
|
558
|
+
const absUnit = vUnit.abs();
|
|
559
|
+
const maxUnit = max( absUnit.x, absUnit.y, absUnit.z );
|
|
560
|
+
return maxUnit.greaterThan( 1 ).select(
|
|
561
|
+
vec4( pClip, currentColor.a ).add( vClip.div( maxUnit ) ),
|
|
562
|
+
historyColor
|
|
563
|
+
);
|
|
564
|
+
|
|
565
|
+
} ).setLayout( {
|
|
566
|
+
name: 'clipAABB',
|
|
567
|
+
type: 'vec4',
|
|
568
|
+
inputs: [
|
|
569
|
+
{ name: 'currentColor', type: 'vec4' },
|
|
570
|
+
{ name: 'historyColor', type: 'vec4' },
|
|
571
|
+
{ name: 'minColor', type: 'vec4' },
|
|
572
|
+
{ name: 'maxColor', type: 'vec4' }
|
|
573
|
+
]
|
|
574
|
+
} );
|
|
575
|
+
|
|
576
|
+
// Performs variance clipping.
|
|
577
|
+
// See: https://developer.download.nvidia.com/gameworks/events/GDC2016/msalvi_temporal_supersampling.pdf
|
|
578
|
+
const varianceClipping = Fn( ( [ positionTexel, currentColor, historyColor, gamma ] ) => {
|
|
579
|
+
|
|
580
|
+
const offsets = [
|
|
581
|
+
[ - 1, - 1 ],
|
|
582
|
+
[ - 1, 1 ],
|
|
583
|
+
[ 1, - 1 ],
|
|
584
|
+
[ 1, 1 ],
|
|
585
|
+
[ 1, 0 ],
|
|
586
|
+
[ 0, - 1 ],
|
|
587
|
+
[ 0, 1 ],
|
|
588
|
+
[ - 1, 0 ]
|
|
589
|
+
];
|
|
590
|
+
|
|
591
|
+
const moment1 = currentColor.toVar();
|
|
592
|
+
const moment2 = currentColor.pow2().toVar();
|
|
593
|
+
|
|
594
|
+
for ( const [ x, y ] of offsets ) {
|
|
595
|
+
|
|
596
|
+
// Use max() to prevent NaN values from propagating.
|
|
597
|
+
const neighbor = this.beautyNode.offset( ivec2( x, y ) ).load( positionTexel ).max( 0 );
|
|
598
|
+
moment1.addAssign( neighbor );
|
|
599
|
+
moment2.addAssign( neighbor.pow2() );
|
|
600
|
+
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const N = float( offsets.length + 1 );
|
|
604
|
+
const mean = moment1.div( N );
|
|
605
|
+
const variance = moment2.div( N ).sub( mean.pow2() ).max( 0 ).sqrt().mul( gamma );
|
|
606
|
+
const minColor = mean.sub( variance );
|
|
607
|
+
const maxColor = mean.add( variance );
|
|
608
|
+
|
|
609
|
+
return clipAABB( mean.clamp( minColor, maxColor ), historyColor, minColor, maxColor );
|
|
610
|
+
|
|
611
|
+
} );
|
|
612
|
+
|
|
613
|
+
// Returns the amount of subpixel (expressed within [0, 1]) in the velocity.
|
|
614
|
+
const subpixelCorrection = Fn( ( [ velocityUV, textureSize ] ) => {
|
|
615
|
+
|
|
616
|
+
const velocityTexel = velocityUV.mul( textureSize );
|
|
617
|
+
const phase = velocityTexel.fract().abs();
|
|
618
|
+
const weight = max( phase, phase.oneMinus() );
|
|
619
|
+
return weight.x.mul( weight.y ).oneMinus().div( 0.75 );
|
|
620
|
+
|
|
621
|
+
} ).setLayout( {
|
|
622
|
+
name: 'subpixelCorrection',
|
|
623
|
+
type: 'float',
|
|
624
|
+
inputs: [
|
|
625
|
+
{ name: 'velocityUV', type: 'vec2' },
|
|
626
|
+
{ name: 'textureSize', type: 'ivec2' }
|
|
627
|
+
]
|
|
628
|
+
} );
|
|
392
629
|
|
|
393
|
-
|
|
394
|
-
|
|
630
|
+
// Flicker reduction based on luminance weighing.
|
|
631
|
+
const flickerReduction = Fn( ( [ currentColor, historyColor, currentWeight ] ) => {
|
|
395
632
|
|
|
396
|
-
const
|
|
397
|
-
const
|
|
633
|
+
const historyWeight = currentWeight.oneMinus();
|
|
634
|
+
const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1 ) ) ) );
|
|
635
|
+
const compressedHistory = historyColor.mul( float( 1 ).div( ( max( historyColor.r, historyColor.g, historyColor.b ).add( 1 ) ) ) );
|
|
398
636
|
|
|
399
637
|
const luminanceCurrent = luminance( compressedCurrent.rgb );
|
|
400
638
|
const luminanceHistory = luminance( compressedHistory.rgb );
|
|
401
639
|
|
|
402
|
-
currentWeight.mulAssign( float( 1
|
|
403
|
-
historyWeight.mulAssign( float( 1
|
|
640
|
+
currentWeight.mulAssign( float( 1 ).div( luminanceCurrent.add( 1 ) ) );
|
|
641
|
+
historyWeight.mulAssign( float( 1 ).div( luminanceHistory.add( 1 ) ) );
|
|
404
642
|
|
|
405
|
-
return add( currentColor.mul( currentWeight ),
|
|
643
|
+
return add( currentColor.mul( currentWeight ), historyColor.mul( historyWeight ) ).div( max( currentWeight.add( historyWeight ), 0.00001 ) ).toVar();
|
|
644
|
+
|
|
645
|
+
} );
|
|
646
|
+
|
|
647
|
+
const historyNode = texture( this._historyRenderTarget.texture );
|
|
648
|
+
|
|
649
|
+
const resolve = Fn( () => {
|
|
650
|
+
|
|
651
|
+
const uvNode = uv();
|
|
652
|
+
const textureSize = this.beautyNode.size(); // Assumes all the buffers share the same size.
|
|
653
|
+
const positionTexel = uvNode.mul( textureSize );
|
|
654
|
+
|
|
655
|
+
// sample the closest and farthest depths in the current buffer
|
|
656
|
+
|
|
657
|
+
const currentDepth = sampleCurrentDepth( positionTexel );
|
|
658
|
+
const closestDepth = currentDepth.get( 'closestDepth' );
|
|
659
|
+
const closestPositionTexel = currentDepth.get( 'closestPositionTexel' );
|
|
660
|
+
const farthestDepth = currentDepth.get( 'farthestDepth' );
|
|
661
|
+
|
|
662
|
+
// convert the NDC offset to UV offset
|
|
663
|
+
|
|
664
|
+
const offsetUV = this.velocityNode.load( closestPositionTexel ).xy.mul( vec2( 0.5, - 0.5 ) );
|
|
665
|
+
|
|
666
|
+
// sample the previous depth
|
|
667
|
+
|
|
668
|
+
const historyUV = uvNode.sub( offsetUV );
|
|
669
|
+
const previousDepth = samplePreviousDepth( historyUV );
|
|
670
|
+
|
|
671
|
+
// history is considered valid when the UV is in range and there's no disocclusion except on edges
|
|
672
|
+
|
|
673
|
+
const isValidUV = historyUV.greaterThanEqual( 0 ).all().and( historyUV.lessThanEqual( 1 ).all() );
|
|
674
|
+
const isEdge = farthestDepth.sub( closestDepth ).greaterThan( this.edgeDepthDiff );
|
|
675
|
+
const isDisocclusion = closestDepth.sub( previousDepth ).greaterThan( this.depthThreshold );
|
|
676
|
+
const hasValidHistory = isValidUV.and( isEdge.or( isDisocclusion.not() ) );
|
|
677
|
+
|
|
678
|
+
// sample the current and previous colors
|
|
679
|
+
|
|
680
|
+
const currentColor = this.beautyNode.sample( uvNode );
|
|
681
|
+
const historyColor = historyNode.sample( uvNode.sub( offsetUV ) );
|
|
682
|
+
|
|
683
|
+
// increase the weight towards the current frame under motion
|
|
684
|
+
|
|
685
|
+
const motionFactor = uvNode.sub( historyUV ).mul( textureSize ).length().div( this.maxVelocityLength ).saturate();
|
|
686
|
+
const currentWeight = float( 0.05 ).toVar(); // A minimum weight
|
|
687
|
+
|
|
688
|
+
if ( this.useSubpixelCorrection ) {
|
|
689
|
+
|
|
690
|
+
// Increase the minimum weight towards the current frame when the velocity is more subpixel.
|
|
691
|
+
currentWeight.addAssign( subpixelCorrection( offsetUV, textureSize ).mul( 0.25 ) );
|
|
692
|
+
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
currentWeight.assign( hasValidHistory.select( currentWeight.add( motionFactor ).saturate(), 1 ) );
|
|
696
|
+
|
|
697
|
+
// Perform neighborhood clipping/clamping. We use variance clipping here.
|
|
698
|
+
|
|
699
|
+
const varianceGamma = mix( 0.5, 1, motionFactor.oneMinus().pow2() ); // Reasonable gamma range is [0.75, 2]
|
|
700
|
+
const clippedHistoryColor = varianceClipping( positionTexel, currentColor, historyColor, varianceGamma );
|
|
701
|
+
|
|
702
|
+
// flicker reduction based on luminance weighing
|
|
703
|
+
|
|
704
|
+
const output = flickerReduction( currentColor, clippedHistoryColor, currentWeight );
|
|
705
|
+
|
|
706
|
+
return output;
|
|
406
707
|
|
|
407
708
|
} );
|
|
408
709
|
|
|
@@ -431,21 +732,26 @@ class TRAANode extends TempNode {
|
|
|
431
732
|
|
|
432
733
|
export default TRAANode;
|
|
433
734
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
735
|
+
function _halton( index, base ) {
|
|
736
|
+
|
|
737
|
+
let fraction = 1;
|
|
738
|
+
let result = 0;
|
|
739
|
+
while ( index > 0 ) {
|
|
740
|
+
|
|
741
|
+
fraction /= base;
|
|
742
|
+
result += fraction * ( index % base );
|
|
743
|
+
index = Math.floor( index / base );
|
|
744
|
+
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
return result;
|
|
748
|
+
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
const _haltonOffsets = /*@__PURE__*/ Array.from(
|
|
752
|
+
{ length: 32 },
|
|
753
|
+
( _, index ) => [ _halton( index + 1, 2 ), _halton( index + 1, 3 ) ]
|
|
754
|
+
);
|
|
449
755
|
|
|
450
756
|
/**
|
|
451
757
|
* TSL function for creating a TRAA node for Temporal Reprojection Anti-Aliasing.
|
|
@@ -458,4 +764,4 @@ const _JitterVectors = [
|
|
|
458
764
|
* @param {Camera} camera - The camera the scene is rendered with.
|
|
459
765
|
* @returns {TRAANode}
|
|
460
766
|
*/
|
|
461
|
-
export const traa = ( beautyNode, depthNode, velocityNode, camera ) =>
|
|
767
|
+
export const traa = ( beautyNode, depthNode, velocityNode, camera ) => new TRAANode( convertToTexture( beautyNode ), depthNode, velocityNode, camera );
|
|
@@ -138,4 +138,4 @@ export default TransitionNode;
|
|
|
138
138
|
* @param {Node<float> | number} useTexture - Whether `mixTextureNode` should influence the transition or not.
|
|
139
139
|
* @returns {TransitionNode}
|
|
140
140
|
*/
|
|
141
|
-
export const transition = ( nodeA, nodeB, mixTextureNode, mixRatio, threshold, useTexture ) =>
|
|
141
|
+
export const transition = ( nodeA, nodeB, mixTextureNode, mixRatio, threshold, useTexture ) => new TransitionNode( convertToTexture( nodeA ), convertToTexture( nodeB ), convertToTexture( mixTextureNode ), nodeObject( mixRatio ), nodeObject( threshold ), nodeObject( useTexture ) );
|