super-three 0.170.1 → 0.172.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/README.md +1 -1
- package/build/three.cjs +157 -49
- package/build/three.core.js +104 -42
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +53 -8
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +10 -5
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +21191 -1008
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +21189 -1008
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +0 -5
- package/examples/jsm/animation/CCDIKSolver.js +3 -2
- package/examples/jsm/controls/ArcballControls.js +28 -19
- package/examples/jsm/controls/OrbitControls.js +5 -4
- package/examples/jsm/csm/CSMShadowNode.js +16 -11
- package/examples/jsm/curves/NURBSCurve.js +1 -1
- package/examples/jsm/curves/NURBSUtils.js +3 -0
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +11 -7
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/PLYExporter.js +2 -2
- package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
- package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
- package/examples/jsm/lights/LightProbeGenerator.js +3 -3
- package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
- package/examples/jsm/loaders/3MFLoader.js +6 -3
- package/examples/jsm/loaders/BVHLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +5 -5
- package/examples/jsm/loaders/DDSLoader.js +42 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +22 -2
- package/examples/jsm/loaders/KTX2Loader.js +6 -1
- package/examples/jsm/loaders/KTXLoader.js +4 -4
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MTLLoader.js +1 -0
- package/examples/jsm/loaders/NRRDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +7 -7
- package/examples/jsm/loaders/PVRLoader.js +1 -1
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +1 -1
- package/examples/jsm/loaders/VRMLLoader.js +7 -7
- package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/OBB.js +17 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
- package/examples/jsm/misc/Volume.js +20 -12
- package/examples/jsm/misc/VolumeSlice.js +2 -2
- package/examples/jsm/modifiers/CurveModifier.js +10 -8
- package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
- package/examples/jsm/objects/GroundedSkybox.js +4 -4
- package/examples/jsm/objects/Sky.js +2 -2
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/objects/WaterMesh.js +4 -4
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/EffectComposer.js +1 -2
- package/examples/jsm/postprocessing/OutlinePass.js +4 -4
- package/examples/jsm/postprocessing/SAOPass.js +1 -2
- package/examples/jsm/postprocessing/SMAAPass.js +1 -3
- package/examples/jsm/postprocessing/SSAOPass.js +2 -4
- package/examples/jsm/postprocessing/SSRPass.js +2 -4
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
- package/examples/jsm/renderers/SVGRenderer.js +6 -4
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/GodRaysShader.js +3 -3
- package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
- package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
- package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
- package/examples/jsm/tsl/display/BleachBypass.js +10 -0
- package/examples/jsm/tsl/display/BloomNode.js +233 -26
- package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
- package/examples/jsm/tsl/display/FXAANode.js +52 -3
- package/examples/jsm/tsl/display/FilmNode.js +47 -1
- package/examples/jsm/tsl/display/GTAONode.js +210 -14
- package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
- package/examples/jsm/tsl/display/LensflareNode.js +131 -13
- package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
- package/examples/jsm/tsl/display/MotionBlur.js +12 -2
- package/examples/jsm/tsl/display/OutlineNode.js +343 -26
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
- package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
- package/examples/jsm/tsl/display/SMAANode.js +187 -46
- package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
- package/examples/jsm/tsl/display/SSRNode.js +194 -21
- package/examples/jsm/tsl/display/Sepia.js +9 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
- package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
- package/examples/jsm/tsl/display/TransitionNode.js +71 -6
- package/examples/jsm/tsl/display/hashBlur.js +14 -3
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +22 -19
- package/examples/jsm/utils/SceneUtils.js +2 -2
- package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -3
- package/src/Three.Core.js +2 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +9 -4
- package/src/Three.WebGPU.Nodes.js +2 -2
- package/src/Three.WebGPU.js +2 -2
- package/src/animation/PropertyBinding.js +2 -2
- package/src/cameras/PerspectiveCamera.js +18 -2
- package/src/constants.js +1 -1
- package/src/core/RenderTarget.js +18 -0
- package/src/core/RenderTarget3D.js +22 -0
- package/src/core/RenderTargetArray.js +22 -0
- package/src/extras/Earcut.js +1 -1
- package/src/extras/PMREMGenerator.js +20 -0
- package/src/extras/TextureUtils.js +6 -0
- package/src/helpers/CameraHelper.js +16 -13
- package/src/loaders/nodes/NodeLoader.js +59 -0
- package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
- package/src/loaders/nodes/NodeObjectLoader.js +61 -0
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
- package/src/materials/nodes/Line2NodeMaterial.js +128 -34
- package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
- package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
- package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
- package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
- package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
- package/src/materials/nodes/NodeMaterial.js +474 -21
- package/src/materials/nodes/PointsNodeMaterial.js +22 -13
- package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
- package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
- package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
- package/src/nodes/Nodes.js +1 -6
- package/src/nodes/TSL.js +2 -3
- package/src/nodes/accessors/AccessorsUtils.js +27 -0
- package/src/nodes/accessors/Arrays.js +24 -5
- package/src/nodes/accessors/BatchNode.js +39 -3
- package/src/nodes/accessors/Bitangent.js +37 -0
- package/src/nodes/accessors/BufferAttributeNode.js +178 -5
- package/src/nodes/accessors/BufferNode.js +63 -0
- package/src/nodes/accessors/BuiltinNode.js +38 -0
- package/src/nodes/accessors/Camera.js +49 -0
- package/src/nodes/accessors/ClippingNode.js +71 -2
- package/src/nodes/accessors/CubeTextureNode.js +64 -0
- package/src/nodes/accessors/InstanceNode.js +85 -2
- package/src/nodes/accessors/InstancedMeshNode.js +28 -3
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
- package/src/nodes/accessors/Lights.js +50 -1
- package/src/nodes/accessors/MaterialNode.js +302 -8
- package/src/nodes/accessors/MaterialProperties.js +7 -0
- package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
- package/src/nodes/accessors/ModelNode.js +100 -5
- package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
- package/src/nodes/accessors/MorphNode.js +48 -4
- package/src/nodes/accessors/Normal.js +59 -3
- package/src/nodes/accessors/Object3DNode.js +102 -1
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +53 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
- package/src/nodes/accessors/ReferenceNode.js +202 -2
- package/src/nodes/accessors/ReflectVector.js +24 -0
- package/src/nodes/accessors/RendererReferenceNode.js +46 -1
- package/src/nodes/accessors/SceneNode.js +54 -0
- package/src/nodes/accessors/SkinningNode.js +127 -1
- package/src/nodes/accessors/StorageBufferNode.js +168 -4
- package/src/nodes/accessors/StorageTextureNode.js +118 -0
- package/src/nodes/accessors/Tangent.js +36 -0
- package/src/nodes/accessors/Texture3DNode.js +89 -5
- package/src/nodes/accessors/TextureBicubic.js +12 -2
- package/src/nodes/accessors/TextureNode.js +309 -10
- package/src/nodes/accessors/TextureSizeNode.js +42 -0
- package/src/nodes/accessors/UV.js +10 -1
- package/src/nodes/accessors/UniformArrayNode.js +223 -23
- package/src/nodes/accessors/UserDataNode.js +46 -0
- package/src/nodes/accessors/VelocityNode.js +82 -0
- package/src/nodes/accessors/VertexColorNode.js +39 -2
- package/src/nodes/code/CodeNode.js +95 -1
- package/src/nodes/code/ExpressionNode.js +28 -0
- package/src/nodes/code/FunctionCallNode.js +37 -0
- package/src/nodes/code/FunctionNode.js +45 -0
- package/src/nodes/code/ScriptableNode.js +223 -1
- package/src/nodes/code/ScriptableValueNode.js +85 -1
- package/src/nodes/core/AssignNode.js +48 -2
- package/src/nodes/core/AttributeNode.js +43 -0
- package/src/nodes/core/BypassNode.js +47 -2
- package/src/nodes/core/CacheNode.js +53 -2
- package/src/nodes/core/ConstNode.js +24 -0
- package/src/nodes/core/ContextNode.js +65 -0
- package/src/nodes/core/IndexNode.js +68 -7
- package/src/nodes/core/InputNode.js +48 -0
- package/src/nodes/core/LightingModel.js +60 -0
- package/src/nodes/core/MRTNode.js +66 -0
- package/src/nodes/core/Node.js +337 -12
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +945 -15
- package/src/nodes/core/NodeCache.js +41 -2
- package/src/nodes/core/NodeCode.js +31 -0
- package/src/nodes/core/NodeFrame.js +123 -2
- package/src/nodes/core/NodeFunction.js +46 -0
- package/src/nodes/core/NodeFunctionInput.js +44 -0
- package/src/nodes/core/NodeParser.js +11 -0
- package/src/nodes/core/NodeUniform.js +52 -0
- package/src/nodes/core/NodeUtils.js +141 -0
- package/src/nodes/core/NodeVar.js +30 -0
- package/src/nodes/core/NodeVarying.js +28 -0
- package/src/nodes/core/OutputStructNode.js +33 -2
- package/src/nodes/core/ParameterNode.js +28 -0
- package/src/nodes/core/PropertyNode.js +232 -0
- package/src/nodes/core/StackNode.js +78 -0
- package/src/nodes/core/StructTypeNode.js +39 -1
- package/src/nodes/core/TempNode.js +30 -4
- package/src/nodes/core/UniformGroupNode.js +82 -7
- package/src/nodes/core/UniformNode.js +66 -0
- package/src/nodes/core/VarNode.js +52 -0
- package/src/nodes/core/VaryingNode.js +83 -2
- package/src/nodes/core/constants.js +36 -0
- package/src/nodes/display/BumpMapNode.js +37 -0
- package/src/nodes/display/ColorAdjustment.js +53 -11
- package/src/nodes/display/ColorSpaceFunctions.js +16 -0
- package/src/nodes/display/ColorSpaceNode.js +82 -0
- package/src/nodes/display/FrontFacingNode.js +29 -0
- package/src/nodes/display/NormalMapNode.js +43 -0
- package/src/nodes/display/PassNode.js +298 -7
- package/src/nodes/display/PosterizeNode.js +33 -0
- package/src/nodes/display/RenderOutputNode.js +66 -1
- package/src/nodes/display/ScreenNode.js +87 -0
- package/src/nodes/display/ToneMappingFunctions.js +58 -10
- package/src/nodes/display/ToneMappingNode.js +55 -2
- package/src/nodes/display/ToonOutlinePassNode.js +73 -0
- package/src/nodes/display/ViewportDepthNode.js +122 -8
- package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
- package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
- package/src/nodes/display/ViewportTextureNode.js +57 -0
- package/src/nodes/fog/Fog.js +93 -0
- package/src/nodes/functions/BasicLightingModel.js +24 -0
- package/src/nodes/functions/PhongLightingModel.js +34 -2
- package/src/nodes/functions/PhysicalLightingModel.js +167 -8
- package/src/nodes/functions/ShadowMaskModel.js +23 -0
- package/src/nodes/functions/ToonLightingModel.js +20 -0
- package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
- package/src/nodes/geometry/RangeNode.js +54 -2
- package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
- package/src/nodes/gpgpu/BarrierNode.js +47 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
- package/src/nodes/gpgpu/ComputeNode.js +106 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
- package/src/nodes/lighting/AONode.js +18 -0
- package/src/nodes/lighting/AmbientLightNode.js +10 -0
- package/src/nodes/lighting/AnalyticLightNode.js +97 -2
- package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
- package/src/nodes/lighting/BasicLightMapNode.js +17 -0
- package/src/nodes/lighting/DirectionalLightNode.js +10 -0
- package/src/nodes/lighting/EnvironmentNode.js +18 -0
- package/src/nodes/lighting/HemisphereLightNode.js +31 -0
- package/src/nodes/lighting/IESSpotLightNode.js +11 -0
- package/src/nodes/lighting/IrradianceNode.js +17 -0
- package/src/nodes/lighting/LightProbeNode.js +20 -0
- package/src/nodes/lighting/LightUtils.js +12 -0
- package/src/nodes/lighting/LightingContextNode.js +48 -0
- package/src/nodes/lighting/LightingNode.js +15 -6
- package/src/nodes/lighting/LightsNode.js +132 -1
- package/src/nodes/lighting/PointLightNode.js +32 -1
- package/src/nodes/lighting/PointShadowNode.js +54 -1
- package/src/nodes/lighting/RectAreaLightNode.js +44 -6
- package/src/nodes/lighting/ShadowBaseNode.js +93 -0
- package/src/nodes/lighting/ShadowNode.js +240 -34
- package/src/nodes/lighting/SpotLightNode.js +43 -0
- package/src/nodes/math/ConditionalNode.js +70 -3
- package/src/nodes/math/Hash.js +9 -0
- package/src/nodes/math/MathNode.js +614 -11
- package/src/nodes/math/MathUtils.js +45 -1
- package/src/nodes/math/OperatorNode.js +233 -0
- package/src/nodes/math/TriNoise3D.js +18 -7
- package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
- package/src/nodes/parsers/GLSLNodeParser.js +11 -0
- package/src/nodes/pmrem/PMREMNode.js +133 -0
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/procedural/Checker.js +9 -0
- package/src/nodes/tsl/TSLBase.js +2 -2
- package/src/nodes/utils/ArrayElementNode.js +38 -2
- package/src/nodes/utils/ConvertNode.js +31 -0
- package/src/nodes/utils/CubeMapNode.js +78 -0
- package/src/nodes/utils/Discard.js +16 -0
- package/src/nodes/utils/EquirectUVNode.js +31 -1
- package/src/nodes/utils/FlipNode.js +38 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
- package/src/nodes/utils/JoinNode.js +25 -0
- package/src/nodes/utils/LoopNode.js +74 -1
- package/src/nodes/utils/MatcapUVNode.js +17 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -0
- package/src/nodes/utils/Oscillators.js +33 -0
- package/src/nodes/utils/Packing.js +17 -0
- package/src/nodes/utils/PostProcessingUtils.js +28 -23
- package/src/nodes/utils/RTTNode.js +123 -2
- package/src/nodes/utils/ReflectorNode.js +174 -4
- package/src/nodes/utils/RemapNode.js +79 -0
- package/src/nodes/utils/RotateNode.js +41 -0
- package/src/nodes/utils/SetNode.js +44 -1
- package/src/nodes/utils/SplitNode.js +55 -3
- package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
- package/src/nodes/utils/SpriteUtils.js +17 -0
- package/src/nodes/utils/StorageArrayElementNode.js +40 -0
- package/src/nodes/utils/Timer.js +19 -0
- package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
- package/src/nodes/utils/UVUtils.js +20 -0
- package/src/nodes/utils/ViewportUtils.js +13 -0
- package/src/objects/BatchedMesh.js +1 -2
- package/src/objects/ClippingGroup.js +49 -0
- package/src/renderers/WebGLRenderer.js +23 -4
- package/src/renderers/common/Animation.js +63 -0
- package/src/renderers/common/Attributes.js +36 -0
- package/src/renderers/common/Backend.js +467 -52
- package/src/renderers/common/Background.js +34 -1
- package/src/renderers/common/BindGroup.js +43 -0
- package/src/renderers/common/Binding.js +35 -0
- package/src/renderers/common/Bindings.js +93 -1
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BufferUtils.js +27 -0
- package/src/renderers/common/BundleGroup.js +57 -0
- package/src/renderers/common/ChainMap.js +38 -1
- package/src/renderers/common/ClippingContext.js +107 -14
- package/src/renderers/common/Color4.js +36 -0
- package/src/renderers/common/ComputePipeline.js +24 -0
- package/src/renderers/common/CubeRenderTarget.js +13 -0
- package/src/renderers/common/DataMap.js +37 -1
- package/src/renderers/common/Geometries.js +98 -0
- package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
- package/src/renderers/common/Info.js +87 -0
- package/src/renderers/common/Lighting.js +26 -0
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +148 -5
- package/src/renderers/common/PostProcessing.js +75 -3
- package/src/renderers/common/ProgrammableStage.js +60 -2
- package/src/renderers/common/QuadMesh.js +54 -5
- package/src/renderers/common/RenderBundle.js +14 -8
- package/src/renderers/common/RenderBundles.js +33 -10
- package/src/renderers/common/RenderContext.js +169 -4
- package/src/renderers/common/RenderContexts.js +42 -2
- package/src/renderers/common/RenderList.js +178 -0
- package/src/renderers/common/RenderLists.js +31 -0
- package/src/renderers/common/RenderObject.js +328 -4
- package/src/renderers/common/RenderObjects.js +101 -7
- package/src/renderers/common/RenderPipeline.js +24 -0
- package/src/renderers/common/Renderer.js +1096 -31
- package/src/renderers/common/RendererUtils.js +193 -0
- package/src/renderers/common/SampledTexture.js +121 -0
- package/src/renderers/common/Sampler.js +30 -0
- package/src/renderers/common/StorageBuffer.js +24 -0
- package/src/renderers/common/StorageBufferAttribute.js +31 -2
- package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
- package/src/renderers/common/StorageTexture.js +38 -0
- package/src/renderers/common/Textures.js +83 -0
- package/src/renderers/common/Uniform.js +188 -2
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +139 -2
- package/src/renderers/common/extras/PMREMGenerator.js +24 -3
- package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
- package/src/renderers/common/nodes/NodeLibrary.js +89 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
- package/src/renderers/common/nodes/NodeSampler.js +28 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
- package/src/renderers/common/nodes/NodeUniform.js +189 -0
- package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
- package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
- package/src/renderers/common/nodes/Nodes.js +327 -60
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +480 -49
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
- package/src/renderers/webgpu/WebGPURenderer.js +35 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
- package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
- package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +7 -1
- package/src/textures/Data3DTexture.js +2 -2
- package/src/textures/Texture.js +4 -0
- package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
- package/examples/jsm/animation/MMDPhysics.js +0 -1408
- package/examples/jsm/exporters/MMDExporter.js +0 -223
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/MMDLoader.js +0 -2298
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/nodes/core/UniformGroup.js +0 -13
- package/src/nodes/fog/FogExp2Node.js +0 -35
- package/src/nodes/fog/FogNode.js +0 -50
- package/src/nodes/fog/FogRangeNode.js +0 -36
- package/src/renderers/common/PostProcessingUtils.js +0 -86
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial,
|
|
1
|
+
import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int } from 'three/tsl';
|
|
3
3
|
|
|
4
|
+
/** @module BloomNode **/
|
|
5
|
+
|
|
4
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
7
|
const _size = /*@__PURE__*/ new Vector2();
|
|
6
8
|
|
|
@@ -9,6 +11,38 @@ const _BlurDirectionY = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
|
|
|
9
11
|
|
|
10
12
|
let _rendererState;
|
|
11
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Post processing node for creating a bloom effect.
|
|
16
|
+
* ```js
|
|
17
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
18
|
+
*
|
|
19
|
+
* const scenePass = pass( scene, camera );
|
|
20
|
+
* const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
21
|
+
*
|
|
22
|
+
* const bloomPass = bloom( scenePassColor );
|
|
23
|
+
*
|
|
24
|
+
* postProcessing.outputNode = scenePassColor.add( bloomPass );
|
|
25
|
+
* ```
|
|
26
|
+
* By default, the node affects the entire image. For a selective bloom,
|
|
27
|
+
* use the `emissive` material property to control which objects should
|
|
28
|
+
* contribute to bloom or not. This can be achieved via MRT.
|
|
29
|
+
* ```js
|
|
30
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
31
|
+
*
|
|
32
|
+
* const scenePass = pass( scene, camera );
|
|
33
|
+
* scenePass.setMRT( mrt( {
|
|
34
|
+
* output,
|
|
35
|
+
* emissive
|
|
36
|
+
* } ) );
|
|
37
|
+
*
|
|
38
|
+
* const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
39
|
+
* const emissivePass = scenePass.getTextureNode( 'emissive' );
|
|
40
|
+
*
|
|
41
|
+
* const bloomPass = bloom( emissivePass );
|
|
42
|
+
* postProcessing.outputNode = scenePassColor.add( bloomPass );
|
|
43
|
+
* ```
|
|
44
|
+
* @augments TempNode
|
|
45
|
+
*/
|
|
12
46
|
class BloomNode extends TempNode {
|
|
13
47
|
|
|
14
48
|
static get type() {
|
|
@@ -17,29 +51,89 @@ class BloomNode extends TempNode {
|
|
|
17
51
|
|
|
18
52
|
}
|
|
19
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Constructs a new bloom node.
|
|
56
|
+
*
|
|
57
|
+
* @param {Node<vec4>} inputNode - The node that represents the input of the effect.
|
|
58
|
+
* @param {Number} [strength=1] - The strength of the bloom.
|
|
59
|
+
* @param {Number} [radius=0] - The radius of the bloom.
|
|
60
|
+
* @param {Number} [threshold=0] - The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
61
|
+
*/
|
|
20
62
|
constructor( inputNode, strength = 1, radius = 0, threshold = 0 ) {
|
|
21
63
|
|
|
22
64
|
super( 'vec4' );
|
|
23
65
|
|
|
66
|
+
/**
|
|
67
|
+
* The node that represents the input of the effect.
|
|
68
|
+
*
|
|
69
|
+
* @type {Node<vec4>}
|
|
70
|
+
*/
|
|
24
71
|
this.inputNode = inputNode;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The strength of the bloom.
|
|
75
|
+
*
|
|
76
|
+
* @type {UniformNode<float>}
|
|
77
|
+
*/
|
|
25
78
|
this.strength = uniform( strength );
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The radius of the bloom.
|
|
82
|
+
*
|
|
83
|
+
* @type {UniformNode<float>}
|
|
84
|
+
*/
|
|
26
85
|
this.radius = uniform( radius );
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
89
|
+
*
|
|
90
|
+
* @type {UniformNode<float>}
|
|
91
|
+
*/
|
|
27
92
|
this.threshold = uniform( threshold );
|
|
28
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Can be used to tweak the extracted luminance from the scene.
|
|
96
|
+
*
|
|
97
|
+
* @type {UniformNode<float>}
|
|
98
|
+
*/
|
|
29
99
|
this.smoothWidth = uniform( 0.01 );
|
|
30
100
|
|
|
31
|
-
|
|
32
|
-
|
|
101
|
+
/**
|
|
102
|
+
* An array that holds the render targets for the horizontal blur passes.
|
|
103
|
+
*
|
|
104
|
+
* @private
|
|
105
|
+
* @type {Array<RenderTarget>}
|
|
106
|
+
*/
|
|
33
107
|
this._renderTargetsHorizontal = [];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* An array that holds the render targets for the vertical blur passes.
|
|
111
|
+
*
|
|
112
|
+
* @private
|
|
113
|
+
* @type {Array<RenderTarget>}
|
|
114
|
+
*/
|
|
34
115
|
this._renderTargetsVertical = [];
|
|
35
|
-
this._nMips = 5;
|
|
36
116
|
|
|
37
|
-
|
|
117
|
+
/**
|
|
118
|
+
* The number if blur mips.
|
|
119
|
+
*
|
|
120
|
+
* @private
|
|
121
|
+
* @type {Number}
|
|
122
|
+
*/
|
|
123
|
+
this._nMips = 5;
|
|
38
124
|
|
|
125
|
+
/**
|
|
126
|
+
* The render target for the luminance pass.
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @type {RenderTarget}
|
|
130
|
+
*/
|
|
39
131
|
this._renderTargetBright = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
40
132
|
this._renderTargetBright.texture.name = 'UnrealBloomPass.bright';
|
|
41
133
|
this._renderTargetBright.texture.generateMipmaps = false;
|
|
42
134
|
|
|
135
|
+
//
|
|
136
|
+
|
|
43
137
|
for ( let i = 0; i < this._nMips; i ++ ) {
|
|
44
138
|
|
|
45
139
|
const renderTargetHorizontal = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
@@ -58,33 +152,114 @@ class BloomNode extends TempNode {
|
|
|
58
152
|
|
|
59
153
|
}
|
|
60
154
|
|
|
61
|
-
|
|
62
|
-
|
|
155
|
+
/**
|
|
156
|
+
* The material for the composite pass.
|
|
157
|
+
*
|
|
158
|
+
* @private
|
|
159
|
+
* @type {NodeMaterial?}
|
|
160
|
+
*/
|
|
63
161
|
this._compositeMaterial = null;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The material for the luminance pass.
|
|
165
|
+
*
|
|
166
|
+
* @private
|
|
167
|
+
* @type {NodeMaterial?}
|
|
168
|
+
*/
|
|
64
169
|
this._highPassFilterMaterial = null;
|
|
65
|
-
this._separableBlurMaterials = [];
|
|
66
170
|
|
|
67
|
-
|
|
171
|
+
/**
|
|
172
|
+
* The materials for the blur pass.
|
|
173
|
+
*
|
|
174
|
+
* @private
|
|
175
|
+
* @type {Array<NodeMaterial>}
|
|
176
|
+
*/
|
|
177
|
+
this._separableBlurMaterials = [];
|
|
68
178
|
|
|
179
|
+
/**
|
|
180
|
+
* The result of the luminance pass as a texture node for further processing.
|
|
181
|
+
*
|
|
182
|
+
* @private
|
|
183
|
+
* @type {TextureNode}
|
|
184
|
+
*/
|
|
69
185
|
this._textureNodeBright = texture( this._renderTargetBright.texture );
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The result of the first blur pass as a texture node for further processing.
|
|
189
|
+
*
|
|
190
|
+
* @private
|
|
191
|
+
* @type {TextureNode}
|
|
192
|
+
*/
|
|
70
193
|
this._textureNodeBlur0 = texture( this._renderTargetsVertical[ 0 ].texture );
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* The result of the second blur pass as a texture node for further processing.
|
|
197
|
+
*
|
|
198
|
+
* @private
|
|
199
|
+
* @type {TextureNode}
|
|
200
|
+
*/
|
|
71
201
|
this._textureNodeBlur1 = texture( this._renderTargetsVertical[ 1 ].texture );
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* The result of the third blur pass as a texture node for further processing.
|
|
205
|
+
*
|
|
206
|
+
* @private
|
|
207
|
+
* @type {TextureNode}
|
|
208
|
+
*/
|
|
72
209
|
this._textureNodeBlur2 = texture( this._renderTargetsVertical[ 2 ].texture );
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The result of the fourth blur pass as a texture node for further processing.
|
|
213
|
+
*
|
|
214
|
+
* @private
|
|
215
|
+
* @type {TextureNode}
|
|
216
|
+
*/
|
|
73
217
|
this._textureNodeBlur3 = texture( this._renderTargetsVertical[ 3 ].texture );
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* The result of the fifth blur pass as a texture node for further processing.
|
|
221
|
+
*
|
|
222
|
+
* @private
|
|
223
|
+
* @type {TextureNode}
|
|
224
|
+
*/
|
|
74
225
|
this._textureNodeBlur4 = texture( this._renderTargetsVertical[ 4 ].texture );
|
|
75
226
|
|
|
227
|
+
/**
|
|
228
|
+
* The result of the effect is represented as a separate texture node.
|
|
229
|
+
*
|
|
230
|
+
* @private
|
|
231
|
+
* @type {PassTextureNode}
|
|
232
|
+
*/
|
|
76
233
|
this._textureOutput = passTexture( this, this._renderTargetsHorizontal[ 0 ].texture );
|
|
77
234
|
|
|
235
|
+
/**
|
|
236
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
237
|
+
* its effect once per frame in `updateBefore()`.
|
|
238
|
+
*
|
|
239
|
+
* @type {String}
|
|
240
|
+
* @default 'frame'
|
|
241
|
+
*/
|
|
78
242
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
79
243
|
|
|
80
244
|
}
|
|
81
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Returns the result of the effect as a texture node.
|
|
248
|
+
*
|
|
249
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
250
|
+
*/
|
|
82
251
|
getTextureNode() {
|
|
83
252
|
|
|
84
253
|
return this._textureOutput;
|
|
85
254
|
|
|
86
255
|
}
|
|
87
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Sets the size of the effect.
|
|
259
|
+
*
|
|
260
|
+
* @param {Number} width - The width of the effect.
|
|
261
|
+
* @param {Number} height - The height of the effect.
|
|
262
|
+
*/
|
|
88
263
|
setSize( width, height ) {
|
|
89
264
|
|
|
90
265
|
let resx = Math.round( width / 2 );
|
|
@@ -106,24 +281,29 @@ class BloomNode extends TempNode {
|
|
|
106
281
|
|
|
107
282
|
}
|
|
108
283
|
|
|
284
|
+
/**
|
|
285
|
+
* This method is used to render the effect once per frame.
|
|
286
|
+
*
|
|
287
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
288
|
+
*/
|
|
109
289
|
updateBefore( frame ) {
|
|
110
290
|
|
|
111
291
|
const { renderer } = frame;
|
|
112
292
|
|
|
113
|
-
_rendererState =
|
|
293
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
114
294
|
|
|
115
295
|
//
|
|
116
296
|
|
|
117
297
|
const size = renderer.getDrawingBufferSize( _size );
|
|
118
298
|
this.setSize( size.width, size.height );
|
|
119
299
|
|
|
120
|
-
// 1. Extract
|
|
300
|
+
// 1. Extract bright areas
|
|
121
301
|
|
|
122
302
|
renderer.setRenderTarget( this._renderTargetBright );
|
|
123
303
|
_quadMesh.material = this._highPassFilterMaterial;
|
|
124
304
|
_quadMesh.render( renderer );
|
|
125
305
|
|
|
126
|
-
// 2. Blur
|
|
306
|
+
// 2. Blur all the mips progressively
|
|
127
307
|
|
|
128
308
|
let inputRenderTarget = this._renderTargetBright;
|
|
129
309
|
|
|
@@ -145,7 +325,7 @@ class BloomNode extends TempNode {
|
|
|
145
325
|
|
|
146
326
|
}
|
|
147
327
|
|
|
148
|
-
// 3. Composite
|
|
328
|
+
// 3. Composite all the mips
|
|
149
329
|
|
|
150
330
|
renderer.setRenderTarget( this._renderTargetsHorizontal[ 0 ] );
|
|
151
331
|
_quadMesh.material = this._compositeMaterial;
|
|
@@ -153,10 +333,16 @@ class BloomNode extends TempNode {
|
|
|
153
333
|
|
|
154
334
|
// restore
|
|
155
335
|
|
|
156
|
-
|
|
336
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
157
337
|
|
|
158
338
|
}
|
|
159
339
|
|
|
340
|
+
/**
|
|
341
|
+
* This method is used to setup the effect's TSL code.
|
|
342
|
+
*
|
|
343
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
344
|
+
* @return {PassTextureNode}
|
|
345
|
+
*/
|
|
160
346
|
setup( builder ) {
|
|
161
347
|
|
|
162
348
|
// luminosity high pass material
|
|
@@ -183,7 +369,7 @@ class BloomNode extends TempNode {
|
|
|
183
369
|
|
|
184
370
|
for ( let i = 0; i < this._nMips; i ++ ) {
|
|
185
371
|
|
|
186
|
-
this._separableBlurMaterials.push( this.
|
|
372
|
+
this._separableBlurMaterials.push( this._getSeparableBlurMaterial( builder, kernelSizeArray[ i ] ) );
|
|
187
373
|
|
|
188
374
|
}
|
|
189
375
|
|
|
@@ -232,6 +418,10 @@ class BloomNode extends TempNode {
|
|
|
232
418
|
|
|
233
419
|
}
|
|
234
420
|
|
|
421
|
+
/**
|
|
422
|
+
* Frees internal resources. This method should be called
|
|
423
|
+
* when the effect is no longer required.
|
|
424
|
+
*/
|
|
235
425
|
dispose() {
|
|
236
426
|
|
|
237
427
|
for ( let i = 0; i < this._renderTargetsHorizontal.length; i ++ ) {
|
|
@@ -250,7 +440,14 @@ class BloomNode extends TempNode {
|
|
|
250
440
|
|
|
251
441
|
}
|
|
252
442
|
|
|
253
|
-
|
|
443
|
+
/**
|
|
444
|
+
* Create a separable blur material for the given kernel radius.
|
|
445
|
+
*
|
|
446
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
447
|
+
* @param {Number} kernelRadius - The kernel radius.
|
|
448
|
+
* @return {NodeMaterial}
|
|
449
|
+
*/
|
|
450
|
+
_getSeparableBlurMaterial( builder, kernelRadius ) {
|
|
254
451
|
|
|
255
452
|
const coefficients = [];
|
|
256
453
|
|
|
@@ -268,9 +465,9 @@ class BloomNode extends TempNode {
|
|
|
268
465
|
const direction = uniform( new Vector2( 0.5, 0.5 ) );
|
|
269
466
|
|
|
270
467
|
const uvNode = uv();
|
|
271
|
-
const sampleTexel = ( uv ) => colorTexture.
|
|
468
|
+
const sampleTexel = ( uv ) => colorTexture.sample( uv );
|
|
272
469
|
|
|
273
|
-
const
|
|
470
|
+
const separableBlurPass = Fn( () => {
|
|
274
471
|
|
|
275
472
|
const weightSum = gaussianCoefficients.element( 0 ).toVar();
|
|
276
473
|
const diffuseSum = sampleTexel( uvNode ).rgb.mul( weightSum ).toVar();
|
|
@@ -291,22 +488,32 @@ class BloomNode extends TempNode {
|
|
|
291
488
|
|
|
292
489
|
} );
|
|
293
490
|
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
491
|
+
const separableBlurMaterial = new NodeMaterial();
|
|
492
|
+
separableBlurMaterial.fragmentNode = separableBlurPass().context( builder.getSharedContext() );
|
|
493
|
+
separableBlurMaterial.name = 'Bloom_separable';
|
|
494
|
+
separableBlurMaterial.needsUpdate = true;
|
|
298
495
|
|
|
299
496
|
// uniforms
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
497
|
+
separableBlurMaterial.colorTexture = colorTexture;
|
|
498
|
+
separableBlurMaterial.direction = direction;
|
|
499
|
+
separableBlurMaterial.invSize = invSize;
|
|
303
500
|
|
|
304
|
-
return
|
|
501
|
+
return separableBlurMaterial;
|
|
305
502
|
|
|
306
503
|
}
|
|
307
504
|
|
|
308
505
|
}
|
|
309
506
|
|
|
507
|
+
/**
|
|
508
|
+
* TSL function for creating a bloom effect.
|
|
509
|
+
*
|
|
510
|
+
* @function
|
|
511
|
+
* @param {Node<vec4>} node - The node that represents the input of the effect.
|
|
512
|
+
* @param {Number} [strength=1] - The strength of the bloom.
|
|
513
|
+
* @param {Number} [radius=0] - The radius of the bloom.
|
|
514
|
+
* @param {Number} [threshold=0] - The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
515
|
+
* @returns {BloomNode}
|
|
516
|
+
*/
|
|
310
517
|
export const bloom = ( node, strength, radius, threshold ) => nodeObject( new BloomNode( nodeObject( node ), strength, radius, threshold ) );
|
|
311
518
|
|
|
312
519
|
export default BloomNode;
|
|
@@ -2,6 +2,18 @@ import { DataTexture, RepeatWrapping, Vector2, Vector3, TempNode } from 'three/w
|
|
|
2
2
|
import { texture, getNormalFromDepth, getViewPosition, convertToTexture, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, luminance, vec2, vec3, vec4, uniformArray, int, dot, max, pow, abs, If, textureSize, sin, cos, mat2, PI } from 'three/tsl';
|
|
3
3
|
import { SimplexNoise } from '../../math/SimplexNoise.js';
|
|
4
4
|
|
|
5
|
+
/** @module DenoiseNode **/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Post processing node for denoising data like raw screen-space ambient occlusion output.
|
|
9
|
+
* Denoise can noticeably improve the quality of ambient occlusion but also add quite some
|
|
10
|
+
* overhead to the post processing setup. It's best to make its usage optional (e.g. via
|
|
11
|
+
* graphic settings).
|
|
12
|
+
*
|
|
13
|
+
* Reference: {@link https://openaccess.thecvf.com/content/WACV2021/papers/Khademi_Self-Supervised_Poisson-Gaussian_Denoising_WACV_2021_paper.pdf}.
|
|
14
|
+
*
|
|
15
|
+
* @augments TempNode
|
|
16
|
+
*/
|
|
5
17
|
class DenoiseNode extends TempNode {
|
|
6
18
|
|
|
7
19
|
static get type() {
|
|
@@ -10,32 +22,123 @@ class DenoiseNode extends TempNode {
|
|
|
10
22
|
|
|
11
23
|
}
|
|
12
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Constructs a new denoise node.
|
|
27
|
+
*
|
|
28
|
+
* @param {TextureNode} textureNode - The texture node that represents the input of the effect (e.g. AO).
|
|
29
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
30
|
+
* @param {Node<vec3>?} normalNode - A node that represents the scene's normals.
|
|
31
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
32
|
+
*/
|
|
13
33
|
constructor( textureNode, depthNode, normalNode, camera ) {
|
|
14
34
|
|
|
15
35
|
super( 'vec4' );
|
|
16
36
|
|
|
37
|
+
/**
|
|
38
|
+
* The texture node that represents the input of the effect (e.g. AO).
|
|
39
|
+
*
|
|
40
|
+
* @type {TextureNode}
|
|
41
|
+
*/
|
|
17
42
|
this.textureNode = textureNode;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A node that represents the scene's depth.
|
|
46
|
+
*
|
|
47
|
+
* @type {Node<float>}
|
|
48
|
+
*/
|
|
18
49
|
this.depthNode = depthNode;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A node that represents the scene's normals. If no normals are passed to the
|
|
53
|
+
* constructor (because MRT is not available), normals can be automatically
|
|
54
|
+
* reconstructed from depth values in the shader.
|
|
55
|
+
*
|
|
56
|
+
* @type {Node<vec3>?}
|
|
57
|
+
*/
|
|
19
58
|
this.normalNode = normalNode;
|
|
20
59
|
|
|
60
|
+
/**
|
|
61
|
+
* The node represents the internal noise texture.
|
|
62
|
+
*
|
|
63
|
+
* @type {TextureNode}
|
|
64
|
+
*/
|
|
21
65
|
this.noiseNode = texture( generateDefaultNoise() );
|
|
22
66
|
|
|
67
|
+
/**
|
|
68
|
+
* The luma Phi value.
|
|
69
|
+
*
|
|
70
|
+
* @type {UniformNode<float>}
|
|
71
|
+
*/
|
|
23
72
|
this.lumaPhi = uniform( 5 );
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The depth Phi value.
|
|
76
|
+
*
|
|
77
|
+
* @type {UniformNode<float>}
|
|
78
|
+
*/
|
|
24
79
|
this.depthPhi = uniform( 5 );
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The normal Phi value.
|
|
83
|
+
*
|
|
84
|
+
* @type {UniformNode<float>}
|
|
85
|
+
*/
|
|
25
86
|
this.normalPhi = uniform( 5 );
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The radius.
|
|
90
|
+
*
|
|
91
|
+
* @type {UniformNode<float>}
|
|
92
|
+
*/
|
|
26
93
|
this.radius = uniform( 5 );
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The index.
|
|
97
|
+
*
|
|
98
|
+
* @type {UniformNode<float>}
|
|
99
|
+
*/
|
|
27
100
|
this.index = uniform( 0 );
|
|
28
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node updates
|
|
104
|
+
* its internal uniforms once per frame in `updateBefore()`.
|
|
105
|
+
*
|
|
106
|
+
* @type {String}
|
|
107
|
+
* @default 'frame'
|
|
108
|
+
*/
|
|
29
109
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
30
110
|
|
|
31
|
-
|
|
32
|
-
|
|
111
|
+
/**
|
|
112
|
+
* The resolution of the effect.
|
|
113
|
+
*
|
|
114
|
+
* @private
|
|
115
|
+
* @type {UniformNode<vec2>}
|
|
116
|
+
*/
|
|
33
117
|
this._resolution = uniform( new Vector2() );
|
|
34
|
-
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* An array of sample vectors.
|
|
121
|
+
*
|
|
122
|
+
* @private
|
|
123
|
+
* @type {UniformArrayNode<vec3>}
|
|
124
|
+
*/
|
|
125
|
+
this._sampleVectors = uniformArray( generateDenoiseSamples( 16, 2, 1 ) );
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
129
|
+
*
|
|
130
|
+
* @private
|
|
131
|
+
* @type {UniformNode<mat4>}
|
|
132
|
+
*/
|
|
35
133
|
this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
|
|
36
134
|
|
|
37
135
|
}
|
|
38
136
|
|
|
137
|
+
/**
|
|
138
|
+
* This method is used to update internal uniforms once per frame.
|
|
139
|
+
*
|
|
140
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
141
|
+
*/
|
|
39
142
|
updateBefore() {
|
|
40
143
|
|
|
41
144
|
const map = this.textureNode.value;
|
|
@@ -44,14 +147,20 @@ class DenoiseNode extends TempNode {
|
|
|
44
147
|
|
|
45
148
|
}
|
|
46
149
|
|
|
47
|
-
|
|
150
|
+
/**
|
|
151
|
+
* This method is used to setup the effect's TSL code.
|
|
152
|
+
*
|
|
153
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
154
|
+
* @return {ShaderCallNodeInternal}
|
|
155
|
+
*/
|
|
156
|
+
setup( /* builder */ ) {
|
|
48
157
|
|
|
49
158
|
const uvNode = uv();
|
|
50
159
|
|
|
51
|
-
const sampleTexture = ( uv ) => this.textureNode.
|
|
52
|
-
const sampleDepth = ( uv ) => this.depthNode.
|
|
53
|
-
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.
|
|
54
|
-
const sampleNoise = ( uv ) => this.noiseNode.
|
|
160
|
+
const sampleTexture = ( uv ) => this.textureNode.sample( uv );
|
|
161
|
+
const sampleDepth = ( uv ) => this.depthNode.sample( uv ).x;
|
|
162
|
+
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.sample( uv ).rgb.normalize() : getNormalFromDepth( uv, this.depthNode.value, this._cameraProjectionMatrixInverse );
|
|
163
|
+
const sampleNoise = ( uv ) => this.noiseNode.sample( uv );
|
|
55
164
|
|
|
56
165
|
const denoiseSample = Fn( ( [ center, viewNormal, viewPosition, sampleUv ] ) => {
|
|
57
166
|
|
|
@@ -149,23 +258,14 @@ class DenoiseNode extends TempNode {
|
|
|
149
258
|
|
|
150
259
|
export default DenoiseNode;
|
|
151
260
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const sample = poissonDisk[ i ];
|
|
161
|
-
array.push( sample );
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return array;
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
261
|
+
/**
|
|
262
|
+
* Generates denoise samples based on the given parameters.
|
|
263
|
+
*
|
|
264
|
+
* @param {Number} numSamples - The number of samples.
|
|
265
|
+
* @param {Number} numRings - The number of rings.
|
|
266
|
+
* @param {Number} radiusExponent - The radius exponent.
|
|
267
|
+
* @return {Array<Vector3>} The denoise samples.
|
|
268
|
+
*/
|
|
169
269
|
function generateDenoiseSamples( numSamples, numRings, radiusExponent ) {
|
|
170
270
|
|
|
171
271
|
const samples = [];
|
|
@@ -182,6 +282,12 @@ function generateDenoiseSamples( numSamples, numRings, radiusExponent ) {
|
|
|
182
282
|
|
|
183
283
|
}
|
|
184
284
|
|
|
285
|
+
/**
|
|
286
|
+
* Generates a default noise texture for the given size.
|
|
287
|
+
*
|
|
288
|
+
* @param {Number} [size=64] - The texture size.
|
|
289
|
+
* @return {DataTexture} The generated noise texture.
|
|
290
|
+
*/
|
|
185
291
|
function generateDefaultNoise( size = 64 ) {
|
|
186
292
|
|
|
187
293
|
const simplex = new SimplexNoise();
|
|
@@ -214,4 +320,14 @@ function generateDefaultNoise( size = 64 ) {
|
|
|
214
320
|
|
|
215
321
|
}
|
|
216
322
|
|
|
323
|
+
/**
|
|
324
|
+
* TSL function for creating a denoise effect.
|
|
325
|
+
*
|
|
326
|
+
* @function
|
|
327
|
+
* @param {Node} node - The node that represents the input of the effect (e.g. AO).
|
|
328
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
329
|
+
* @param {Node<vec3>?} normalNode - A node that represents the scene's normals.
|
|
330
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
331
|
+
* @returns {DenoiseNode}
|
|
332
|
+
*/
|
|
217
333
|
export const denoise = ( node, depthNode, normalNode, camera ) => nodeObject( new DenoiseNode( convertToTexture( node ), nodeObject( depthNode ), nodeObject( normalNode ), camera ) );
|