@gnsx/three 0.185.15 → 0.186.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/build/three.cjs +10 -82600
- package/build/three.core.js +1303 -728
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -42,6 +42,31 @@ export default /* glsl */`
|
|
|
42
42
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
#ifdef USE_RETROREFLECTION
|
|
46
|
+
|
|
47
|
+
vec3 getIBLRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {
|
|
48
|
+
|
|
49
|
+
#ifdef ENVMAP_TYPE_CUBE_UV
|
|
50
|
+
|
|
51
|
+
// The retroreflective lobe returns light toward its source, so the environment is sampled along the view direction
|
|
52
|
+
vec3 retroVec = normalize( mix( viewDir, normal, pow4( roughness ) ) );
|
|
53
|
+
|
|
54
|
+
retroVec = transformDirectionByInverseViewMatrix( retroVec, viewMatrix );
|
|
55
|
+
|
|
56
|
+
vec4 envMapColor = textureCubeUV( envMap, envMapRotation * retroVec, roughness );
|
|
57
|
+
|
|
58
|
+
return envMapColor.rgb * envMapIntensity;
|
|
59
|
+
|
|
60
|
+
#else
|
|
61
|
+
|
|
62
|
+
return vec3( 0.0 );
|
|
63
|
+
|
|
64
|
+
#endif
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#endif
|
|
69
|
+
|
|
45
70
|
#ifdef USE_ANISOTROPY
|
|
46
71
|
|
|
47
72
|
vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
|
|
@@ -63,6 +88,29 @@ export default /* glsl */`
|
|
|
63
88
|
|
|
64
89
|
}
|
|
65
90
|
|
|
91
|
+
#ifdef USE_RETROREFLECTION
|
|
92
|
+
|
|
93
|
+
vec3 getIBLAnisotropyRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
|
|
94
|
+
|
|
95
|
+
#ifdef ENVMAP_TYPE_CUBE_UV
|
|
96
|
+
|
|
97
|
+
// https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/anisotropy
|
|
98
|
+
vec3 bentNormal = cross( bitangent, viewDir );
|
|
99
|
+
bentNormal = normalize( cross( bentNormal, bitangent ) );
|
|
100
|
+
bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );
|
|
101
|
+
|
|
102
|
+
return getIBLRetroRadiance( viewDir, bentNormal, roughness );
|
|
103
|
+
|
|
104
|
+
#else
|
|
105
|
+
|
|
106
|
+
return vec3( 0.0 );
|
|
107
|
+
|
|
108
|
+
#endif
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
#endif
|
|
113
|
+
|
|
66
114
|
#endif
|
|
67
115
|
|
|
68
116
|
#endif
|
|
@@ -41,18 +41,41 @@ vec3 geometryClearcoatNormal = vec3( 0.0 );
|
|
|
41
41
|
|
|
42
42
|
if ( material.iridescence > 0.0 ) {
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
vec3 iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );
|
|
45
|
+
vec3 iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );
|
|
46
46
|
|
|
47
|
-
material.iridescenceFresnel = mix(
|
|
47
|
+
material.iridescenceFresnel = mix( iridescenceFresnelDielectric, iridescenceFresnelMetallic, material.metalness );
|
|
48
48
|
|
|
49
49
|
// Iridescence F0 approximation
|
|
50
|
-
material.
|
|
50
|
+
material.iridescenceF0Dielectric = Schlick_to_F0( iridescenceFresnelDielectric, 1.0, dotNVi );
|
|
51
|
+
material.iridescenceF0Metallic = Schlick_to_F0( iridescenceFresnelMetallic, 1.0, dotNVi );
|
|
51
52
|
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
#endif
|
|
55
56
|
|
|
57
|
+
#ifdef STANDARD
|
|
58
|
+
|
|
59
|
+
float dotNVms = saturate( dot( geometryNormal, geometryViewDir ) );
|
|
60
|
+
|
|
61
|
+
material.dfg = texture2D( dfgLUT, vec2( material.roughness, dotNVms ) ).rg;
|
|
62
|
+
|
|
63
|
+
#if ( NUM_SUN_LIGHTS > 0 || NUM_DIR_LIGHTS > 0 || NUM_POINT_LIGHTS > 0 || NUM_SPOT_LIGHTS > 0 )
|
|
64
|
+
|
|
65
|
+
// Multi-scattering energy compensation for direct lighting
|
|
66
|
+
// Based on "Practical Multiple Scattering Compensation for Microfacet Models"
|
|
67
|
+
// https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
|
|
68
|
+
|
|
69
|
+
// Energy of the single-scattering lobe in a white furnace ( F0 = F90 = 1 )
|
|
70
|
+
float EssMs = material.dfg.x + material.dfg.y;
|
|
71
|
+
|
|
72
|
+
// Compensate for the energy lost to multiple scattering, tinting the added term by F0 ( equation 16 )
|
|
73
|
+
material.multiScatteringCompensation = 1.0 + material.specularColorBlended * ( 1.0 / EssMs - 1.0 );
|
|
74
|
+
|
|
75
|
+
#endif
|
|
76
|
+
|
|
77
|
+
#endif
|
|
78
|
+
|
|
56
79
|
IncidentLight directLight;
|
|
57
80
|
|
|
58
81
|
#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )
|
|
@@ -129,6 +152,32 @@ IncidentLight directLight;
|
|
|
129
152
|
|
|
130
153
|
#endif
|
|
131
154
|
|
|
155
|
+
#if ( NUM_SUN_LIGHTS > 0 ) && defined( RE_Direct )
|
|
156
|
+
|
|
157
|
+
SunLight sunLight;
|
|
158
|
+
#if defined( USE_SHADOWMAP ) && NUM_SUN_LIGHT_SHADOWS > 0
|
|
159
|
+
SunLightShadow sunLightShadow;
|
|
160
|
+
#endif
|
|
161
|
+
|
|
162
|
+
#pragma unroll_loop_start
|
|
163
|
+
for ( int i = 0; i < NUM_SUN_LIGHTS; i ++ ) {
|
|
164
|
+
|
|
165
|
+
sunLight = sunLights[ i ];
|
|
166
|
+
|
|
167
|
+
getSunLightInfo( sunLight, directLight );
|
|
168
|
+
|
|
169
|
+
#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SUN_LIGHT_SHADOWS )
|
|
170
|
+
sunLightShadow = sunLightShadows[ i ];
|
|
171
|
+
directLight.color *= ( directLight.visible && receiveShadow ) ? getSunShadow( sunShadowMap[ i ], sunLightShadow, UNROLLED_LOOP_INDEX ) : 1.0;
|
|
172
|
+
#endif
|
|
173
|
+
|
|
174
|
+
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
#pragma unroll_loop_end
|
|
178
|
+
|
|
179
|
+
#endif
|
|
180
|
+
|
|
132
181
|
#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )
|
|
133
182
|
|
|
134
183
|
DirectionalLight directionalLight;
|
|
@@ -26,14 +26,32 @@ export default /* glsl */`
|
|
|
26
26
|
|
|
27
27
|
#ifdef USE_ANISOTROPY
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
vec3 iblRadiance = getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );
|
|
30
30
|
|
|
31
31
|
#else
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
vec3 iblRadiance = getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );
|
|
34
34
|
|
|
35
35
|
#endif
|
|
36
36
|
|
|
37
|
+
#ifdef USE_RETROREFLECTION
|
|
38
|
+
|
|
39
|
+
#ifdef USE_ANISOTROPY
|
|
40
|
+
|
|
41
|
+
vec3 retroIBLRadiance = getIBLAnisotropyRetroRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );
|
|
42
|
+
|
|
43
|
+
#else
|
|
44
|
+
|
|
45
|
+
vec3 retroIBLRadiance = getIBLRetroRadiance( geometryViewDir, geometryNormal, material.roughness );
|
|
46
|
+
|
|
47
|
+
#endif
|
|
48
|
+
|
|
49
|
+
iblRadiance = mix( iblRadiance, retroIBLRadiance, saturate( material.retroreflectivity ) );
|
|
50
|
+
|
|
51
|
+
#endif
|
|
52
|
+
|
|
53
|
+
radiance += iblRadiance;
|
|
54
|
+
|
|
37
55
|
#ifdef USE_CLEARCOAT
|
|
38
56
|
|
|
39
57
|
clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );
|
|
@@ -76,6 +76,26 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi
|
|
|
76
76
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
#if NUM_SUN_LIGHTS > 0
|
|
80
|
+
|
|
81
|
+
struct SunLight {
|
|
82
|
+
vec3 direction;
|
|
83
|
+
vec3 color;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
uniform SunLight sunLights[ NUM_SUN_LIGHTS ];
|
|
87
|
+
|
|
88
|
+
void getSunLightInfo( const in SunLight sunLight, out IncidentLight light ) {
|
|
89
|
+
|
|
90
|
+
light.color = sunLight.color;
|
|
91
|
+
light.direction = sunLight.direction;
|
|
92
|
+
light.visible = true;
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
|
|
79
99
|
#if NUM_DIR_LIGHTS > 0
|
|
80
100
|
|
|
81
101
|
struct DirectionalLight {
|
|
@@ -13,6 +13,12 @@ struct PhysicalMaterial {
|
|
|
13
13
|
float metalness;
|
|
14
14
|
float specularF90;
|
|
15
15
|
float dispersion;
|
|
16
|
+
vec2 dfg;
|
|
17
|
+
vec3 multiScatteringCompensation;
|
|
18
|
+
|
|
19
|
+
#ifdef USE_RETROREFLECTION
|
|
20
|
+
float retroreflectivity;
|
|
21
|
+
#endif
|
|
16
22
|
|
|
17
23
|
#ifdef USE_CLEARCOAT
|
|
18
24
|
float clearcoat;
|
|
@@ -26,9 +32,8 @@ struct PhysicalMaterial {
|
|
|
26
32
|
float iridescenceIOR;
|
|
27
33
|
float iridescenceThickness;
|
|
28
34
|
vec3 iridescenceFresnel;
|
|
29
|
-
vec3
|
|
30
|
-
vec3
|
|
31
|
-
vec3 iridescenceFresnelMetallic;
|
|
35
|
+
vec3 iridescenceF0Dielectric;
|
|
36
|
+
vec3 iridescenceF0Metallic;
|
|
32
37
|
#endif
|
|
33
38
|
|
|
34
39
|
#ifdef USE_SHEEN
|
|
@@ -387,14 +392,11 @@ vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3
|
|
|
387
392
|
// Approximates multiscattering in order to preserve energy.
|
|
388
393
|
// http://www.jcgt.org/published/0008/01/03/
|
|
389
394
|
#ifdef USE_IRIDESCENCE
|
|
390
|
-
void computeMultiscatteringIridescence( const in
|
|
395
|
+
void computeMultiscatteringIridescence( const in vec2 fab, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, inout vec3 singleScatter, inout vec3 multiScatter ) {
|
|
391
396
|
#else
|
|
392
|
-
void computeMultiscattering( const in
|
|
397
|
+
void computeMultiscattering( const in vec2 fab, const in vec3 specularColor, const in float specularF90, inout vec3 singleScatter, inout vec3 multiScatter ) {
|
|
393
398
|
#endif
|
|
394
399
|
|
|
395
|
-
float dotNV = saturate( dot( normal, viewDir ) );
|
|
396
|
-
vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;
|
|
397
|
-
|
|
398
400
|
#ifdef USE_IRIDESCENCE
|
|
399
401
|
|
|
400
402
|
vec3 Fr = mix( specularColor, iridescenceF0, iridescence );
|
|
@@ -418,48 +420,6 @@ void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const
|
|
|
418
420
|
|
|
419
421
|
}
|
|
420
422
|
|
|
421
|
-
// GGX BRDF with multi-scattering energy compensation for direct lighting
|
|
422
|
-
// Based on "Practical Multiple Scattering Compensation for Microfacet Models"
|
|
423
|
-
// https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
|
|
424
|
-
vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {
|
|
425
|
-
|
|
426
|
-
// Single-scattering BRDF (standard GGX)
|
|
427
|
-
vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );
|
|
428
|
-
|
|
429
|
-
// Multi-scattering compensation
|
|
430
|
-
float dotNL = saturate( dot( normal, lightDir ) );
|
|
431
|
-
float dotNV = saturate( dot( normal, viewDir ) );
|
|
432
|
-
|
|
433
|
-
// Precomputed DFG values for view and light directions
|
|
434
|
-
vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;
|
|
435
|
-
vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;
|
|
436
|
-
|
|
437
|
-
// Single-scattering energy for view and light
|
|
438
|
-
vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;
|
|
439
|
-
vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;
|
|
440
|
-
|
|
441
|
-
float Ess_V = dfgV.x + dfgV.y;
|
|
442
|
-
float Ess_L = dfgL.x + dfgL.y;
|
|
443
|
-
|
|
444
|
-
// Energy lost to multiple scattering
|
|
445
|
-
float Ems_V = 1.0 - Ess_V;
|
|
446
|
-
float Ems_L = 1.0 - Ess_L;
|
|
447
|
-
|
|
448
|
-
// Average Fresnel reflectance
|
|
449
|
-
vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619; // 1/21
|
|
450
|
-
|
|
451
|
-
// Multiple scattering contribution
|
|
452
|
-
vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );
|
|
453
|
-
|
|
454
|
-
// Energy compensation factor
|
|
455
|
-
float compensationFactor = Ems_V * Ems_L;
|
|
456
|
-
|
|
457
|
-
vec3 multiScatter = Fms * compensationFactor;
|
|
458
|
-
|
|
459
|
-
return singleScatter + multiScatter;
|
|
460
|
-
|
|
461
|
-
}
|
|
462
|
-
|
|
463
423
|
#if NUM_RECT_AREA_LIGHTS > 0
|
|
464
424
|
|
|
465
425
|
void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
|
|
@@ -553,19 +513,63 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
|
|
|
553
513
|
|
|
554
514
|
#endif
|
|
555
515
|
|
|
556
|
-
|
|
516
|
+
vec3 specularBRDF = BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );
|
|
517
|
+
|
|
518
|
+
#ifdef USE_RETROREFLECTION
|
|
557
519
|
|
|
558
|
-
|
|
520
|
+
// Minimal Retroreflective Microfacet Model:
|
|
521
|
+
// https://jcgt.org/published/0015/01/04/
|
|
522
|
+
vec3 retroViewDir = reflect( - geometryViewDir, geometryNormal );
|
|
523
|
+
vec3 retroSpecularBRDF = BRDF_GGX( directLight.direction, retroViewDir, geometryNormal, material );
|
|
524
|
+
|
|
525
|
+
specularBRDF = mix( specularBRDF, retroSpecularBRDF, saturate( material.retroreflectivity ) );
|
|
526
|
+
|
|
527
|
+
#endif
|
|
528
|
+
|
|
529
|
+
reflectedLight.directSpecular += irradiance * specularBRDF * material.multiScatteringCompensation;
|
|
530
|
+
|
|
531
|
+
// Light reflected by the specular interface is not available to the diffuse layer ( glTF fresnel_mix )
|
|
532
|
+
vec3 halfDir = normalize( directLight.direction + geometryViewDir );
|
|
533
|
+
float dotVH = saturate( dot( geometryViewDir, halfDir ) );
|
|
534
|
+
vec3 F = F_Schlick( material.specularColor, material.specularF90, dotVH );
|
|
535
|
+
|
|
536
|
+
#ifdef USE_RETROREFLECTION
|
|
537
|
+
|
|
538
|
+
vec3 retroHalfDir = normalize( directLight.direction + retroViewDir );
|
|
539
|
+
float dotRetroVH = saturate( dot( retroViewDir, retroHalfDir ) );
|
|
540
|
+
vec3 retroF = F_Schlick( material.specularColor, material.specularF90, dotRetroVH );
|
|
541
|
+
|
|
542
|
+
F = mix( F, retroF, saturate( material.retroreflectivity ) );
|
|
543
|
+
|
|
544
|
+
#endif
|
|
545
|
+
|
|
546
|
+
reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution ) * ( 1.0 - F );
|
|
559
547
|
}
|
|
560
548
|
|
|
561
549
|
void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
|
|
562
550
|
|
|
563
|
-
|
|
551
|
+
// Energy reflected by the specular lobe is not available to the diffuse layer
|
|
552
|
+
vec3 singleScattering = vec3( 0.0 );
|
|
553
|
+
vec3 multiScattering = vec3( 0.0 );
|
|
554
|
+
|
|
555
|
+
#ifdef USE_IRIDESCENCE
|
|
556
|
+
|
|
557
|
+
computeMultiscatteringIridescence( material.dfg, material.specularColor, material.specularF90, material.iridescence, material.iridescenceF0Dielectric, singleScattering, multiScattering );
|
|
558
|
+
|
|
559
|
+
#else
|
|
560
|
+
|
|
561
|
+
computeMultiscattering( material.dfg, material.specularColor, material.specularF90, singleScattering, multiScattering );
|
|
562
|
+
|
|
563
|
+
#endif
|
|
564
|
+
|
|
565
|
+
vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution ) * ( 1.0 - singleScattering - multiScattering );
|
|
564
566
|
|
|
565
567
|
#ifdef USE_SHEEN
|
|
566
568
|
|
|
567
569
|
float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
|
|
568
570
|
|
|
571
|
+
sheenSpecularIndirect += irradiance * material.sheenColor * sheenAlbedo * RECIPROCAL_PI;
|
|
572
|
+
|
|
569
573
|
float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;
|
|
570
574
|
|
|
571
575
|
diffuse *= sheenEnergyComp;
|
|
@@ -601,13 +605,13 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
|
|
|
601
605
|
|
|
602
606
|
#ifdef USE_IRIDESCENCE
|
|
603
607
|
|
|
604
|
-
computeMultiscatteringIridescence(
|
|
605
|
-
computeMultiscatteringIridescence(
|
|
608
|
+
computeMultiscatteringIridescence( material.dfg, material.specularColor, material.specularF90, material.iridescence, material.iridescenceF0Dielectric, singleScatteringDielectric, multiScatteringDielectric );
|
|
609
|
+
computeMultiscatteringIridescence( material.dfg, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceF0Metallic, singleScatteringMetallic, multiScatteringMetallic );
|
|
606
610
|
|
|
607
611
|
#else
|
|
608
612
|
|
|
609
|
-
computeMultiscattering(
|
|
610
|
-
computeMultiscattering(
|
|
613
|
+
computeMultiscattering( material.dfg, material.specularColor, material.specularF90, singleScatteringDielectric, multiScatteringDielectric );
|
|
614
|
+
computeMultiscattering( material.dfg, material.diffuseColor, material.specularF90, singleScatteringMetallic, multiScatteringMetallic );
|
|
611
615
|
|
|
612
616
|
#endif
|
|
613
617
|
|
|
@@ -13,6 +13,39 @@ export default /* glsl */`
|
|
|
13
13
|
|
|
14
14
|
#ifdef USE_SHADOWMAP
|
|
15
15
|
|
|
16
|
+
#if NUM_SUN_LIGHT_SHADOWS > 0
|
|
17
|
+
|
|
18
|
+
// must match the cascade count in SunLightShadow
|
|
19
|
+
|
|
20
|
+
#define SUN_LIGHT_CASCADES 2
|
|
21
|
+
|
|
22
|
+
#if defined( SHADOWMAP_TYPE_PCF )
|
|
23
|
+
|
|
24
|
+
uniform sampler2DShadow sunShadowMap[ NUM_SUN_LIGHT_SHADOWS ];
|
|
25
|
+
|
|
26
|
+
#else
|
|
27
|
+
|
|
28
|
+
uniform sampler2D sunShadowMap[ NUM_SUN_LIGHT_SHADOWS ];
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
uniform mat4 sunShadowMatrix[ NUM_SUN_LIGHT_SHADOWS * SUN_LIGHT_CASCADES ];
|
|
33
|
+
uniform vec4 sunShadowCascade[ NUM_SUN_LIGHT_SHADOWS * SUN_LIGHT_CASCADES ];
|
|
34
|
+
varying vec4 vSunShadowWorldPosition;
|
|
35
|
+
varying vec3 vSunShadowWorldNormal;
|
|
36
|
+
|
|
37
|
+
struct SunLightShadow {
|
|
38
|
+
float shadowIntensity;
|
|
39
|
+
float shadowBias;
|
|
40
|
+
float shadowNormalBias;
|
|
41
|
+
float shadowRadius;
|
|
42
|
+
vec2 shadowMapSize;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
uniform SunLightShadow sunLightShadows[ NUM_SUN_LIGHT_SHADOWS ];
|
|
46
|
+
|
|
47
|
+
#endif
|
|
48
|
+
|
|
16
49
|
#if NUM_DIR_LIGHT_SHADOWS > 0
|
|
17
50
|
|
|
18
51
|
#if defined( SHADOWMAP_TYPE_PCF )
|
|
@@ -258,6 +291,55 @@ export default /* glsl */`
|
|
|
258
291
|
|
|
259
292
|
#endif
|
|
260
293
|
|
|
294
|
+
#if NUM_SUN_LIGHT_SHADOWS > 0
|
|
295
|
+
|
|
296
|
+
float getSunShadow(
|
|
297
|
+
#if defined( SHADOWMAP_TYPE_PCF )
|
|
298
|
+
sampler2DShadow shadowMap,
|
|
299
|
+
#else
|
|
300
|
+
sampler2D shadowMap,
|
|
301
|
+
#endif
|
|
302
|
+
SunLightShadow sunLightShadow,
|
|
303
|
+
int shadowIndex
|
|
304
|
+
) {
|
|
305
|
+
|
|
306
|
+
vec4 shadowWorldPosition = vec4( vSunShadowWorldPosition.xyz + vSunShadowWorldNormal * sunLightShadow.shadowNormalBias, 1.0 );
|
|
307
|
+
float viewDepth = vSunShadowWorldPosition.w;
|
|
308
|
+
int cascadeOffset = shadowIndex * SUN_LIGHT_CASCADES;
|
|
309
|
+
|
|
310
|
+
float shadow = 1.0;
|
|
311
|
+
|
|
312
|
+
// walk the cascades back to front so each fade band can blend with the shadow behind it
|
|
313
|
+
|
|
314
|
+
for ( int i = SUN_LIGHT_CASCADES - 1; i >= 0; i -- ) {
|
|
315
|
+
|
|
316
|
+
// ( begin, end, fade start ) view depths of the cascade
|
|
317
|
+
|
|
318
|
+
vec4 cascade = sunShadowCascade[ cascadeOffset + i ];
|
|
319
|
+
|
|
320
|
+
if ( viewDepth >= cascade.x && viewDepth < cascade.y ) {
|
|
321
|
+
|
|
322
|
+
float cascadeShadow = getShadow(
|
|
323
|
+
shadowMap,
|
|
324
|
+
sunLightShadow.shadowMapSize,
|
|
325
|
+
sunLightShadow.shadowIntensity,
|
|
326
|
+
sunLightShadow.shadowBias,
|
|
327
|
+
sunLightShadow.shadowRadius,
|
|
328
|
+
sunShadowMatrix[ cascadeOffset + i ] * shadowWorldPosition
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
shadow = mix( cascadeShadow, shadow, smoothstep( cascade.z, cascade.y, viewDepth ) );
|
|
332
|
+
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return shadow;
|
|
338
|
+
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
#endif
|
|
342
|
+
|
|
261
343
|
#if NUM_POINT_LIGHT_SHADOWS > 0
|
|
262
344
|
|
|
263
345
|
#if defined( SHADOWMAP_TYPE_PCF )
|
|
@@ -9,6 +9,15 @@ export default /* glsl */`
|
|
|
9
9
|
|
|
10
10
|
#ifdef USE_SHADOWMAP
|
|
11
11
|
|
|
12
|
+
#if NUM_SUN_LIGHT_SHADOWS > 0
|
|
13
|
+
|
|
14
|
+
// cascade selection and shadow coordinates are computed per fragment
|
|
15
|
+
|
|
16
|
+
varying vec4 vSunShadowWorldPosition;
|
|
17
|
+
varying vec3 vSunShadowWorldNormal;
|
|
18
|
+
|
|
19
|
+
#endif
|
|
20
|
+
|
|
12
21
|
#if NUM_DIR_LIGHT_SHADOWS > 0
|
|
13
22
|
|
|
14
23
|
uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default /* glsl */`
|
|
2
2
|
|
|
3
|
-
#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
|
|
3
|
+
#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SUN_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
|
|
4
4
|
|
|
5
5
|
#ifdef HAS_NORMAL
|
|
6
6
|
|
|
@@ -20,6 +20,13 @@ export default /* glsl */`
|
|
|
20
20
|
|
|
21
21
|
#if defined( USE_SHADOWMAP )
|
|
22
22
|
|
|
23
|
+
#if NUM_SUN_LIGHT_SHADOWS > 0
|
|
24
|
+
|
|
25
|
+
vSunShadowWorldPosition = vec4( worldPosition.xyz, - mvPosition.z );
|
|
26
|
+
vSunShadowWorldNormal = shadowWorldNormal;
|
|
27
|
+
|
|
28
|
+
#endif
|
|
29
|
+
|
|
23
30
|
#if NUM_DIR_LIGHT_SHADOWS > 0
|
|
24
31
|
|
|
25
32
|
#pragma unroll_loop_start
|
|
@@ -5,6 +5,21 @@ float getShadowMask() {
|
|
|
5
5
|
|
|
6
6
|
#ifdef USE_SHADOWMAP
|
|
7
7
|
|
|
8
|
+
#if NUM_SUN_LIGHT_SHADOWS > 0
|
|
9
|
+
|
|
10
|
+
SunLightShadow sunLight;
|
|
11
|
+
|
|
12
|
+
#pragma unroll_loop_start
|
|
13
|
+
for ( int i = 0; i < NUM_SUN_LIGHT_SHADOWS; i ++ ) {
|
|
14
|
+
|
|
15
|
+
sunLight = sunLightShadows[ i ];
|
|
16
|
+
shadow *= receiveShadow ? getSunShadow( sunShadowMap[ i ], sunLight, UNROLLED_LOOP_INDEX ) : 1.0;
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
#pragma unroll_loop_end
|
|
20
|
+
|
|
21
|
+
#endif
|
|
22
|
+
|
|
8
23
|
#if NUM_DIR_LIGHT_SHADOWS > 0
|
|
9
24
|
|
|
10
25
|
DirectionalLightShadow directionalLight;
|
|
@@ -316,6 +316,7 @@ ShaderLib.physical = {
|
|
|
316
316
|
clearcoatRoughnessMap: { value: null },
|
|
317
317
|
clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
|
|
318
318
|
dispersion: { value: 0 },
|
|
319
|
+
retroreflectivity: { value: 0 },
|
|
319
320
|
iridescence: { value: 0 },
|
|
320
321
|
iridescenceMap: { value: null },
|
|
321
322
|
iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },
|
|
@@ -122,6 +122,22 @@ const UniformsLib = {
|
|
|
122
122
|
|
|
123
123
|
lightProbe: { value: [] },
|
|
124
124
|
|
|
125
|
+
sunLights: { value: [], properties: {
|
|
126
|
+
direction: {},
|
|
127
|
+
color: {}
|
|
128
|
+
} },
|
|
129
|
+
|
|
130
|
+
sunLightShadows: { value: [], properties: {
|
|
131
|
+
shadowIntensity: 1,
|
|
132
|
+
shadowBias: {},
|
|
133
|
+
shadowNormalBias: {},
|
|
134
|
+
shadowRadius: {},
|
|
135
|
+
shadowMapSize: {}
|
|
136
|
+
} },
|
|
137
|
+
|
|
138
|
+
sunShadowMatrix: { value: [] },
|
|
139
|
+
sunShadowCascade: { value: [] },
|
|
140
|
+
|
|
125
141
|
directionalLights: { value: [], properties: {
|
|
126
142
|
direction: {},
|
|
127
143
|
color: {}
|
|
@@ -41,8 +41,8 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
|
41
41
|
|
|
42
42
|
const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
|
|
43
43
|
|
|
44
|
-
if ( textureType !== UnsignedByteType &&
|
|
45
|
-
textureType !==
|
|
44
|
+
if ( textureType !== UnsignedByteType && textureType !== FloatType && ! halfFloatSupportedByExt &&
|
|
45
|
+
utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) { // Edge and Chrome Mac < 52 (#9513)
|
|
46
46
|
|
|
47
47
|
return false;
|
|
48
48
|
|