@plastic-software/three 0.181.3 → 0.183.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +11330 -10017
- package/build/three.core.js +10011 -9493
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1414 -631
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +21 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +8007 -5427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +8005 -5426
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -3
- package/examples/jsm/animation/CCDIKSolver.js +2 -2
- package/examples/jsm/controls/ArcballControls.js +3 -3
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +109 -6
- package/examples/jsm/controls/TrackballControls.js +6 -6
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +131 -4
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Inspector.js +74 -14
- package/examples/jsm/inspector/RendererInspector.js +12 -2
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Parameters.js +18 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Viewer.js +4 -4
- package/examples/jsm/inspector/ui/Profiler.js +1836 -31
- package/examples/jsm/inspector/ui/Style.js +973 -14
- package/examples/jsm/inspector/ui/Tab.js +188 -1
- package/examples/jsm/inspector/ui/Values.js +17 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
- package/examples/jsm/lines/LineMaterial.js +6 -0
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -4
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +122 -171
- package/examples/jsm/loaders/HDRLoader.js +0 -1
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +19 -3
- package/examples/jsm/loaders/LDrawLoader.js +2 -3
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +1 -1
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +37 -24
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/usd/USDAParser.js +447 -366
- package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Sky.js +76 -4
- package/examples/jsm/objects/SkyMesh.js +127 -10
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +268 -30
- package/examples/jsm/renderers/SVGRenderer.js +193 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +5 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
- package/examples/jsm/tsl/display/GodraysNode.js +624 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +3 -3
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -20
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TRAANode.js +273 -125
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/math/Bayer.js +40 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/package.json +20 -26
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +19 -11
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +56 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +3 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/ImageBitmapLoader.js +8 -3
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +2 -1
- package/src/loaders/ObjectLoader.js +21 -2
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +7 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +72 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
- package/src/math/Line3.js +3 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix4.js +74 -65
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Vector3.js +3 -5
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +87 -68
- package/src/nodes/TSL.js +6 -6
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +98 -12
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +20 -1
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +4 -21
- package/src/nodes/accessors/StorageTextureNode.js +37 -1
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +58 -22
- package/src/nodes/accessors/UniformArrayNode.js +4 -2
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionNode.js +1 -2
- package/src/nodes/core/ArrayNode.js +20 -1
- package/src/nodes/core/AssignNode.js +2 -2
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +103 -4
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +29 -3
- package/src/nodes/core/NodeBuilder.js +170 -53
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +10 -8
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +3 -3
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +65 -16
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +16 -2
- package/src/nodes/core/StructTypeNode.js +11 -17
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +47 -22
- package/src/nodes/core/VaryingNode.js +1 -18
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +98 -9
- package/src/nodes/display/RenderOutputNode.js +3 -3
- package/src/nodes/display/ScreenNode.js +3 -1
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportTextureNode.js +21 -4
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +4 -2
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
- package/src/nodes/gpgpu/ComputeNode.js +5 -4
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +2 -2
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +97 -41
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +2 -2
- package/src/nodes/math/MathNode.js +3 -40
- package/src/nodes/math/OperatorNode.js +2 -1
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLCore.js +17 -14
- package/src/nodes/utils/ArrayElementNode.js +13 -0
- package/src/nodes/utils/DebugNode.js +11 -11
- package/src/nodes/utils/EventNode.js +1 -2
- package/src/nodes/utils/JoinNode.js +2 -2
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +27 -14
- package/src/objects/InstancedMesh.js +11 -0
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/renderers/WebGLRenderer.js +178 -92
- package/src/renderers/common/Backend.js +29 -0
- package/src/renderers/common/Background.js +24 -11
- package/src/renderers/common/BindGroup.js +1 -9
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +27 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/CubeRenderTarget.js +50 -6
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +4 -4
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/RenderBundles.js +2 -1
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +15 -3
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +18 -2
- package/src/renderers/common/RenderPipeline.js +203 -17
- package/src/renderers/common/Renderer.js +257 -72
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +17 -1
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +61 -0
- package/src/renderers/common/XRManager.js +3 -2
- package/src/renderers/common/extras/PMREMGenerator.js +2 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +3 -3
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -5
- package/src/renderers/shaders/UniformsLib.js +0 -3
- package/src/renderers/webgl/WebGLBackground.js +2 -2
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLCapabilities.js +3 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +45 -109
- package/src/renderers/webgl/WebGLPrograms.js +45 -49
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +32 -37
- package/src/renderers/webgl/WebGLTextures.js +89 -28
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
- package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +119 -13
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +3 -3
- package/src/utils.js +258 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
package/build/three.module.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright 2010-
|
|
3
|
+
* Copyright 2010-2026 Three.js Authors
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { Matrix3, Vector2, Color, Matrix4, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane,
|
|
7
|
-
export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls,
|
|
6
|
+
import { Matrix3, Vector2, Color, Matrix4, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, CubeTexture, LinearMipmapLinearFilter, CubeCamera, EquirectangularReflectionMapping, EquirectangularRefractionMapping, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, TriPlanarMapping, CylindricalMapping, UVMapping, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, ReversedDepthFuncs, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';
|
|
7
|
+
export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, BezierInterpolant, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, Compatibility, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateBezier, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialBlending, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NoNormalPacking, NormalAnimationBlendMode, NormalGAPacking, NormalRGPacking, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';
|
|
8
8
|
|
|
9
9
|
function WebGLAnimation() {
|
|
10
10
|
|
|
@@ -309,7 +309,7 @@ var aomap_fragment = "#ifdef USE_AOMAP\n #ifdef USE_AOMAP_TRIPLANAR\n\t\tfloat
|
|
|
309
309
|
|
|
310
310
|
var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
|
|
311
311
|
|
|
312
|
-
var batching_pars_vertex = "#ifdef USE_BATCHING_MATRIX\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in int i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\
|
|
312
|
+
var batching_pars_vertex = "#ifdef USE_BATCHING_MATRIX\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in int i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec4 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 );\n\t}\n#endif";
|
|
313
313
|
|
|
314
314
|
var batching_vertex = "#ifdef USE_BATCHING_MATRIX\n\tmat4 batchingMatrix = getBatchingMatrix( gl_DrawID );\n#elif defined ( USE_BATCHING )\n\tmat4 batchingMatrix = mat4( 1.0 );\n#endif";
|
|
315
315
|
|
|
@@ -331,13 +331,13 @@ var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 v
|
|
|
331
331
|
|
|
332
332
|
var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif";
|
|
333
333
|
|
|
334
|
-
var color_fragment = "#if defined(
|
|
334
|
+
var color_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif";
|
|
335
335
|
|
|
336
|
-
var color_pars_fragment = "#if defined(
|
|
336
|
+
var color_pars_fragment = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif";
|
|
337
337
|
|
|
338
|
-
var color_pars_vertex = "#if defined(
|
|
338
|
+
var color_pars_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif";
|
|
339
339
|
|
|
340
|
-
var color_vertex = "#if defined(
|
|
340
|
+
var color_vertex = "#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\n#endif";
|
|
341
341
|
|
|
342
342
|
var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\n#if defined( USE_MAP_TRIPLANAR ) || \\\n defined( USE_ALPHAMAP_TRIPLANAR ) || \\\n defined( USE_NORMALMAP_TRIPLANAR ) || \\\n defined( USE_ROUGHNESSMAP_TRIPLANAR ) || \\\n defined( USE_AOMAP_TRIPLANAR ) || \\\n defined( USE_METALNESSMAP_TRIPLANAR ) || \\\n defined( USE_CLEARCOAT_NORMALMAP_TRIPLANAR )\n #define USE_TRIPLANAR\n#endif\n#if defined( USE_MAP_TRIPLANAR ) || \\\n defined( USE_ALPHAMAP_TRIPLANAR ) || \\\n defined( USE_ROUGHNESSMAP_TRIPLANAR ) || \\\n defined( USE_AOMAP_TRIPLANAR ) || \\\n defined( USE_METALNESSMAP_TRIPLANAR )\n vec4 texture2DTriplanar( sampler2D map, mat3 uvTransform, vec3 coords, vec3 weights ) {\n return weights.x * texture2D( map, (uvTransform * vec3(coords.zy, 1)).xy ) +\n weights.y * texture2D( map, (uvTransform * vec3(coords.xz, 1)).xy ) +\n weights.z * texture2D( map, (uvTransform * vec3(coords.xy, 1)).xy );\n \n }\n#endif\n#if defined( USE_NORMALMAP_TRIPLANAR ) || defined( USE_CLEARCOAT_NORMALMAP_TRIPLANAR )\n vec3 texture2DTriplanarNormal( sampler2D normalMap, mat3 uvTransform, vec2 normalMapScale, vec3 normal, vec3 coords, vec3 weights ) {\n \n vec2 uvX = coords.zy; vec2 uvY = coords.xz; vec2 uvZ = coords.xy; \n vec3 tnormalX = texture2D( normalMap, (uvTransform * vec3(uvX, 1)).xy ).xyz * 2.0 - 1.0;\n vec3 tnormalY = texture2D( normalMap, (uvTransform * vec3(uvY, 1)).xy ).xyz * 2.0 - 1.0;\n vec3 tnormalZ = texture2D( normalMap, (uvTransform * vec3(uvZ, 1)).xy ).xyz * 2.0 - 1.0;\n tnormalX.xy *= normalMapScale;\n tnormalY.xy *= normalMapScale;\n tnormalZ.xy *= normalMapScale;\n \n tnormalX = vec3(\n tnormalX.xy + normal.zy,\n abs(tnormalX.z) * normal.x\n );\n tnormalY = vec3(\n tnormalY.xy + normal.xz,\n abs(tnormalY.z) * normal.y\n );\n tnormalZ = vec3(\n tnormalZ.xy + normal.xy,\n abs(tnormalZ.z) * normal.z\n );\n \n return normalize(\n tnormalX.zyx * weights.x +\n tnormalY.xzy * weights.y +\n tnormalZ.xyz * weights.z\n );\n }\n#endif\n#if defined( USE_MAP_CYLINDRICAL ) || \\\n defined( USE_ALPHAMAP_CYLINDRICAL ) || \\\n defined( USE_NORMALMAP_CYLINDRICAL ) || \\\n defined( USE_ROUGHNESSMAP_CYLINDRICAL ) || \\\n defined( USE_AOMAP_CYLINDRICAL ) || \\\n defined( USE_METALNESSMAP_CYLINDRICAL ) || \\\n defined( USE_CLEARCOAT_NORMALMAP_CYLINDRICAL )\n #define USE_CYLINDRICAL\n#endif";
|
|
343
343
|
|
|
@@ -357,7 +357,7 @@ var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );";
|
|
|
357
357
|
|
|
358
358
|
var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}";
|
|
359
359
|
|
|
360
|
-
var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t
|
|
360
|
+
var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif";
|
|
361
361
|
|
|
362
362
|
var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif";
|
|
363
363
|
|
|
@@ -395,15 +395,15 @@ var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor
|
|
|
395
395
|
|
|
396
396
|
var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong";
|
|
397
397
|
|
|
398
|
-
var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor =
|
|
398
|
+
var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif";
|
|
399
399
|
|
|
400
|
-
var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\n\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\n\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid 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 ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid 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 ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
|
|
400
|
+
var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn v;\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColorBlended;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid 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 ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t\t#ifdef USE_CLEARCOAT\n\t\t\tvec3 Ncc = geometryClearcoatNormal;\n\t\t\tvec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );\n\t\t\tvec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );\n\t\t\tvec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );\n\t\t\tmat3 mInvClearcoat = mat3(\n\t\t\t\tvec3( t1Clearcoat.x, 0, t1Clearcoat.y ),\n\t\t\t\tvec3( 0, 1, 0 ),\n\t\t\t\tvec3( t1Clearcoat.z, 0, t1Clearcoat.w )\n\t\t\t);\n\t\t\tvec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;\n\t\t\tclearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );\n\t\t#endif\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid 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 ) {\n\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
|
|
401
401
|
|
|
402
|
-
var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.
|
|
402
|
+
var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif";
|
|
403
403
|
|
|
404
|
-
var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )
|
|
404
|
+
var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif";
|
|
405
405
|
|
|
406
|
-
var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif";
|
|
406
|
+
var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif";
|
|
407
407
|
|
|
408
408
|
var logdepthbuf_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
|
|
409
409
|
|
|
@@ -459,7 +459,7 @@ var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D
|
|
|
459
459
|
|
|
460
460
|
var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );";
|
|
461
461
|
|
|
462
|
-
var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}";
|
|
462
|
+
var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\n}";
|
|
463
463
|
|
|
464
464
|
var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif";
|
|
465
465
|
|
|
@@ -473,13 +473,13 @@ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUG
|
|
|
473
473
|
|
|
474
474
|
var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
|
|
475
475
|
|
|
476
|
-
var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform
|
|
476
|
+
var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif";
|
|
477
477
|
|
|
478
478
|
var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif";
|
|
479
479
|
|
|
480
480
|
var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif";
|
|
481
481
|
|
|
482
|
-
var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}";
|
|
482
|
+
var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}";
|
|
483
483
|
|
|
484
484
|
var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
|
|
485
485
|
|
|
@@ -497,7 +497,7 @@ var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = to
|
|
|
497
497
|
|
|
498
498
|
var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }";
|
|
499
499
|
|
|
500
|
-
var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.
|
|
500
|
+
var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif";
|
|
501
501
|
|
|
502
502
|
var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif";
|
|
503
503
|
|
|
@@ -527,7 +527,7 @@ const fragment$e = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\
|
|
|
527
527
|
|
|
528
528
|
const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}";
|
|
529
529
|
|
|
530
|
-
const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <
|
|
530
|
+
const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}";
|
|
531
531
|
|
|
532
532
|
const vertex$c = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}";
|
|
533
533
|
|
|
@@ -543,7 +543,7 @@ const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_
|
|
|
543
543
|
|
|
544
544
|
const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
|
|
545
545
|
|
|
546
|
-
const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <
|
|
546
|
+
const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_lambert_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_lambert_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
|
|
547
547
|
|
|
548
548
|
const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}";
|
|
549
549
|
|
|
@@ -551,19 +551,19 @@ const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity
|
|
|
551
551
|
|
|
552
552
|
const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}";
|
|
553
553
|
|
|
554
|
-
const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <
|
|
554
|
+
const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}";
|
|
555
555
|
|
|
556
556
|
const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
|
|
557
557
|
|
|
558
|
-
const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <
|
|
558
|
+
const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
|
|
559
559
|
|
|
560
560
|
const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}";
|
|
561
561
|
|
|
562
|
-
const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <
|
|
562
|
+
const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <triplanar_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n \t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
|
|
563
563
|
|
|
564
564
|
const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
|
|
565
565
|
|
|
566
|
-
const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <
|
|
566
|
+
const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
|
|
567
567
|
|
|
568
568
|
const vertex$3 = "uniform float size;\nuniform float scale;\n#include <common>\n#include <batching_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}";
|
|
569
569
|
|
|
@@ -571,7 +571,7 @@ const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include <com
|
|
|
571
571
|
|
|
572
572
|
const vertex$2 = "#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
|
|
573
573
|
|
|
574
|
-
const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <
|
|
574
|
+
const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}";
|
|
575
575
|
|
|
576
576
|
const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}";
|
|
577
577
|
|
|
@@ -695,8 +695,8 @@ const ShaderChunk = {
|
|
|
695
695
|
cube_frag: fragment$f,
|
|
696
696
|
depth_vert: vertex$e,
|
|
697
697
|
depth_frag: fragment$e,
|
|
698
|
-
|
|
699
|
-
|
|
698
|
+
distance_vert: vertex$d,
|
|
699
|
+
distance_frag: fragment$d,
|
|
700
700
|
equirect_vert: vertex$c,
|
|
701
701
|
equirect_frag: fragment$c,
|
|
702
702
|
linedashed_vert: vertex$b,
|
|
@@ -859,7 +859,6 @@ const UniformsLib = {
|
|
|
859
859
|
shadowMapSize: {}
|
|
860
860
|
} },
|
|
861
861
|
|
|
862
|
-
directionalShadowMap: { value: [] },
|
|
863
862
|
directionalShadowMatrix: { value: [] },
|
|
864
863
|
|
|
865
864
|
spotLights: { value: [], properties: {
|
|
@@ -881,7 +880,6 @@ const UniformsLib = {
|
|
|
881
880
|
} },
|
|
882
881
|
|
|
883
882
|
spotLightMap: { value: [] },
|
|
884
|
-
spotShadowMap: { value: [] },
|
|
885
883
|
spotLightMatrix: { value: [] },
|
|
886
884
|
|
|
887
885
|
pointLights: { value: [], properties: {
|
|
@@ -901,7 +899,6 @@ const UniformsLib = {
|
|
|
901
899
|
shadowCameraFar: {}
|
|
902
900
|
} },
|
|
903
901
|
|
|
904
|
-
pointShadowMap: { value: [] },
|
|
905
902
|
pointShadowMatrix: { value: [] },
|
|
906
903
|
|
|
907
904
|
hemisphereLights: { value: [], properties: {
|
|
@@ -986,7 +983,8 @@ const ShaderLib = {
|
|
|
986
983
|
UniformsLib.fog,
|
|
987
984
|
UniformsLib.lights,
|
|
988
985
|
{
|
|
989
|
-
emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }
|
|
986
|
+
emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },
|
|
987
|
+
envMapIntensity: { value: 1 }
|
|
990
988
|
}
|
|
991
989
|
] ),
|
|
992
990
|
|
|
@@ -1012,7 +1010,8 @@ const ShaderLib = {
|
|
|
1012
1010
|
{
|
|
1013
1011
|
emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },
|
|
1014
1012
|
specular: { value: /*@__PURE__*/ new Color( 0x111111 ) },
|
|
1015
|
-
shininess: { value: 30 }
|
|
1013
|
+
shininess: { value: 30 },
|
|
1014
|
+
envMapIntensity: { value: 1 }
|
|
1016
1015
|
}
|
|
1017
1016
|
] ),
|
|
1018
1017
|
|
|
@@ -1212,7 +1211,7 @@ const ShaderLib = {
|
|
|
1212
1211
|
|
|
1213
1212
|
},
|
|
1214
1213
|
|
|
1215
|
-
|
|
1214
|
+
distance: {
|
|
1216
1215
|
|
|
1217
1216
|
uniforms: /*@__PURE__*/ mergeUniforms( [
|
|
1218
1217
|
UniformsLib.common,
|
|
@@ -1224,8 +1223,8 @@ const ShaderLib = {
|
|
|
1224
1223
|
}
|
|
1225
1224
|
] ),
|
|
1226
1225
|
|
|
1227
|
-
vertexShader: ShaderChunk.
|
|
1228
|
-
fragmentShader: ShaderChunk.
|
|
1226
|
+
vertexShader: ShaderChunk.distance_vert,
|
|
1227
|
+
fragmentShader: ShaderChunk.distance_frag
|
|
1229
1228
|
|
|
1230
1229
|
},
|
|
1231
1230
|
|
|
@@ -1308,7 +1307,7 @@ const _rgb = { r: 0, b: 0, g: 0 };
|
|
|
1308
1307
|
const _e1$1 = /*@__PURE__*/ new Euler();
|
|
1309
1308
|
const _m1$1 = /*@__PURE__*/ new Matrix4();
|
|
1310
1309
|
|
|
1311
|
-
function WebGLBackground( renderer,
|
|
1310
|
+
function WebGLBackground( renderer, environments, state, objects, alpha, premultipliedAlpha ) {
|
|
1312
1311
|
|
|
1313
1312
|
const clearColor = new Color( 0x000000 );
|
|
1314
1313
|
let clearAlpha = alpha === true ? 0 : 1;
|
|
@@ -1327,7 +1326,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
1327
1326
|
if ( background && background.isTexture ) {
|
|
1328
1327
|
|
|
1329
1328
|
const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background
|
|
1330
|
-
background =
|
|
1329
|
+
background = environments.get( background, usePMREM );
|
|
1331
1330
|
|
|
1332
1331
|
}
|
|
1333
1332
|
|
|
@@ -1607,7 +1606,7 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
1607
1606
|
|
|
1608
1607
|
let updateBuffers = false;
|
|
1609
1608
|
|
|
1610
|
-
const state = getBindingState( geometry, program, material );
|
|
1609
|
+
const state = getBindingState( object, geometry, program, material );
|
|
1611
1610
|
|
|
1612
1611
|
if ( currentState !== state ) {
|
|
1613
1612
|
|
|
@@ -1660,16 +1659,28 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
1660
1659
|
|
|
1661
1660
|
}
|
|
1662
1661
|
|
|
1663
|
-
function getBindingState( geometry, program, material ) {
|
|
1662
|
+
function getBindingState( object, geometry, program, material ) {
|
|
1664
1663
|
|
|
1665
1664
|
const wireframe = ( material.wireframe === true );
|
|
1666
1665
|
|
|
1667
|
-
let
|
|
1666
|
+
let objectMap = bindingStates[ geometry.id ];
|
|
1667
|
+
|
|
1668
|
+
if ( objectMap === undefined ) {
|
|
1669
|
+
|
|
1670
|
+
objectMap = {};
|
|
1671
|
+
bindingStates[ geometry.id ] = objectMap;
|
|
1672
|
+
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
// Each InstancedMesh requires unique binding states because it contains instanced attributes.
|
|
1676
|
+
const objectId = ( object.isInstancedMesh === true ) ? object.id : 0;
|
|
1677
|
+
|
|
1678
|
+
let programMap = objectMap[ objectId ];
|
|
1668
1679
|
|
|
1669
1680
|
if ( programMap === undefined ) {
|
|
1670
1681
|
|
|
1671
1682
|
programMap = {};
|
|
1672
|
-
|
|
1683
|
+
objectMap[ objectId ] = programMap;
|
|
1673
1684
|
|
|
1674
1685
|
}
|
|
1675
1686
|
|
|
@@ -2070,21 +2081,27 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
2070
2081
|
|
|
2071
2082
|
for ( const geometryId in bindingStates ) {
|
|
2072
2083
|
|
|
2073
|
-
const
|
|
2084
|
+
const objectMap = bindingStates[ geometryId ];
|
|
2074
2085
|
|
|
2075
|
-
for ( const
|
|
2086
|
+
for ( const objectId in objectMap ) {
|
|
2076
2087
|
|
|
2077
|
-
const
|
|
2088
|
+
const programMap = objectMap[ objectId ];
|
|
2078
2089
|
|
|
2079
|
-
for ( const
|
|
2090
|
+
for ( const programId in programMap ) {
|
|
2080
2091
|
|
|
2081
|
-
|
|
2092
|
+
const stateMap = programMap[ programId ];
|
|
2082
2093
|
|
|
2083
|
-
|
|
2094
|
+
for ( const wireframe in stateMap ) {
|
|
2084
2095
|
|
|
2085
|
-
|
|
2096
|
+
deleteVertexArrayObject( stateMap[ wireframe ].object );
|
|
2086
2097
|
|
|
2087
|
-
|
|
2098
|
+
delete stateMap[ wireframe ];
|
|
2099
|
+
|
|
2100
|
+
}
|
|
2101
|
+
|
|
2102
|
+
delete programMap[ programId ];
|
|
2103
|
+
|
|
2104
|
+
}
|
|
2088
2105
|
|
|
2089
2106
|
}
|
|
2090
2107
|
|
|
@@ -2098,21 +2115,27 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
2098
2115
|
|
|
2099
2116
|
if ( bindingStates[ geometry.id ] === undefined ) return;
|
|
2100
2117
|
|
|
2101
|
-
const
|
|
2118
|
+
const objectMap = bindingStates[ geometry.id ];
|
|
2102
2119
|
|
|
2103
|
-
for ( const
|
|
2120
|
+
for ( const objectId in objectMap ) {
|
|
2104
2121
|
|
|
2105
|
-
const
|
|
2122
|
+
const programMap = objectMap[ objectId ];
|
|
2106
2123
|
|
|
2107
|
-
for ( const
|
|
2124
|
+
for ( const programId in programMap ) {
|
|
2108
2125
|
|
|
2109
|
-
|
|
2126
|
+
const stateMap = programMap[ programId ];
|
|
2110
2127
|
|
|
2111
|
-
|
|
2128
|
+
for ( const wireframe in stateMap ) {
|
|
2112
2129
|
|
|
2113
|
-
|
|
2130
|
+
deleteVertexArrayObject( stateMap[ wireframe ].object );
|
|
2131
|
+
|
|
2132
|
+
delete stateMap[ wireframe ];
|
|
2133
|
+
|
|
2134
|
+
}
|
|
2114
2135
|
|
|
2115
|
-
|
|
2136
|
+
delete programMap[ programId ];
|
|
2137
|
+
|
|
2138
|
+
}
|
|
2116
2139
|
|
|
2117
2140
|
}
|
|
2118
2141
|
|
|
@@ -2124,26 +2147,73 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
2124
2147
|
|
|
2125
2148
|
for ( const geometryId in bindingStates ) {
|
|
2126
2149
|
|
|
2127
|
-
const
|
|
2150
|
+
const objectMap = bindingStates[ geometryId ];
|
|
2151
|
+
|
|
2152
|
+
for ( const objectId in objectMap ) {
|
|
2128
2153
|
|
|
2129
|
-
|
|
2154
|
+
const programMap = objectMap[ objectId ];
|
|
2155
|
+
|
|
2156
|
+
if ( programMap[ program.id ] === undefined ) continue;
|
|
2157
|
+
|
|
2158
|
+
const stateMap = programMap[ program.id ];
|
|
2159
|
+
|
|
2160
|
+
for ( const wireframe in stateMap ) {
|
|
2130
2161
|
|
|
2131
|
-
|
|
2162
|
+
deleteVertexArrayObject( stateMap[ wireframe ].object );
|
|
2132
2163
|
|
|
2133
|
-
|
|
2164
|
+
delete stateMap[ wireframe ];
|
|
2134
2165
|
|
|
2135
|
-
|
|
2166
|
+
}
|
|
2136
2167
|
|
|
2137
|
-
delete
|
|
2168
|
+
delete programMap[ program.id ];
|
|
2138
2169
|
|
|
2139
2170
|
}
|
|
2140
2171
|
|
|
2141
|
-
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
}
|
|
2175
|
+
|
|
2176
|
+
function releaseStatesOfObject( object ) {
|
|
2177
|
+
|
|
2178
|
+
for ( const geometryId in bindingStates ) {
|
|
2179
|
+
|
|
2180
|
+
const objectMap = bindingStates[ geometryId ];
|
|
2181
|
+
|
|
2182
|
+
const objectId = ( object.isInstancedMesh === true ) ? object.id : 0;
|
|
2183
|
+
|
|
2184
|
+
const programMap = objectMap[ objectId ];
|
|
2185
|
+
|
|
2186
|
+
if ( programMap === undefined ) continue;
|
|
2187
|
+
|
|
2188
|
+
for ( const programId in programMap ) {
|
|
2189
|
+
|
|
2190
|
+
const stateMap = programMap[ programId ];
|
|
2191
|
+
|
|
2192
|
+
for ( const wireframe in stateMap ) {
|
|
2193
|
+
|
|
2194
|
+
deleteVertexArrayObject( stateMap[ wireframe ].object );
|
|
2195
|
+
|
|
2196
|
+
delete stateMap[ wireframe ];
|
|
2197
|
+
|
|
2198
|
+
}
|
|
2199
|
+
|
|
2200
|
+
delete programMap[ programId ];
|
|
2201
|
+
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2204
|
+
delete objectMap[ objectId ];
|
|
2205
|
+
|
|
2206
|
+
if ( Object.keys( objectMap ).length === 0 ) {
|
|
2207
|
+
|
|
2208
|
+
delete bindingStates[ geometryId ];
|
|
2209
|
+
|
|
2210
|
+
}
|
|
2142
2211
|
|
|
2143
2212
|
}
|
|
2144
2213
|
|
|
2145
2214
|
}
|
|
2146
2215
|
|
|
2216
|
+
|
|
2147
2217
|
function reset() {
|
|
2148
2218
|
|
|
2149
2219
|
resetDefaultState();
|
|
@@ -2173,6 +2243,7 @@ function WebGLBindingStates( gl, attributes ) {
|
|
|
2173
2243
|
resetDefaultState: resetDefaultState,
|
|
2174
2244
|
dispose: dispose,
|
|
2175
2245
|
releaseStatesOfGeometry: releaseStatesOfGeometry,
|
|
2246
|
+
releaseStatesOfObject: releaseStatesOfObject,
|
|
2176
2247
|
releaseStatesOfProgram: releaseStatesOfProgram,
|
|
2177
2248
|
|
|
2178
2249
|
initAttributes: initAttributes,
|
|
@@ -2374,9 +2445,8 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
|
2374
2445
|
const maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
|
|
2375
2446
|
const maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
|
|
2376
2447
|
|
|
2377
|
-
const vertexTextures = maxVertexTextures > 0;
|
|
2378
|
-
|
|
2379
2448
|
const maxSamples = gl.getParameter( gl.MAX_SAMPLES );
|
|
2449
|
+
const samples = gl.getParameter( gl.SAMPLES );
|
|
2380
2450
|
|
|
2381
2451
|
return {
|
|
2382
2452
|
|
|
@@ -2402,9 +2472,9 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
|
2402
2472
|
maxVaryings: maxVaryings,
|
|
2403
2473
|
maxFragmentUniforms: maxFragmentUniforms,
|
|
2404
2474
|
|
|
2405
|
-
|
|
2475
|
+
maxSamples: maxSamples,
|
|
2406
2476
|
|
|
2407
|
-
|
|
2477
|
+
samples: samples
|
|
2408
2478
|
|
|
2409
2479
|
};
|
|
2410
2480
|
|
|
@@ -2576,101 +2646,6 @@ function WebGLClipping( properties ) {
|
|
|
2576
2646
|
|
|
2577
2647
|
}
|
|
2578
2648
|
|
|
2579
|
-
function WebGLCubeMaps( renderer ) {
|
|
2580
|
-
|
|
2581
|
-
let cubemaps = new WeakMap();
|
|
2582
|
-
|
|
2583
|
-
function mapTextureMapping( texture, mapping ) {
|
|
2584
|
-
|
|
2585
|
-
if ( mapping === EquirectangularReflectionMapping ) {
|
|
2586
|
-
|
|
2587
|
-
texture.mapping = CubeReflectionMapping;
|
|
2588
|
-
|
|
2589
|
-
} else if ( mapping === EquirectangularRefractionMapping ) {
|
|
2590
|
-
|
|
2591
|
-
texture.mapping = CubeRefractionMapping;
|
|
2592
|
-
|
|
2593
|
-
}
|
|
2594
|
-
|
|
2595
|
-
return texture;
|
|
2596
|
-
|
|
2597
|
-
}
|
|
2598
|
-
|
|
2599
|
-
function get( texture ) {
|
|
2600
|
-
|
|
2601
|
-
if ( texture && texture.isTexture ) {
|
|
2602
|
-
|
|
2603
|
-
const mapping = texture.mapping;
|
|
2604
|
-
|
|
2605
|
-
if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {
|
|
2606
|
-
|
|
2607
|
-
if ( cubemaps.has( texture ) ) {
|
|
2608
|
-
|
|
2609
|
-
const cubemap = cubemaps.get( texture ).texture;
|
|
2610
|
-
return mapTextureMapping( cubemap, texture.mapping );
|
|
2611
|
-
|
|
2612
|
-
} else {
|
|
2613
|
-
|
|
2614
|
-
const image = texture.image;
|
|
2615
|
-
|
|
2616
|
-
if ( image && image.height > 0 ) {
|
|
2617
|
-
|
|
2618
|
-
const renderTarget = new WebGLCubeRenderTarget( image.height );
|
|
2619
|
-
renderTarget.fromEquirectangularTexture( renderer, texture );
|
|
2620
|
-
cubemaps.set( texture, renderTarget );
|
|
2621
|
-
|
|
2622
|
-
texture.addEventListener( 'dispose', onTextureDispose );
|
|
2623
|
-
|
|
2624
|
-
return mapTextureMapping( renderTarget.texture, texture.mapping );
|
|
2625
|
-
|
|
2626
|
-
} else {
|
|
2627
|
-
|
|
2628
|
-
// image not yet ready. try the conversion next frame
|
|
2629
|
-
|
|
2630
|
-
return null;
|
|
2631
|
-
|
|
2632
|
-
}
|
|
2633
|
-
|
|
2634
|
-
}
|
|
2635
|
-
|
|
2636
|
-
}
|
|
2637
|
-
|
|
2638
|
-
}
|
|
2639
|
-
|
|
2640
|
-
return texture;
|
|
2641
|
-
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
function onTextureDispose( event ) {
|
|
2645
|
-
|
|
2646
|
-
const texture = event.target;
|
|
2647
|
-
|
|
2648
|
-
texture.removeEventListener( 'dispose', onTextureDispose );
|
|
2649
|
-
|
|
2650
|
-
const cubemap = cubemaps.get( texture );
|
|
2651
|
-
|
|
2652
|
-
if ( cubemap !== undefined ) {
|
|
2653
|
-
|
|
2654
|
-
cubemaps.delete( texture );
|
|
2655
|
-
cubemap.dispose();
|
|
2656
|
-
|
|
2657
|
-
}
|
|
2658
|
-
|
|
2659
|
-
}
|
|
2660
|
-
|
|
2661
|
-
function dispose() {
|
|
2662
|
-
|
|
2663
|
-
cubemaps = new WeakMap();
|
|
2664
|
-
|
|
2665
|
-
}
|
|
2666
|
-
|
|
2667
|
-
return {
|
|
2668
|
-
get: get,
|
|
2669
|
-
dispose: dispose
|
|
2670
|
-
};
|
|
2671
|
-
|
|
2672
|
-
}
|
|
2673
|
-
|
|
2674
2649
|
const LOD_MIN = 4;
|
|
2675
2650
|
|
|
2676
2651
|
// The standard deviations (radians) associated with the extra mips.
|
|
@@ -2750,7 +2725,7 @@ class PMREMGenerator {
|
|
|
2750
2725
|
* @param {number} [far=100] - The far plane distance.
|
|
2751
2726
|
* @param {Object} [options={}] - The configuration options.
|
|
2752
2727
|
* @param {number} [options.size=256] - The texture size of the PMREM.
|
|
2753
|
-
* @param {Vector3} [options.
|
|
2728
|
+
* @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.
|
|
2754
2729
|
* @return {WebGLRenderTarget} The resulting PMREM.
|
|
2755
2730
|
*/
|
|
2756
2731
|
fromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {
|
|
@@ -2961,6 +2936,7 @@ class PMREMGenerator {
|
|
|
2961
2936
|
( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
|
|
2962
2937
|
|
|
2963
2938
|
this._blurMaterial = _getBlurShader( _lodMax, width, height );
|
|
2939
|
+
this._ggxMaterial = _getGGXShader( _lodMax, width, height );
|
|
2964
2940
|
|
|
2965
2941
|
}
|
|
2966
2942
|
|
|
@@ -3166,14 +3142,6 @@ class PMREMGenerator {
|
|
|
3166
3142
|
const renderer = this._renderer;
|
|
3167
3143
|
const pingPongRenderTarget = this._pingPongRenderTarget;
|
|
3168
3144
|
|
|
3169
|
-
if ( this._ggxMaterial === null ) {
|
|
3170
|
-
|
|
3171
|
-
const width = 3 * Math.max( this._cubeSize, 16 );
|
|
3172
|
-
const height = 4 * this._cubeSize;
|
|
3173
|
-
this._ggxMaterial = _getGGXShader( this._lodMax, width, height );
|
|
3174
|
-
|
|
3175
|
-
}
|
|
3176
|
-
|
|
3177
3145
|
const ggxMaterial = this._ggxMaterial;
|
|
3178
3146
|
const ggxMesh = this._lodMeshes[ lodOut ];
|
|
3179
3147
|
ggxMesh.material = ggxMaterial;
|
|
@@ -3186,7 +3154,7 @@ class PMREMGenerator {
|
|
|
3186
3154
|
const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
|
|
3187
3155
|
|
|
3188
3156
|
// Apply blur strength mapping for better quality across the roughness range
|
|
3189
|
-
const blurStrength = 0.
|
|
3157
|
+
const blurStrength = 0.0 + targetRoughness * 1.25;
|
|
3190
3158
|
const adjustedRoughness = incrementalRoughness * blurStrength;
|
|
3191
3159
|
|
|
3192
3160
|
// Calculate viewport position based on output LOD level
|
|
@@ -3499,24 +3467,20 @@ function _getGGXShader( lodMax, width, height ) {
|
|
|
3499
3467
|
vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {
|
|
3500
3468
|
float alpha = roughness * roughness;
|
|
3501
3469
|
|
|
3502
|
-
// Section 3.2: Transform view direction to hemisphere configuration
|
|
3503
|
-
vec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));
|
|
3504
|
-
|
|
3505
3470
|
// Section 4.1: Orthonormal basis
|
|
3506
|
-
|
|
3507
|
-
vec3
|
|
3508
|
-
vec3 T2 = cross(Vh, T1);
|
|
3471
|
+
vec3 T1 = vec3(1.0, 0.0, 0.0);
|
|
3472
|
+
vec3 T2 = cross(V, T1);
|
|
3509
3473
|
|
|
3510
3474
|
// Section 4.2: Parameterization of projected area
|
|
3511
3475
|
float r = sqrt(Xi.x);
|
|
3512
3476
|
float phi = 2.0 * PI * Xi.y;
|
|
3513
3477
|
float t1 = r * cos(phi);
|
|
3514
3478
|
float t2 = r * sin(phi);
|
|
3515
|
-
float s = 0.5 * (1.0 +
|
|
3479
|
+
float s = 0.5 * (1.0 + V.z);
|
|
3516
3480
|
t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;
|
|
3517
3481
|
|
|
3518
3482
|
// Section 4.3: Reprojection onto hemisphere
|
|
3519
|
-
vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) *
|
|
3483
|
+
vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;
|
|
3520
3484
|
|
|
3521
3485
|
// Section 3.4: Transform back to ellipsoid configuration
|
|
3522
3486
|
return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));
|
|
@@ -3822,13 +3786,245 @@ function _getCommonVertexShader() {
|
|
|
3822
3786
|
|
|
3823
3787
|
}
|
|
3824
3788
|
|
|
3825
|
-
|
|
3789
|
+
/**
|
|
3790
|
+
* A cube render target used in context of {@link WebGLRenderer}.
|
|
3791
|
+
*
|
|
3792
|
+
* @augments WebGLRenderTarget
|
|
3793
|
+
*/
|
|
3794
|
+
class WebGLCubeRenderTarget extends WebGLRenderTarget {
|
|
3795
|
+
|
|
3796
|
+
/**
|
|
3797
|
+
* Constructs a new cube render target.
|
|
3798
|
+
*
|
|
3799
|
+
* @param {number} [size=1] - The size of the render target.
|
|
3800
|
+
* @param {RenderTarget~Options} [options] - The configuration object.
|
|
3801
|
+
*/
|
|
3802
|
+
constructor( size = 1, options = {} ) {
|
|
3803
|
+
|
|
3804
|
+
super( size, size, options );
|
|
3805
|
+
|
|
3806
|
+
/**
|
|
3807
|
+
* This flag can be used for type testing.
|
|
3808
|
+
*
|
|
3809
|
+
* @type {boolean}
|
|
3810
|
+
* @readonly
|
|
3811
|
+
* @default true
|
|
3812
|
+
*/
|
|
3813
|
+
this.isWebGLCubeRenderTarget = true;
|
|
3814
|
+
|
|
3815
|
+
const image = { width: size, height: size, depth: 1 };
|
|
3816
|
+
const images = [ image, image, image, image, image, image ];
|
|
3817
|
+
|
|
3818
|
+
/**
|
|
3819
|
+
* Overwritten with a different texture type.
|
|
3820
|
+
*
|
|
3821
|
+
* @type {DataArrayTexture}
|
|
3822
|
+
*/
|
|
3823
|
+
this.texture = new CubeTexture( images );
|
|
3824
|
+
this._setTextureOptions( options );
|
|
3825
|
+
|
|
3826
|
+
// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)
|
|
3827
|
+
// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,
|
|
3828
|
+
// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.
|
|
3829
|
+
|
|
3830
|
+
// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped
|
|
3831
|
+
// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture
|
|
3832
|
+
// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).
|
|
3833
|
+
|
|
3834
|
+
this.texture.isRenderTargetTexture = true;
|
|
3835
|
+
|
|
3836
|
+
}
|
|
3837
|
+
|
|
3838
|
+
/**
|
|
3839
|
+
* Converts the given equirectangular texture to a cube map.
|
|
3840
|
+
*
|
|
3841
|
+
* @param {WebGLRenderer} renderer - The renderer.
|
|
3842
|
+
* @param {Texture} texture - The equirectangular texture.
|
|
3843
|
+
* @return {WebGLCubeRenderTarget} A reference to this cube render target.
|
|
3844
|
+
*/
|
|
3845
|
+
fromEquirectangularTexture( renderer, texture ) {
|
|
3846
|
+
|
|
3847
|
+
this.texture.type = texture.type;
|
|
3848
|
+
this.texture.colorSpace = texture.colorSpace;
|
|
3849
|
+
|
|
3850
|
+
this.texture.generateMipmaps = texture.generateMipmaps;
|
|
3851
|
+
this.texture.minFilter = texture.minFilter;
|
|
3852
|
+
this.texture.magFilter = texture.magFilter;
|
|
3853
|
+
|
|
3854
|
+
const shader = {
|
|
3855
|
+
|
|
3856
|
+
uniforms: {
|
|
3857
|
+
tEquirect: { value: null },
|
|
3858
|
+
},
|
|
3859
|
+
|
|
3860
|
+
vertexShader: /* glsl */`
|
|
3861
|
+
|
|
3862
|
+
varying vec3 vWorldDirection;
|
|
3863
|
+
|
|
3864
|
+
vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
|
|
3865
|
+
|
|
3866
|
+
return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );
|
|
3867
|
+
|
|
3868
|
+
}
|
|
3869
|
+
|
|
3870
|
+
void main() {
|
|
3871
|
+
|
|
3872
|
+
vWorldDirection = transformDirection( position, modelMatrix );
|
|
3873
|
+
|
|
3874
|
+
#include <begin_vertex>
|
|
3875
|
+
#include <project_vertex>
|
|
3876
|
+
|
|
3877
|
+
}
|
|
3878
|
+
`,
|
|
3879
|
+
|
|
3880
|
+
fragmentShader: /* glsl */`
|
|
3881
|
+
|
|
3882
|
+
uniform sampler2D tEquirect;
|
|
3883
|
+
|
|
3884
|
+
varying vec3 vWorldDirection;
|
|
3885
|
+
|
|
3886
|
+
#include <common>
|
|
3887
|
+
|
|
3888
|
+
void main() {
|
|
3889
|
+
|
|
3890
|
+
vec3 direction = normalize( vWorldDirection );
|
|
3891
|
+
|
|
3892
|
+
vec2 sampleUV = equirectUv( direction );
|
|
3893
|
+
|
|
3894
|
+
gl_FragColor = texture2D( tEquirect, sampleUV );
|
|
3895
|
+
|
|
3896
|
+
}
|
|
3897
|
+
`
|
|
3898
|
+
};
|
|
3899
|
+
|
|
3900
|
+
const geometry = new BoxGeometry( 5, 5, 5 );
|
|
3901
|
+
|
|
3902
|
+
const material = new ShaderMaterial( {
|
|
3903
|
+
|
|
3904
|
+
name: 'CubemapFromEquirect',
|
|
3905
|
+
|
|
3906
|
+
uniforms: cloneUniforms( shader.uniforms ),
|
|
3907
|
+
vertexShader: shader.vertexShader,
|
|
3908
|
+
fragmentShader: shader.fragmentShader,
|
|
3909
|
+
side: BackSide,
|
|
3910
|
+
blending: NoBlending
|
|
3911
|
+
|
|
3912
|
+
} );
|
|
3913
|
+
|
|
3914
|
+
material.uniforms.tEquirect.value = texture;
|
|
3915
|
+
|
|
3916
|
+
const mesh = new Mesh( geometry, material );
|
|
3917
|
+
|
|
3918
|
+
const currentMinFilter = texture.minFilter;
|
|
3919
|
+
|
|
3920
|
+
// Avoid blurred poles
|
|
3921
|
+
if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;
|
|
3922
|
+
|
|
3923
|
+
const camera = new CubeCamera( 1, 10, this );
|
|
3924
|
+
camera.update( renderer, mesh );
|
|
3925
|
+
|
|
3926
|
+
texture.minFilter = currentMinFilter;
|
|
3927
|
+
|
|
3928
|
+
mesh.geometry.dispose();
|
|
3929
|
+
mesh.material.dispose();
|
|
3930
|
+
|
|
3931
|
+
return this;
|
|
3932
|
+
|
|
3933
|
+
}
|
|
3934
|
+
|
|
3935
|
+
/**
|
|
3936
|
+
* Clears this cube render target.
|
|
3937
|
+
*
|
|
3938
|
+
* @param {WebGLRenderer} renderer - The renderer.
|
|
3939
|
+
* @param {boolean} [color=true] - Whether the color buffer should be cleared or not.
|
|
3940
|
+
* @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.
|
|
3941
|
+
* @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.
|
|
3942
|
+
*/
|
|
3943
|
+
clear( renderer, color = true, depth = true, stencil = true ) {
|
|
3944
|
+
|
|
3945
|
+
const currentRenderTarget = renderer.getRenderTarget();
|
|
3946
|
+
|
|
3947
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
3948
|
+
|
|
3949
|
+
renderer.setRenderTarget( this, i );
|
|
3950
|
+
|
|
3951
|
+
renderer.clear( color, depth, stencil );
|
|
3952
|
+
|
|
3953
|
+
}
|
|
3954
|
+
|
|
3955
|
+
renderer.setRenderTarget( currentRenderTarget );
|
|
3956
|
+
|
|
3957
|
+
}
|
|
3958
|
+
|
|
3959
|
+
}
|
|
3960
|
+
|
|
3961
|
+
function WebGLEnvironments( renderer ) {
|
|
3826
3962
|
|
|
3827
|
-
let
|
|
3963
|
+
let cubeMaps = new WeakMap();
|
|
3964
|
+
let pmremMaps = new WeakMap();
|
|
3828
3965
|
|
|
3829
3966
|
let pmremGenerator = null;
|
|
3830
3967
|
|
|
3831
|
-
function get( texture ) {
|
|
3968
|
+
function get( texture, usePMREM = false ) {
|
|
3969
|
+
|
|
3970
|
+
if ( texture === null || texture === undefined ) return null;
|
|
3971
|
+
|
|
3972
|
+
if ( usePMREM ) {
|
|
3973
|
+
|
|
3974
|
+
return getPMREM( texture );
|
|
3975
|
+
|
|
3976
|
+
}
|
|
3977
|
+
|
|
3978
|
+
return getCube( texture );
|
|
3979
|
+
|
|
3980
|
+
}
|
|
3981
|
+
|
|
3982
|
+
function getCube( texture ) {
|
|
3983
|
+
|
|
3984
|
+
if ( texture && texture.isTexture ) {
|
|
3985
|
+
|
|
3986
|
+
const mapping = texture.mapping;
|
|
3987
|
+
|
|
3988
|
+
if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {
|
|
3989
|
+
|
|
3990
|
+
if ( cubeMaps.has( texture ) ) {
|
|
3991
|
+
|
|
3992
|
+
const cubemap = cubeMaps.get( texture ).texture;
|
|
3993
|
+
return mapTextureMapping( cubemap, texture.mapping );
|
|
3994
|
+
|
|
3995
|
+
} else {
|
|
3996
|
+
|
|
3997
|
+
const image = texture.image;
|
|
3998
|
+
|
|
3999
|
+
if ( image && image.height > 0 ) {
|
|
4000
|
+
|
|
4001
|
+
const renderTarget = new WebGLCubeRenderTarget( image.height );
|
|
4002
|
+
renderTarget.fromEquirectangularTexture( renderer, texture );
|
|
4003
|
+
cubeMaps.set( texture, renderTarget );
|
|
4004
|
+
|
|
4005
|
+
texture.addEventListener( 'dispose', onCubemapDispose );
|
|
4006
|
+
|
|
4007
|
+
return mapTextureMapping( renderTarget.texture, texture.mapping );
|
|
4008
|
+
|
|
4009
|
+
} else {
|
|
4010
|
+
|
|
4011
|
+
// image not yet ready. try the conversion next frame
|
|
4012
|
+
|
|
4013
|
+
return null;
|
|
4014
|
+
|
|
4015
|
+
}
|
|
4016
|
+
|
|
4017
|
+
}
|
|
4018
|
+
|
|
4019
|
+
}
|
|
4020
|
+
|
|
4021
|
+
}
|
|
4022
|
+
|
|
4023
|
+
return texture;
|
|
4024
|
+
|
|
4025
|
+
}
|
|
4026
|
+
|
|
4027
|
+
function getPMREM( texture ) {
|
|
3832
4028
|
|
|
3833
4029
|
if ( texture && texture.isTexture ) {
|
|
3834
4030
|
|
|
@@ -3841,7 +4037,7 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3841
4037
|
|
|
3842
4038
|
if ( isEquirectMap || isCubeMap ) {
|
|
3843
4039
|
|
|
3844
|
-
let renderTarget =
|
|
4040
|
+
let renderTarget = pmremMaps.get( texture );
|
|
3845
4041
|
|
|
3846
4042
|
const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;
|
|
3847
4043
|
|
|
@@ -3852,7 +4048,7 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3852
4048
|
renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );
|
|
3853
4049
|
renderTarget.texture.pmremVersion = texture.pmremVersion;
|
|
3854
4050
|
|
|
3855
|
-
|
|
4051
|
+
pmremMaps.set( texture, renderTarget );
|
|
3856
4052
|
|
|
3857
4053
|
return renderTarget.texture;
|
|
3858
4054
|
|
|
@@ -3873,9 +4069,9 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3873
4069
|
renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
|
|
3874
4070
|
renderTarget.texture.pmremVersion = texture.pmremVersion;
|
|
3875
4071
|
|
|
3876
|
-
|
|
4072
|
+
pmremMaps.set( texture, renderTarget );
|
|
3877
4073
|
|
|
3878
|
-
texture.addEventListener( 'dispose',
|
|
4074
|
+
texture.addEventListener( 'dispose', onPMREMDispose );
|
|
3879
4075
|
|
|
3880
4076
|
return renderTarget.texture;
|
|
3881
4077
|
|
|
@@ -3899,6 +4095,22 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3899
4095
|
|
|
3900
4096
|
}
|
|
3901
4097
|
|
|
4098
|
+
function mapTextureMapping( texture, mapping ) {
|
|
4099
|
+
|
|
4100
|
+
if ( mapping === EquirectangularReflectionMapping ) {
|
|
4101
|
+
|
|
4102
|
+
texture.mapping = CubeReflectionMapping;
|
|
4103
|
+
|
|
4104
|
+
} else if ( mapping === EquirectangularRefractionMapping ) {
|
|
4105
|
+
|
|
4106
|
+
texture.mapping = CubeRefractionMapping;
|
|
4107
|
+
|
|
4108
|
+
}
|
|
4109
|
+
|
|
4110
|
+
return texture;
|
|
4111
|
+
|
|
4112
|
+
}
|
|
4113
|
+
|
|
3902
4114
|
function isCubeTextureComplete( image ) {
|
|
3903
4115
|
|
|
3904
4116
|
let count = 0;
|
|
@@ -3912,21 +4124,37 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3912
4124
|
|
|
3913
4125
|
return count === length;
|
|
3914
4126
|
|
|
4127
|
+
}
|
|
4128
|
+
|
|
4129
|
+
function onCubemapDispose( event ) {
|
|
4130
|
+
|
|
4131
|
+
const texture = event.target;
|
|
4132
|
+
|
|
4133
|
+
texture.removeEventListener( 'dispose', onCubemapDispose );
|
|
4134
|
+
|
|
4135
|
+
const cubemap = cubeMaps.get( texture );
|
|
4136
|
+
|
|
4137
|
+
if ( cubemap !== undefined ) {
|
|
4138
|
+
|
|
4139
|
+
cubeMaps.delete( texture );
|
|
4140
|
+
cubemap.dispose();
|
|
4141
|
+
|
|
4142
|
+
}
|
|
3915
4143
|
|
|
3916
4144
|
}
|
|
3917
4145
|
|
|
3918
|
-
function
|
|
4146
|
+
function onPMREMDispose( event ) {
|
|
3919
4147
|
|
|
3920
4148
|
const texture = event.target;
|
|
3921
4149
|
|
|
3922
|
-
texture.removeEventListener( 'dispose',
|
|
4150
|
+
texture.removeEventListener( 'dispose', onPMREMDispose );
|
|
3923
4151
|
|
|
3924
|
-
const
|
|
4152
|
+
const pmrem = pmremMaps.get( texture );
|
|
3925
4153
|
|
|
3926
|
-
if (
|
|
4154
|
+
if ( pmrem !== undefined ) {
|
|
3927
4155
|
|
|
3928
|
-
|
|
3929
|
-
|
|
4156
|
+
pmremMaps.delete( texture );
|
|
4157
|
+
pmrem.dispose();
|
|
3930
4158
|
|
|
3931
4159
|
}
|
|
3932
4160
|
|
|
@@ -3934,7 +4162,8 @@ function WebGLCubeUVMaps( renderer ) {
|
|
|
3934
4162
|
|
|
3935
4163
|
function dispose() {
|
|
3936
4164
|
|
|
3937
|
-
|
|
4165
|
+
cubeMaps = new WeakMap();
|
|
4166
|
+
pmremMaps = new WeakMap();
|
|
3938
4167
|
|
|
3939
4168
|
if ( pmremGenerator !== null ) {
|
|
3940
4169
|
|
|
@@ -4093,6 +4322,12 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
|
|
|
4093
4322
|
const geometryPosition = geometry.attributes.position;
|
|
4094
4323
|
let version = 0;
|
|
4095
4324
|
|
|
4325
|
+
if ( geometryPosition === undefined ) {
|
|
4326
|
+
|
|
4327
|
+
return;
|
|
4328
|
+
|
|
4329
|
+
}
|
|
4330
|
+
|
|
4096
4331
|
if ( geometryIndex !== null ) {
|
|
4097
4332
|
|
|
4098
4333
|
const array = geometryIndex.array;
|
|
@@ -4108,7 +4343,7 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
|
|
|
4108
4343
|
|
|
4109
4344
|
}
|
|
4110
4345
|
|
|
4111
|
-
} else
|
|
4346
|
+
} else {
|
|
4112
4347
|
|
|
4113
4348
|
const array = geometryPosition.array;
|
|
4114
4349
|
version = geometryPosition.version;
|
|
@@ -4123,13 +4358,11 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
|
|
|
4123
4358
|
|
|
4124
4359
|
}
|
|
4125
4360
|
|
|
4126
|
-
} else {
|
|
4127
|
-
|
|
4128
|
-
return;
|
|
4129
|
-
|
|
4130
4361
|
}
|
|
4131
4362
|
|
|
4132
|
-
|
|
4363
|
+
// check whether a 32 bit or 16 bit buffer is required to store the indices
|
|
4364
|
+
// account for PRIMITIVE_RESTART_FIXED_INDEX, #24565
|
|
4365
|
+
const attribute = new ( geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
|
|
4133
4366
|
attribute.version = version;
|
|
4134
4367
|
|
|
4135
4368
|
// Updating index buffer in VAO now. See WebGLBindingStates
|
|
@@ -4497,109 +4730,357 @@ function WebGLMorphtargets( gl, capabilities, textures ) {
|
|
|
4497
4730
|
const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
|
|
4498
4731
|
|
|
4499
4732
|
|
|
4500
|
-
program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
|
|
4501
|
-
program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
|
|
4733
|
+
program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
|
|
4734
|
+
program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
|
|
4735
|
+
|
|
4736
|
+
}
|
|
4737
|
+
|
|
4738
|
+
program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
|
|
4739
|
+
program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
|
|
4740
|
+
|
|
4741
|
+
}
|
|
4742
|
+
|
|
4743
|
+
return {
|
|
4744
|
+
|
|
4745
|
+
update: update
|
|
4746
|
+
|
|
4747
|
+
};
|
|
4748
|
+
|
|
4749
|
+
}
|
|
4750
|
+
|
|
4751
|
+
function WebGLObjects( gl, geometries, attributes, bindingStates, info ) {
|
|
4752
|
+
|
|
4753
|
+
let updateMap = new WeakMap();
|
|
4754
|
+
|
|
4755
|
+
function update( object ) {
|
|
4756
|
+
|
|
4757
|
+
const frame = info.render.frame;
|
|
4758
|
+
|
|
4759
|
+
const geometry = object.geometry;
|
|
4760
|
+
const buffergeometry = geometries.get( object, geometry );
|
|
4761
|
+
|
|
4762
|
+
// Update once per frame
|
|
4763
|
+
|
|
4764
|
+
if ( updateMap.get( buffergeometry ) !== frame ) {
|
|
4765
|
+
|
|
4766
|
+
geometries.update( buffergeometry );
|
|
4767
|
+
|
|
4768
|
+
updateMap.set( buffergeometry, frame );
|
|
4769
|
+
|
|
4770
|
+
}
|
|
4771
|
+
|
|
4772
|
+
if ( object.isInstancedMesh ) {
|
|
4773
|
+
|
|
4774
|
+
if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {
|
|
4775
|
+
|
|
4776
|
+
object.addEventListener( 'dispose', onInstancedMeshDispose );
|
|
4777
|
+
|
|
4778
|
+
}
|
|
4779
|
+
|
|
4780
|
+
if ( updateMap.get( object ) !== frame ) {
|
|
4781
|
+
|
|
4782
|
+
attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
|
|
4783
|
+
|
|
4784
|
+
if ( object.instanceColor !== null ) {
|
|
4785
|
+
|
|
4786
|
+
attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
|
|
4787
|
+
|
|
4788
|
+
}
|
|
4789
|
+
|
|
4790
|
+
updateMap.set( object, frame );
|
|
4791
|
+
|
|
4792
|
+
}
|
|
4793
|
+
|
|
4794
|
+
}
|
|
4795
|
+
|
|
4796
|
+
if ( object.isSkinnedMesh ) {
|
|
4797
|
+
|
|
4798
|
+
const skeleton = object.skeleton;
|
|
4799
|
+
|
|
4800
|
+
if ( updateMap.get( skeleton ) !== frame ) {
|
|
4801
|
+
|
|
4802
|
+
skeleton.update();
|
|
4803
|
+
|
|
4804
|
+
updateMap.set( skeleton, frame );
|
|
4805
|
+
|
|
4806
|
+
}
|
|
4807
|
+
|
|
4808
|
+
}
|
|
4809
|
+
|
|
4810
|
+
return buffergeometry;
|
|
4811
|
+
|
|
4812
|
+
}
|
|
4813
|
+
|
|
4814
|
+
function dispose() {
|
|
4815
|
+
|
|
4816
|
+
updateMap = new WeakMap();
|
|
4817
|
+
|
|
4818
|
+
}
|
|
4819
|
+
|
|
4820
|
+
function onInstancedMeshDispose( event ) {
|
|
4821
|
+
|
|
4822
|
+
const instancedMesh = event.target;
|
|
4823
|
+
|
|
4824
|
+
instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
|
|
4825
|
+
|
|
4826
|
+
bindingStates.releaseStatesOfObject( instancedMesh );
|
|
4827
|
+
|
|
4828
|
+
attributes.remove( instancedMesh.instanceMatrix );
|
|
4829
|
+
|
|
4830
|
+
if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
|
|
4831
|
+
|
|
4832
|
+
}
|
|
4833
|
+
|
|
4834
|
+
return {
|
|
4835
|
+
|
|
4836
|
+
update: update,
|
|
4837
|
+
dispose: dispose
|
|
4838
|
+
|
|
4839
|
+
};
|
|
4840
|
+
|
|
4841
|
+
}
|
|
4842
|
+
|
|
4843
|
+
const toneMappingMap = {
|
|
4844
|
+
[ LinearToneMapping ]: 'LINEAR_TONE_MAPPING',
|
|
4845
|
+
[ ReinhardToneMapping ]: 'REINHARD_TONE_MAPPING',
|
|
4846
|
+
[ CineonToneMapping ]: 'CINEON_TONE_MAPPING',
|
|
4847
|
+
[ ACESFilmicToneMapping ]: 'ACES_FILMIC_TONE_MAPPING',
|
|
4848
|
+
[ AgXToneMapping ]: 'AGX_TONE_MAPPING',
|
|
4849
|
+
[ NeutralToneMapping ]: 'NEUTRAL_TONE_MAPPING',
|
|
4850
|
+
[ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING'
|
|
4851
|
+
};
|
|
4852
|
+
|
|
4853
|
+
function WebGLOutput( type, width, height, depth, stencil ) {
|
|
4854
|
+
|
|
4855
|
+
// render targets for scene and post-processing
|
|
4856
|
+
const targetA = new WebGLRenderTarget( width, height, {
|
|
4857
|
+
type: type,
|
|
4858
|
+
depthBuffer: depth,
|
|
4859
|
+
stencilBuffer: stencil
|
|
4860
|
+
} );
|
|
4861
|
+
|
|
4862
|
+
const targetB = new WebGLRenderTarget( width, height, {
|
|
4863
|
+
type: HalfFloatType,
|
|
4864
|
+
depthBuffer: false,
|
|
4865
|
+
stencilBuffer: false
|
|
4866
|
+
} );
|
|
4867
|
+
|
|
4868
|
+
// create fullscreen triangle geometry
|
|
4869
|
+
const geometry = new BufferGeometry();
|
|
4870
|
+
geometry.setAttribute( 'position', new Float32BufferAttribute( [ -1, 3, 0, -1, -1, 0, 3, -1, 0 ], 3 ) );
|
|
4871
|
+
geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );
|
|
4872
|
+
|
|
4873
|
+
// create output material with tone mapping support
|
|
4874
|
+
const material = new RawShaderMaterial( {
|
|
4875
|
+
uniforms: {
|
|
4876
|
+
tDiffuse: { value: null }
|
|
4877
|
+
},
|
|
4878
|
+
vertexShader: /* glsl */`
|
|
4879
|
+
precision highp float;
|
|
4880
|
+
|
|
4881
|
+
uniform mat4 modelViewMatrix;
|
|
4882
|
+
uniform mat4 projectionMatrix;
|
|
4883
|
+
|
|
4884
|
+
attribute vec3 position;
|
|
4885
|
+
attribute vec2 uv;
|
|
4886
|
+
|
|
4887
|
+
varying vec2 vUv;
|
|
4888
|
+
|
|
4889
|
+
void main() {
|
|
4890
|
+
vUv = uv;
|
|
4891
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
4892
|
+
}`,
|
|
4893
|
+
fragmentShader: /* glsl */`
|
|
4894
|
+
precision highp float;
|
|
4895
|
+
|
|
4896
|
+
uniform sampler2D tDiffuse;
|
|
4897
|
+
|
|
4898
|
+
varying vec2 vUv;
|
|
4899
|
+
|
|
4900
|
+
#include <tonemapping_pars_fragment>
|
|
4901
|
+
#include <colorspace_pars_fragment>
|
|
4902
|
+
|
|
4903
|
+
void main() {
|
|
4904
|
+
gl_FragColor = texture2D( tDiffuse, vUv );
|
|
4905
|
+
|
|
4906
|
+
#ifdef LINEAR_TONE_MAPPING
|
|
4907
|
+
gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );
|
|
4908
|
+
#elif defined( REINHARD_TONE_MAPPING )
|
|
4909
|
+
gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );
|
|
4910
|
+
#elif defined( CINEON_TONE_MAPPING )
|
|
4911
|
+
gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );
|
|
4912
|
+
#elif defined( ACES_FILMIC_TONE_MAPPING )
|
|
4913
|
+
gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );
|
|
4914
|
+
#elif defined( AGX_TONE_MAPPING )
|
|
4915
|
+
gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );
|
|
4916
|
+
#elif defined( NEUTRAL_TONE_MAPPING )
|
|
4917
|
+
gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );
|
|
4918
|
+
#elif defined( CUSTOM_TONE_MAPPING )
|
|
4919
|
+
gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );
|
|
4920
|
+
#endif
|
|
4921
|
+
|
|
4922
|
+
#ifdef SRGB_TRANSFER
|
|
4923
|
+
gl_FragColor = sRGBTransferOETF( gl_FragColor );
|
|
4924
|
+
#endif
|
|
4925
|
+
}`,
|
|
4926
|
+
depthTest: false,
|
|
4927
|
+
depthWrite: false
|
|
4928
|
+
} );
|
|
4929
|
+
|
|
4930
|
+
const mesh = new Mesh( geometry, material );
|
|
4931
|
+
const camera = new OrthographicCamera( -1, 1, 1, -1, 0, 1 );
|
|
4932
|
+
|
|
4933
|
+
let _outputColorSpace = null;
|
|
4934
|
+
let _outputToneMapping = null;
|
|
4935
|
+
let _isCompositing = false;
|
|
4936
|
+
let _savedToneMapping;
|
|
4937
|
+
let _savedRenderTarget = null;
|
|
4938
|
+
let _effects = [];
|
|
4939
|
+
let _hasRenderPass = false;
|
|
4940
|
+
|
|
4941
|
+
this.setSize = function ( width, height ) {
|
|
4942
|
+
|
|
4943
|
+
targetA.setSize( width, height );
|
|
4944
|
+
targetB.setSize( width, height );
|
|
4945
|
+
|
|
4946
|
+
for ( let i = 0; i < _effects.length; i ++ ) {
|
|
4947
|
+
|
|
4948
|
+
const effect = _effects[ i ];
|
|
4949
|
+
if ( effect.setSize ) effect.setSize( width, height );
|
|
4950
|
+
|
|
4951
|
+
}
|
|
4952
|
+
|
|
4953
|
+
};
|
|
4954
|
+
|
|
4955
|
+
this.setEffects = function ( effects ) {
|
|
4502
4956
|
|
|
4503
|
-
|
|
4957
|
+
_effects = effects;
|
|
4958
|
+
_hasRenderPass = _effects.length > 0 && _effects[ 0 ].isRenderPass === true;
|
|
4504
4959
|
|
|
4505
|
-
|
|
4506
|
-
|
|
4960
|
+
const width = targetA.width;
|
|
4961
|
+
const height = targetA.height;
|
|
4507
4962
|
|
|
4508
|
-
|
|
4963
|
+
for ( let i = 0; i < _effects.length; i ++ ) {
|
|
4509
4964
|
|
|
4510
|
-
|
|
4965
|
+
const effect = _effects[ i ];
|
|
4966
|
+
if ( effect.setSize ) effect.setSize( width, height );
|
|
4511
4967
|
|
|
4512
|
-
|
|
4968
|
+
}
|
|
4513
4969
|
|
|
4514
4970
|
};
|
|
4515
4971
|
|
|
4516
|
-
|
|
4517
|
-
|
|
4518
|
-
function WebGLObjects( gl, geometries, attributes, info ) {
|
|
4972
|
+
this.begin = function ( renderer, renderTarget ) {
|
|
4519
4973
|
|
|
4520
|
-
|
|
4974
|
+
// Don't begin during compositing phase (post-processing effects call render())
|
|
4975
|
+
if ( _isCompositing ) return false;
|
|
4521
4976
|
|
|
4522
|
-
|
|
4977
|
+
if ( renderer.toneMapping === NoToneMapping && _effects.length === 0 ) return false;
|
|
4523
4978
|
|
|
4524
|
-
|
|
4979
|
+
_savedRenderTarget = renderTarget;
|
|
4525
4980
|
|
|
4526
|
-
|
|
4527
|
-
|
|
4981
|
+
// resize internal buffers to match render target (e.g. XR resolution)
|
|
4982
|
+
if ( renderTarget !== null ) {
|
|
4528
4983
|
|
|
4529
|
-
|
|
4984
|
+
const width = renderTarget.width;
|
|
4985
|
+
const height = renderTarget.height;
|
|
4530
4986
|
|
|
4531
|
-
|
|
4987
|
+
if ( targetA.width !== width || targetA.height !== height ) {
|
|
4532
4988
|
|
|
4533
|
-
|
|
4989
|
+
this.setSize( width, height );
|
|
4534
4990
|
|
|
4535
|
-
|
|
4991
|
+
}
|
|
4536
4992
|
|
|
4537
4993
|
}
|
|
4538
4994
|
|
|
4539
|
-
if
|
|
4995
|
+
// if first effect is a RenderPass, it will set its own render target
|
|
4996
|
+
if ( _hasRenderPass === false ) {
|
|
4540
4997
|
|
|
4541
|
-
|
|
4998
|
+
renderer.setRenderTarget( targetA );
|
|
4542
4999
|
|
|
4543
|
-
|
|
5000
|
+
}
|
|
4544
5001
|
|
|
4545
|
-
|
|
5002
|
+
// disable tone mapping during render - it will be applied in end()
|
|
5003
|
+
_savedToneMapping = renderer.toneMapping;
|
|
5004
|
+
renderer.toneMapping = NoToneMapping;
|
|
4546
5005
|
|
|
4547
|
-
|
|
5006
|
+
return true;
|
|
4548
5007
|
|
|
4549
|
-
|
|
5008
|
+
};
|
|
4550
5009
|
|
|
4551
|
-
|
|
5010
|
+
this.hasRenderPass = function () {
|
|
4552
5011
|
|
|
4553
|
-
|
|
5012
|
+
return _hasRenderPass;
|
|
4554
5013
|
|
|
4555
|
-
|
|
5014
|
+
};
|
|
4556
5015
|
|
|
4557
|
-
|
|
5016
|
+
this.end = function ( renderer, deltaTime ) {
|
|
4558
5017
|
|
|
4559
|
-
|
|
5018
|
+
// restore tone mapping
|
|
5019
|
+
renderer.toneMapping = _savedToneMapping;
|
|
4560
5020
|
|
|
4561
|
-
|
|
5021
|
+
_isCompositing = true;
|
|
4562
5022
|
|
|
4563
|
-
|
|
5023
|
+
// run post-processing effects
|
|
5024
|
+
let readBuffer = targetA;
|
|
5025
|
+
let writeBuffer = targetB;
|
|
4564
5026
|
|
|
4565
|
-
|
|
5027
|
+
for ( let i = 0; i < _effects.length; i ++ ) {
|
|
4566
5028
|
|
|
4567
|
-
|
|
5029
|
+
const effect = _effects[ i ];
|
|
4568
5030
|
|
|
4569
|
-
|
|
5031
|
+
if ( effect.enabled === false ) continue;
|
|
4570
5032
|
|
|
4571
|
-
|
|
5033
|
+
effect.render( renderer, writeBuffer, readBuffer, deltaTime );
|
|
5034
|
+
|
|
5035
|
+
if ( effect.needsSwap !== false ) {
|
|
5036
|
+
|
|
5037
|
+
const temp = readBuffer;
|
|
5038
|
+
readBuffer = writeBuffer;
|
|
5039
|
+
writeBuffer = temp;
|
|
4572
5040
|
|
|
4573
5041
|
}
|
|
4574
5042
|
|
|
4575
5043
|
}
|
|
4576
5044
|
|
|
4577
|
-
|
|
5045
|
+
// update output material defines if settings changed
|
|
5046
|
+
if ( _outputColorSpace !== renderer.outputColorSpace || _outputToneMapping !== renderer.toneMapping ) {
|
|
4578
5047
|
|
|
4579
|
-
|
|
5048
|
+
_outputColorSpace = renderer.outputColorSpace;
|
|
5049
|
+
_outputToneMapping = renderer.toneMapping;
|
|
4580
5050
|
|
|
4581
|
-
|
|
5051
|
+
material.defines = {};
|
|
4582
5052
|
|
|
4583
|
-
|
|
5053
|
+
if ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) material.defines.SRGB_TRANSFER = '';
|
|
4584
5054
|
|
|
4585
|
-
|
|
5055
|
+
const toneMapping = toneMappingMap[ _outputToneMapping ];
|
|
5056
|
+
if ( toneMapping ) material.defines[ toneMapping ] = '';
|
|
4586
5057
|
|
|
4587
|
-
|
|
5058
|
+
material.needsUpdate = true;
|
|
4588
5059
|
|
|
4589
|
-
|
|
5060
|
+
}
|
|
4590
5061
|
|
|
4591
|
-
|
|
5062
|
+
// final output to canvas (or XR render target)
|
|
5063
|
+
material.uniforms.tDiffuse.value = readBuffer.texture;
|
|
5064
|
+
renderer.setRenderTarget( _savedRenderTarget );
|
|
5065
|
+
renderer.render( mesh, camera );
|
|
4592
5066
|
|
|
4593
|
-
|
|
5067
|
+
_savedRenderTarget = null;
|
|
5068
|
+
_isCompositing = false;
|
|
4594
5069
|
|
|
4595
|
-
|
|
5070
|
+
};
|
|
4596
5071
|
|
|
4597
|
-
|
|
5072
|
+
this.isCompositing = function () {
|
|
4598
5073
|
|
|
4599
|
-
|
|
5074
|
+
return _isCompositing;
|
|
4600
5075
|
|
|
4601
|
-
|
|
4602
|
-
|
|
5076
|
+
};
|
|
5077
|
+
|
|
5078
|
+
this.dispose = function () {
|
|
5079
|
+
|
|
5080
|
+
targetA.dispose();
|
|
5081
|
+
targetB.dispose();
|
|
5082
|
+
geometry.dispose();
|
|
5083
|
+
material.dispose();
|
|
4603
5084
|
|
|
4604
5085
|
};
|
|
4605
5086
|
|
|
@@ -5173,7 +5654,7 @@ function setValueT1( gl, v, textures ) {
|
|
|
5173
5654
|
|
|
5174
5655
|
if ( this.type === gl.SAMPLER_2D_SHADOW ) {
|
|
5175
5656
|
|
|
5176
|
-
emptyShadowTexture.compareFunction = LessEqualCompare;
|
|
5657
|
+
emptyShadowTexture.compareFunction = textures.isReversedDepthBuffer() ? GreaterEqualCompare : LessEqualCompare;
|
|
5177
5658
|
emptyTexture2D = emptyShadowTexture;
|
|
5178
5659
|
|
|
5179
5660
|
} else {
|
|
@@ -5423,9 +5904,21 @@ function setValueT1Array( gl, v, textures ) {
|
|
|
5423
5904
|
|
|
5424
5905
|
}
|
|
5425
5906
|
|
|
5907
|
+
let emptyTexture2D;
|
|
5908
|
+
|
|
5909
|
+
if ( this.type === gl.SAMPLER_2D_SHADOW ) {
|
|
5910
|
+
|
|
5911
|
+
emptyTexture2D = emptyShadowTexture;
|
|
5912
|
+
|
|
5913
|
+
} else {
|
|
5914
|
+
|
|
5915
|
+
emptyTexture2D = emptyTexture;
|
|
5916
|
+
|
|
5917
|
+
}
|
|
5918
|
+
|
|
5426
5919
|
for ( let i = 0; i !== n; ++ i ) {
|
|
5427
5920
|
|
|
5428
|
-
textures.setTexture2D( v[ i ] ||
|
|
5921
|
+
textures.setTexture2D( v[ i ] || emptyTexture2D, units[ i ] );
|
|
5429
5922
|
|
|
5430
5923
|
}
|
|
5431
5924
|
|
|
@@ -5711,6 +6204,31 @@ class WebGLUniforms {
|
|
|
5711
6204
|
|
|
5712
6205
|
}
|
|
5713
6206
|
|
|
6207
|
+
// Sort uniforms to prioritize shadow samplers first (for optimal texture unit allocation)
|
|
6208
|
+
|
|
6209
|
+
const shadowSamplers = [];
|
|
6210
|
+
const otherUniforms = [];
|
|
6211
|
+
|
|
6212
|
+
for ( const u of this.seq ) {
|
|
6213
|
+
|
|
6214
|
+
if ( u.type === gl.SAMPLER_2D_SHADOW || u.type === gl.SAMPLER_CUBE_SHADOW || u.type === gl.SAMPLER_2D_ARRAY_SHADOW ) {
|
|
6215
|
+
|
|
6216
|
+
shadowSamplers.push( u );
|
|
6217
|
+
|
|
6218
|
+
} else {
|
|
6219
|
+
|
|
6220
|
+
otherUniforms.push( u );
|
|
6221
|
+
|
|
6222
|
+
}
|
|
6223
|
+
|
|
6224
|
+
}
|
|
6225
|
+
|
|
6226
|
+
if ( shadowSamplers.length > 0 ) {
|
|
6227
|
+
|
|
6228
|
+
this.seq = shadowSamplers.concat( otherUniforms );
|
|
6229
|
+
|
|
6230
|
+
}
|
|
6231
|
+
|
|
5714
6232
|
}
|
|
5715
6233
|
|
|
5716
6234
|
setValue( gl, name, value, textures ) {
|
|
@@ -5865,43 +6383,24 @@ function getTexelEncodingFunction( functionName, colorSpace ) {
|
|
|
5865
6383
|
|
|
5866
6384
|
}
|
|
5867
6385
|
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
5872
|
-
|
|
5873
|
-
|
|
5874
|
-
|
|
5875
|
-
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
case ReinhardToneMapping:
|
|
5879
|
-
toneMappingName = 'Reinhard';
|
|
5880
|
-
break;
|
|
5881
|
-
|
|
5882
|
-
case CineonToneMapping:
|
|
5883
|
-
toneMappingName = 'Cineon';
|
|
5884
|
-
break;
|
|
5885
|
-
|
|
5886
|
-
case ACESFilmicToneMapping:
|
|
5887
|
-
toneMappingName = 'ACESFilmic';
|
|
5888
|
-
break;
|
|
6386
|
+
const toneMappingFunctions = {
|
|
6387
|
+
[ LinearToneMapping ]: 'Linear',
|
|
6388
|
+
[ ReinhardToneMapping ]: 'Reinhard',
|
|
6389
|
+
[ CineonToneMapping ]: 'Cineon',
|
|
6390
|
+
[ ACESFilmicToneMapping ]: 'ACESFilmic',
|
|
6391
|
+
[ AgXToneMapping ]: 'AgX',
|
|
6392
|
+
[ NeutralToneMapping ]: 'Neutral',
|
|
6393
|
+
[ CustomToneMapping ]: 'Custom'
|
|
6394
|
+
};
|
|
5889
6395
|
|
|
5890
|
-
|
|
5891
|
-
toneMappingName = 'AgX';
|
|
5892
|
-
break;
|
|
6396
|
+
function getToneMappingFunction( functionName, toneMapping ) {
|
|
5893
6397
|
|
|
5894
|
-
|
|
5895
|
-
toneMappingName = 'Neutral';
|
|
5896
|
-
break;
|
|
6398
|
+
const toneMappingName = toneMappingFunctions[ toneMapping ];
|
|
5897
6399
|
|
|
5898
|
-
|
|
5899
|
-
toneMappingName = 'Custom';
|
|
5900
|
-
break;
|
|
6400
|
+
if ( toneMappingName === undefined ) {
|
|
5901
6401
|
|
|
5902
|
-
|
|
5903
|
-
|
|
5904
|
-
toneMappingName = 'Linear';
|
|
6402
|
+
warn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );
|
|
6403
|
+
return 'vec3 ' + functionName + '( vec3 color ) { return LinearToneMapping( color ); }';
|
|
5905
6404
|
|
|
5906
6405
|
}
|
|
5907
6406
|
|
|
@@ -6129,99 +6628,54 @@ function generatePrecision( parameters ) {
|
|
|
6129
6628
|
|
|
6130
6629
|
}
|
|
6131
6630
|
|
|
6132
|
-
|
|
6133
|
-
|
|
6134
|
-
|
|
6135
|
-
|
|
6136
|
-
if ( parameters.shadowMapType === PCFShadowMap ) {
|
|
6137
|
-
|
|
6138
|
-
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
|
|
6139
|
-
|
|
6140
|
-
} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
|
|
6141
|
-
|
|
6142
|
-
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
|
|
6143
|
-
|
|
6144
|
-
} else if ( parameters.shadowMapType === VSMShadowMap ) {
|
|
6145
|
-
|
|
6146
|
-
shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';
|
|
6631
|
+
const shadowMapTypeDefines = {
|
|
6632
|
+
[ PCFShadowMap ]: 'SHADOWMAP_TYPE_PCF',
|
|
6633
|
+
[ VSMShadowMap ]: 'SHADOWMAP_TYPE_VSM'
|
|
6634
|
+
};
|
|
6147
6635
|
|
|
6148
|
-
|
|
6636
|
+
function generateShadowMapTypeDefine( parameters ) {
|
|
6149
6637
|
|
|
6150
|
-
return
|
|
6638
|
+
return shadowMapTypeDefines[ parameters.shadowMapType ] || 'SHADOWMAP_TYPE_BASIC';
|
|
6151
6639
|
|
|
6152
6640
|
}
|
|
6153
6641
|
|
|
6154
|
-
|
|
6155
|
-
|
|
6156
|
-
|
|
6157
|
-
|
|
6158
|
-
|
|
6159
|
-
|
|
6160
|
-
switch ( parameters.envMapMode ) {
|
|
6161
|
-
|
|
6162
|
-
case CubeReflectionMapping:
|
|
6163
|
-
case CubeRefractionMapping:
|
|
6164
|
-
envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
6165
|
-
break;
|
|
6166
|
-
|
|
6167
|
-
case CubeUVReflectionMapping:
|
|
6168
|
-
envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
|
|
6169
|
-
break;
|
|
6642
|
+
const envMapTypeDefines = {
|
|
6643
|
+
[ CubeReflectionMapping ]: 'ENVMAP_TYPE_CUBE',
|
|
6644
|
+
[ CubeRefractionMapping ]: 'ENVMAP_TYPE_CUBE',
|
|
6645
|
+
[ CubeUVReflectionMapping ]: 'ENVMAP_TYPE_CUBE_UV'
|
|
6646
|
+
};
|
|
6170
6647
|
|
|
6171
|
-
|
|
6648
|
+
function generateEnvMapTypeDefine( parameters ) {
|
|
6172
6649
|
|
|
6173
|
-
|
|
6650
|
+
if ( parameters.envMap === false ) return 'ENVMAP_TYPE_CUBE';
|
|
6174
6651
|
|
|
6175
|
-
return
|
|
6652
|
+
return envMapTypeDefines[ parameters.envMapMode ] || 'ENVMAP_TYPE_CUBE';
|
|
6176
6653
|
|
|
6177
6654
|
}
|
|
6178
6655
|
|
|
6179
|
-
|
|
6180
|
-
|
|
6181
|
-
|
|
6182
|
-
|
|
6183
|
-
if ( parameters.envMap ) {
|
|
6184
|
-
|
|
6185
|
-
switch ( parameters.envMapMode ) {
|
|
6186
|
-
|
|
6187
|
-
case CubeRefractionMapping:
|
|
6188
|
-
|
|
6189
|
-
envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
|
|
6190
|
-
break;
|
|
6656
|
+
const envMapModeDefines = {
|
|
6657
|
+
[ CubeRefractionMapping ]: 'ENVMAP_MODE_REFRACTION'
|
|
6658
|
+
};
|
|
6191
6659
|
|
|
6192
|
-
|
|
6660
|
+
function generateEnvMapModeDefine( parameters ) {
|
|
6193
6661
|
|
|
6194
|
-
|
|
6662
|
+
if ( parameters.envMap === false ) return 'ENVMAP_MODE_REFLECTION';
|
|
6195
6663
|
|
|
6196
|
-
return
|
|
6664
|
+
return envMapModeDefines[ parameters.envMapMode ] || 'ENVMAP_MODE_REFLECTION';
|
|
6197
6665
|
|
|
6198
6666
|
}
|
|
6199
6667
|
|
|
6200
|
-
|
|
6201
|
-
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
switch ( parameters.combine ) {
|
|
6207
|
-
|
|
6208
|
-
case MultiplyOperation:
|
|
6209
|
-
envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
6210
|
-
break;
|
|
6211
|
-
|
|
6212
|
-
case MixOperation:
|
|
6213
|
-
envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
|
|
6214
|
-
break;
|
|
6215
|
-
|
|
6216
|
-
case AddOperation:
|
|
6217
|
-
envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
|
|
6218
|
-
break;
|
|
6668
|
+
const envMapBlendingDefines = {
|
|
6669
|
+
[ MultiplyOperation ]: 'ENVMAP_BLENDING_MULTIPLY',
|
|
6670
|
+
[ MixOperation ]: 'ENVMAP_BLENDING_MIX',
|
|
6671
|
+
[ AddOperation ]: 'ENVMAP_BLENDING_ADD'
|
|
6672
|
+
};
|
|
6219
6673
|
|
|
6220
|
-
|
|
6674
|
+
function generateEnvMapBlendingDefine( parameters ) {
|
|
6221
6675
|
|
|
6222
|
-
|
|
6676
|
+
if ( parameters.envMap === false ) return 'ENVMAP_BLENDING_NONE';
|
|
6223
6677
|
|
|
6224
|
-
return
|
|
6678
|
+
return envMapBlendingDefines[ parameters.combine ] || 'ENVMAP_BLENDING_NONE';
|
|
6225
6679
|
|
|
6226
6680
|
}
|
|
6227
6681
|
|
|
@@ -6583,8 +7037,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
6583
7037
|
parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
|
|
6584
7038
|
|
|
6585
7039
|
parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',
|
|
6586
|
-
parameters.vertexColors || parameters.instancingColor
|
|
6587
|
-
parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
|
|
7040
|
+
parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',
|
|
7041
|
+
parameters.vertexAlphas || parameters.batchingColor ? '#define USE_COLOR_ALPHA' : '',
|
|
6588
7042
|
parameters.vertexUv1s ? '#define USE_UV1' : '',
|
|
6589
7043
|
parameters.vertexUv2s ? '#define USE_UV2' : '',
|
|
6590
7044
|
parameters.vertexUv3s ? '#define USE_UV3' : '',
|
|
@@ -7000,21 +7454,21 @@ class WebGLShaderStage {
|
|
|
7000
7454
|
|
|
7001
7455
|
}
|
|
7002
7456
|
|
|
7003
|
-
function WebGLPrograms( renderer,
|
|
7457
|
+
function WebGLPrograms( renderer, environments, extensions, capabilities, bindingStates, clipping ) {
|
|
7004
7458
|
|
|
7005
7459
|
const _programLayers = new Layers();
|
|
7006
7460
|
const _customShaders = new WebGLShaderCache();
|
|
7007
7461
|
const _activeChannels = new Set();
|
|
7008
7462
|
const programs = [];
|
|
7463
|
+
const programsMap = new Map();
|
|
7009
7464
|
|
|
7010
7465
|
const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
|
|
7011
|
-
const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
|
|
7012
7466
|
|
|
7013
7467
|
let precision = capabilities.precision;
|
|
7014
7468
|
|
|
7015
7469
|
const shaderIDs = {
|
|
7016
7470
|
MeshDepthMaterial: 'depth',
|
|
7017
|
-
MeshDistanceMaterial: '
|
|
7471
|
+
MeshDistanceMaterial: 'distance',
|
|
7018
7472
|
MeshNormalMaterial: 'normal',
|
|
7019
7473
|
MeshBasicMaterial: 'basic',
|
|
7020
7474
|
MeshLambertMaterial: 'lambert',
|
|
@@ -7044,9 +7498,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7044
7498
|
|
|
7045
7499
|
const fog = scene.fog;
|
|
7046
7500
|
const geometry = object.geometry;
|
|
7047
|
-
const environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
7501
|
+
const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null;
|
|
7048
7502
|
|
|
7049
|
-
const
|
|
7503
|
+
const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap );
|
|
7504
|
+
const envMap = environments.get( material.envMap || environment, usePMREM );
|
|
7050
7505
|
const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;
|
|
7051
7506
|
|
|
7052
7507
|
const shaderID = shaderIDs[ material.type ];
|
|
@@ -7193,7 +7648,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7193
7648
|
instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,
|
|
7194
7649
|
instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,
|
|
7195
7650
|
|
|
7196
|
-
supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,
|
|
7197
7651
|
outputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),
|
|
7198
7652
|
alphaToCoverage: !! material.alphaToCoverage,
|
|
7199
7653
|
|
|
@@ -7206,7 +7660,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7206
7660
|
lightMap: HAS_LIGHTMAP,
|
|
7207
7661
|
bumpMap: HAS_BUMPMAP,
|
|
7208
7662
|
normalMap: HAS_NORMALMAP,
|
|
7209
|
-
displacementMap:
|
|
7663
|
+
displacementMap: HAS_DISPLACEMENTMAP,
|
|
7210
7664
|
emissiveMap: HAS_EMISSIVEMAP,
|
|
7211
7665
|
|
|
7212
7666
|
normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,
|
|
@@ -7304,7 +7758,12 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7304
7758
|
useFog: material.fog === true,
|
|
7305
7759
|
fogExp2: ( !! fog && fog.isFogExp2 ),
|
|
7306
7760
|
|
|
7307
|
-
flatShading:
|
|
7761
|
+
flatShading: material.wireframe === false && (
|
|
7762
|
+
material.flatShading === true ||
|
|
7763
|
+
( geometry.attributes.normal === undefined && HAS_NORMALMAP === false &&
|
|
7764
|
+
( material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isMeshPhysicalMaterial )
|
|
7765
|
+
)
|
|
7766
|
+
),
|
|
7308
7767
|
|
|
7309
7768
|
sizeAttenuation: material.sizeAttenuation === true,
|
|
7310
7769
|
logarithmicDepthBuffer: logarithmicDepthBuffer,
|
|
@@ -7480,54 +7939,52 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7480
7939
|
|
|
7481
7940
|
_programLayers.disableAll();
|
|
7482
7941
|
|
|
7483
|
-
if ( parameters.supportsVertexTextures )
|
|
7484
|
-
_programLayers.enable( 0 );
|
|
7485
7942
|
if ( parameters.instancing )
|
|
7486
|
-
_programLayers.enable(
|
|
7943
|
+
_programLayers.enable( 0 );
|
|
7487
7944
|
if ( parameters.instancingColor )
|
|
7488
|
-
_programLayers.enable(
|
|
7945
|
+
_programLayers.enable( 1 );
|
|
7489
7946
|
if ( parameters.instancingMorph )
|
|
7490
|
-
_programLayers.enable(
|
|
7947
|
+
_programLayers.enable( 2 );
|
|
7491
7948
|
if ( parameters.matcap )
|
|
7492
|
-
_programLayers.enable(
|
|
7949
|
+
_programLayers.enable( 3 );
|
|
7493
7950
|
if ( parameters.envMap )
|
|
7494
|
-
_programLayers.enable(
|
|
7951
|
+
_programLayers.enable( 4 );
|
|
7495
7952
|
if ( parameters.normalMapObjectSpace )
|
|
7496
|
-
_programLayers.enable(
|
|
7953
|
+
_programLayers.enable( 5 );
|
|
7497
7954
|
if ( parameters.normalMapTangentSpace )
|
|
7498
|
-
_programLayers.enable(
|
|
7955
|
+
_programLayers.enable( 6 );
|
|
7499
7956
|
if ( parameters.clearcoat )
|
|
7500
|
-
_programLayers.enable(
|
|
7957
|
+
_programLayers.enable( 7 );
|
|
7501
7958
|
if ( parameters.iridescence )
|
|
7502
|
-
_programLayers.enable(
|
|
7959
|
+
_programLayers.enable( 8 );
|
|
7503
7960
|
if ( parameters.alphaTest )
|
|
7504
|
-
_programLayers.enable(
|
|
7961
|
+
_programLayers.enable( 9 );
|
|
7505
7962
|
if ( parameters.vertexColors )
|
|
7506
|
-
_programLayers.enable(
|
|
7963
|
+
_programLayers.enable( 10 );
|
|
7507
7964
|
if ( parameters.vertexAlphas )
|
|
7508
|
-
_programLayers.enable(
|
|
7965
|
+
_programLayers.enable( 11 );
|
|
7509
7966
|
if ( parameters.vertexUv1s )
|
|
7510
|
-
_programLayers.enable(
|
|
7967
|
+
_programLayers.enable( 12 );
|
|
7511
7968
|
if ( parameters.vertexUv2s )
|
|
7512
|
-
_programLayers.enable(
|
|
7969
|
+
_programLayers.enable( 13 );
|
|
7513
7970
|
if ( parameters.vertexUv3s )
|
|
7514
|
-
_programLayers.enable(
|
|
7971
|
+
_programLayers.enable( 14 );
|
|
7515
7972
|
if ( parameters.vertexTangents )
|
|
7516
|
-
_programLayers.enable(
|
|
7973
|
+
_programLayers.enable( 15 );
|
|
7517
7974
|
if ( parameters.anisotropy )
|
|
7518
|
-
_programLayers.enable(
|
|
7975
|
+
_programLayers.enable( 16 );
|
|
7519
7976
|
if ( parameters.alphaHash )
|
|
7520
|
-
_programLayers.enable(
|
|
7977
|
+
_programLayers.enable( 17 );
|
|
7521
7978
|
if ( parameters.batching )
|
|
7522
|
-
_programLayers.enable(
|
|
7979
|
+
_programLayers.enable( 18 );
|
|
7523
7980
|
if ( parameters.dispersion )
|
|
7524
|
-
_programLayers.enable(
|
|
7981
|
+
_programLayers.enable( 19 );
|
|
7525
7982
|
if ( parameters.batchingColor )
|
|
7526
|
-
_programLayers.enable(
|
|
7983
|
+
_programLayers.enable( 20 );
|
|
7527
7984
|
if ( parameters.gradientMap )
|
|
7528
|
-
_programLayers.enable(
|
|
7985
|
+
_programLayers.enable( 21 );
|
|
7529
7986
|
if ( parameters.batchingMatrix )
|
|
7530
|
-
_programLayers.enable(
|
|
7987
|
+
_programLayers.enable( 22 );
|
|
7531
7988
|
|
|
7532
7989
|
array.push( _programLayers.mask );
|
|
7533
7990
|
_programLayers.disableAll();
|
|
@@ -7603,29 +8060,19 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7603
8060
|
|
|
7604
8061
|
function acquireProgram( parameters, cacheKey ) {
|
|
7605
8062
|
|
|
7606
|
-
let program;
|
|
7607
|
-
|
|
7608
|
-
// Check if code has been already compiled
|
|
7609
|
-
for ( let p = 0, pl = programs.length; p < pl; p ++ ) {
|
|
7610
|
-
|
|
7611
|
-
const preexistingProgram = programs[ p ];
|
|
7612
|
-
|
|
7613
|
-
if ( preexistingProgram.cacheKey === cacheKey ) {
|
|
7614
|
-
|
|
7615
|
-
program = preexistingProgram;
|
|
7616
|
-
++ program.usedTimes;
|
|
8063
|
+
let program = programsMap.get( cacheKey );
|
|
7617
8064
|
|
|
7618
|
-
|
|
7619
|
-
|
|
7620
|
-
}
|
|
8065
|
+
if ( program !== undefined ) {
|
|
7621
8066
|
|
|
7622
|
-
|
|
8067
|
+
++ program.usedTimes;
|
|
7623
8068
|
|
|
7624
|
-
|
|
8069
|
+
} else {
|
|
7625
8070
|
|
|
7626
8071
|
program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );
|
|
7627
8072
|
programs.push( program );
|
|
7628
8073
|
|
|
8074
|
+
programsMap.set( cacheKey, program );
|
|
8075
|
+
|
|
7629
8076
|
}
|
|
7630
8077
|
|
|
7631
8078
|
return program;
|
|
@@ -7641,6 +8088,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
7641
8088
|
programs[ i ] = programs[ programs.length - 1 ];
|
|
7642
8089
|
programs.pop();
|
|
7643
8090
|
|
|
8091
|
+
// Remove from map
|
|
8092
|
+
programsMap.delete( program.cacheKey );
|
|
8093
|
+
|
|
7644
8094
|
// Free WebGL resources
|
|
7645
8095
|
program.destroy();
|
|
7646
8096
|
|
|
@@ -7741,6 +8191,10 @@ function painterSortStable( a, b ) {
|
|
|
7741
8191
|
|
|
7742
8192
|
return a.material.id - b.material.id;
|
|
7743
8193
|
|
|
8194
|
+
} else if ( a.materialVariant !== b.materialVariant ) {
|
|
8195
|
+
|
|
8196
|
+
return a.materialVariant - b.materialVariant;
|
|
8197
|
+
|
|
7744
8198
|
} else if ( a.z !== b.z ) {
|
|
7745
8199
|
|
|
7746
8200
|
return a.z - b.z;
|
|
@@ -7795,6 +8249,15 @@ function WebGLRenderList() {
|
|
|
7795
8249
|
|
|
7796
8250
|
}
|
|
7797
8251
|
|
|
8252
|
+
function materialVariant( object ) {
|
|
8253
|
+
|
|
8254
|
+
let variant = 0;
|
|
8255
|
+
if ( object.isInstancedMesh ) variant += 2;
|
|
8256
|
+
if ( object.isSkinnedMesh ) variant += 1;
|
|
8257
|
+
return variant;
|
|
8258
|
+
|
|
8259
|
+
}
|
|
8260
|
+
|
|
7798
8261
|
function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
|
|
7799
8262
|
|
|
7800
8263
|
let renderItem = renderItems[ renderItemsIndex ];
|
|
@@ -7806,6 +8269,7 @@ function WebGLRenderList() {
|
|
|
7806
8269
|
object: object,
|
|
7807
8270
|
geometry: geometry,
|
|
7808
8271
|
material: material,
|
|
8272
|
+
materialVariant: materialVariant( object ),
|
|
7809
8273
|
groupOrder: groupOrder,
|
|
7810
8274
|
renderOrder: object.renderOrder,
|
|
7811
8275
|
z: z,
|
|
@@ -7820,6 +8284,7 @@ function WebGLRenderList() {
|
|
|
7820
8284
|
renderItem.object = object;
|
|
7821
8285
|
renderItem.geometry = geometry;
|
|
7822
8286
|
renderItem.material = material;
|
|
8287
|
+
renderItem.materialVariant = materialVariant( object );
|
|
7823
8288
|
renderItem.groupOrder = groupOrder;
|
|
7824
8289
|
renderItem.renderOrder = object.renderOrder;
|
|
7825
8290
|
renderItem.z = z;
|
|
@@ -8198,7 +8663,23 @@ function WebGLLights( extensions ) {
|
|
|
8198
8663
|
const intensity = light.intensity;
|
|
8199
8664
|
const distance = light.distance;
|
|
8200
8665
|
|
|
8201
|
-
|
|
8666
|
+
let shadowMap = null;
|
|
8667
|
+
|
|
8668
|
+
if ( light.shadow && light.shadow.map ) {
|
|
8669
|
+
|
|
8670
|
+
if ( light.shadow.map.texture.format === RGFormat ) {
|
|
8671
|
+
|
|
8672
|
+
// VSM uses color texture with blurred mean/std_dev
|
|
8673
|
+
shadowMap = light.shadow.map.texture;
|
|
8674
|
+
|
|
8675
|
+
} else {
|
|
8676
|
+
|
|
8677
|
+
// Other types use depth texture
|
|
8678
|
+
shadowMap = light.shadow.map.depthTexture || light.shadow.map.texture;
|
|
8679
|
+
|
|
8680
|
+
}
|
|
8681
|
+
|
|
8682
|
+
}
|
|
8202
8683
|
|
|
8203
8684
|
if ( light.isAmbientLight ) {
|
|
8204
8685
|
|
|
@@ -8633,7 +9114,21 @@ function WebGLRenderStates( extensions ) {
|
|
|
8633
9114
|
|
|
8634
9115
|
const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}";
|
|
8635
9116
|
|
|
8636
|
-
const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\
|
|
9117
|
+
const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}";
|
|
9118
|
+
|
|
9119
|
+
const _cubeDirections = [
|
|
9120
|
+
/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),
|
|
9121
|
+
/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, -1 )
|
|
9122
|
+
];
|
|
9123
|
+
|
|
9124
|
+
const _cubeUps = [
|
|
9125
|
+
/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),
|
|
9126
|
+
/*@__PURE__*/ new Vector3( 0, 0, -1 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 )
|
|
9127
|
+
];
|
|
9128
|
+
|
|
9129
|
+
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
9130
|
+
const _lightPositionWorld = /*@__PURE__*/ new Vector3();
|
|
9131
|
+
const _lookTarget = /*@__PURE__*/ new Vector3();
|
|
8637
9132
|
|
|
8638
9133
|
function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
8639
9134
|
|
|
@@ -8644,7 +9139,7 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
8644
9139
|
|
|
8645
9140
|
_viewport = new Vector4(),
|
|
8646
9141
|
|
|
8647
|
-
_depthMaterial = new MeshDepthMaterial(
|
|
9142
|
+
_depthMaterial = new MeshDepthMaterial(),
|
|
8648
9143
|
_distanceMaterial = new MeshDistanceMaterial(),
|
|
8649
9144
|
|
|
8650
9145
|
_materialCache = {},
|
|
@@ -8699,6 +9194,13 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
8699
9194
|
|
|
8700
9195
|
if ( lights.length === 0 ) return;
|
|
8701
9196
|
|
|
9197
|
+
if ( this.type === PCFSoftShadowMap ) {
|
|
9198
|
+
|
|
9199
|
+
warn( 'WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead.' );
|
|
9200
|
+
this.type = PCFShadowMap;
|
|
9201
|
+
|
|
9202
|
+
}
|
|
9203
|
+
|
|
8702
9204
|
const currentRenderTarget = renderer.getRenderTarget();
|
|
8703
9205
|
const activeCubeFace = renderer.getActiveCubeFace();
|
|
8704
9206
|
const activeMipmapLevel = renderer.getActiveMipmapLevel();
|
|
@@ -8714,17 +9216,40 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
8714
9216
|
|
|
8715
9217
|
} else {
|
|
8716
9218
|
|
|
8717
|
-
_state.buffers.color.setClear( 1, 1, 1, 1 );
|
|
9219
|
+
_state.buffers.color.setClear( 1, 1, 1, 1 );
|
|
9220
|
+
|
|
9221
|
+
}
|
|
9222
|
+
|
|
9223
|
+
_state.buffers.depth.setTest( true );
|
|
9224
|
+
_state.setScissorTest( false );
|
|
9225
|
+
|
|
9226
|
+
// check for shadow map type changes
|
|
9227
|
+
|
|
9228
|
+
const typeChanged = _previousType !== this.type;
|
|
9229
|
+
|
|
9230
|
+
// When shadow map type changes, materials need recompilation because sampler types change
|
|
9231
|
+
// (sampler2DShadow for PCF vs sampler2D for Basic)
|
|
9232
|
+
if ( typeChanged ) {
|
|
9233
|
+
|
|
9234
|
+
scene.traverse( function ( object ) {
|
|
9235
|
+
|
|
9236
|
+
if ( object.material ) {
|
|
9237
|
+
|
|
9238
|
+
if ( Array.isArray( object.material ) ) {
|
|
9239
|
+
|
|
9240
|
+
object.material.forEach( mat => mat.needsUpdate = true );
|
|
9241
|
+
|
|
9242
|
+
} else {
|
|
9243
|
+
|
|
9244
|
+
object.material.needsUpdate = true;
|
|
8718
9245
|
|
|
8719
|
-
|
|
9246
|
+
}
|
|
8720
9247
|
|
|
8721
|
-
|
|
8722
|
-
_state.setScissorTest( false );
|
|
9248
|
+
}
|
|
8723
9249
|
|
|
8724
|
-
|
|
9250
|
+
} );
|
|
8725
9251
|
|
|
8726
|
-
|
|
8727
|
-
const fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );
|
|
9252
|
+
}
|
|
8728
9253
|
|
|
8729
9254
|
// render depth map
|
|
8730
9255
|
|
|
@@ -8770,42 +9295,154 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
8770
9295
|
|
|
8771
9296
|
}
|
|
8772
9297
|
|
|
8773
|
-
|
|
9298
|
+
const reversedDepthBuffer = renderer.state.buffers.depth.getReversed();
|
|
9299
|
+
shadow.camera._reversedDepth = reversedDepthBuffer;
|
|
8774
9300
|
|
|
8775
|
-
|
|
9301
|
+
if ( shadow.map === null || typeChanged === true ) {
|
|
8776
9302
|
|
|
8777
9303
|
if ( shadow.map !== null ) {
|
|
8778
9304
|
|
|
9305
|
+
if ( shadow.map.depthTexture !== null ) {
|
|
9306
|
+
|
|
9307
|
+
shadow.map.depthTexture.dispose();
|
|
9308
|
+
shadow.map.depthTexture = null;
|
|
9309
|
+
|
|
9310
|
+
}
|
|
9311
|
+
|
|
8779
9312
|
shadow.map.dispose();
|
|
8780
9313
|
|
|
8781
9314
|
}
|
|
8782
9315
|
|
|
8783
|
-
|
|
8784
|
-
|
|
9316
|
+
if ( this.type === VSMShadowMap ) {
|
|
9317
|
+
|
|
9318
|
+
if ( light.isPointLight ) {
|
|
9319
|
+
|
|
9320
|
+
warn( 'WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.' );
|
|
9321
|
+
continue;
|
|
9322
|
+
|
|
9323
|
+
}
|
|
9324
|
+
|
|
9325
|
+
shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {
|
|
9326
|
+
format: RGFormat,
|
|
9327
|
+
type: HalfFloatType,
|
|
9328
|
+
minFilter: LinearFilter,
|
|
9329
|
+
magFilter: LinearFilter,
|
|
9330
|
+
generateMipmaps: false
|
|
9331
|
+
} );
|
|
9332
|
+
shadow.map.texture.name = light.name + '.shadowMap';
|
|
9333
|
+
|
|
9334
|
+
// Native depth texture for VSM - depth is captured here, then blurred into the color texture
|
|
9335
|
+
shadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, FloatType );
|
|
9336
|
+
shadow.map.depthTexture.name = light.name + '.shadowMapDepth';
|
|
9337
|
+
shadow.map.depthTexture.format = DepthFormat;
|
|
9338
|
+
shadow.map.depthTexture.compareFunction = null; // For regular sampling (not shadow comparison)
|
|
9339
|
+
shadow.map.depthTexture.minFilter = NearestFilter;
|
|
9340
|
+
shadow.map.depthTexture.magFilter = NearestFilter;
|
|
9341
|
+
|
|
9342
|
+
} else {
|
|
9343
|
+
|
|
9344
|
+
if ( light.isPointLight ) {
|
|
9345
|
+
|
|
9346
|
+
shadow.map = new WebGLCubeRenderTarget( _shadowMapSize.x );
|
|
9347
|
+
shadow.map.depthTexture = new CubeDepthTexture( _shadowMapSize.x, UnsignedIntType );
|
|
9348
|
+
|
|
9349
|
+
} else {
|
|
9350
|
+
|
|
9351
|
+
shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );
|
|
9352
|
+
shadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, UnsignedIntType );
|
|
9353
|
+
|
|
9354
|
+
}
|
|
9355
|
+
|
|
9356
|
+
shadow.map.depthTexture.name = light.name + '.shadowMap';
|
|
9357
|
+
shadow.map.depthTexture.format = DepthFormat;
|
|
9358
|
+
|
|
9359
|
+
if ( this.type === PCFShadowMap ) {
|
|
9360
|
+
|
|
9361
|
+
shadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
|
|
9362
|
+
shadow.map.depthTexture.minFilter = LinearFilter;
|
|
9363
|
+
shadow.map.depthTexture.magFilter = LinearFilter;
|
|
9364
|
+
|
|
9365
|
+
} else {
|
|
9366
|
+
|
|
9367
|
+
shadow.map.depthTexture.compareFunction = null;
|
|
9368
|
+
shadow.map.depthTexture.minFilter = NearestFilter;
|
|
9369
|
+
shadow.map.depthTexture.magFilter = NearestFilter;
|
|
9370
|
+
|
|
9371
|
+
}
|
|
9372
|
+
|
|
9373
|
+
}
|
|
8785
9374
|
|
|
8786
9375
|
shadow.camera.updateProjectionMatrix();
|
|
8787
9376
|
|
|
8788
9377
|
}
|
|
8789
9378
|
|
|
8790
|
-
|
|
8791
|
-
|
|
9379
|
+
// For cube render targets (PointLights), render all 6 faces. Otherwise, render once.
|
|
9380
|
+
const faceCount = shadow.map.isWebGLCubeRenderTarget ? 6 : 1;
|
|
8792
9381
|
|
|
8793
|
-
|
|
9382
|
+
for ( let face = 0; face < faceCount; face ++ ) {
|
|
8794
9383
|
|
|
8795
|
-
|
|
9384
|
+
// For cube render targets, render to each face separately
|
|
9385
|
+
if ( shadow.map.isWebGLCubeRenderTarget ) {
|
|
8796
9386
|
|
|
8797
|
-
|
|
9387
|
+
renderer.setRenderTarget( shadow.map, face );
|
|
9388
|
+
renderer.clear();
|
|
8798
9389
|
|
|
8799
|
-
|
|
8800
|
-
|
|
8801
|
-
|
|
8802
|
-
|
|
8803
|
-
|
|
8804
|
-
|
|
9390
|
+
} else {
|
|
9391
|
+
|
|
9392
|
+
// For 2D render targets, use viewports
|
|
9393
|
+
if ( face === 0 ) {
|
|
9394
|
+
|
|
9395
|
+
renderer.setRenderTarget( shadow.map );
|
|
9396
|
+
renderer.clear();
|
|
9397
|
+
|
|
9398
|
+
}
|
|
9399
|
+
|
|
9400
|
+
const viewport = shadow.getViewport( face );
|
|
9401
|
+
|
|
9402
|
+
_viewport.set(
|
|
9403
|
+
_viewportSize.x * viewport.x,
|
|
9404
|
+
_viewportSize.y * viewport.y,
|
|
9405
|
+
_viewportSize.x * viewport.z,
|
|
9406
|
+
_viewportSize.y * viewport.w
|
|
9407
|
+
);
|
|
9408
|
+
|
|
9409
|
+
_state.viewport( _viewport );
|
|
9410
|
+
|
|
9411
|
+
}
|
|
9412
|
+
|
|
9413
|
+
if ( light.isPointLight ) {
|
|
9414
|
+
|
|
9415
|
+
const camera = shadow.camera;
|
|
9416
|
+
const shadowMatrix = shadow.matrix;
|
|
9417
|
+
|
|
9418
|
+
const far = light.distance || camera.far;
|
|
9419
|
+
|
|
9420
|
+
if ( far !== camera.far ) {
|
|
9421
|
+
|
|
9422
|
+
camera.far = far;
|
|
9423
|
+
camera.updateProjectionMatrix();
|
|
9424
|
+
|
|
9425
|
+
}
|
|
9426
|
+
|
|
9427
|
+
_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
9428
|
+
camera.position.copy( _lightPositionWorld );
|
|
9429
|
+
|
|
9430
|
+
_lookTarget.copy( camera.position );
|
|
9431
|
+
_lookTarget.add( _cubeDirections[ face ] );
|
|
9432
|
+
camera.up.copy( _cubeUps[ face ] );
|
|
9433
|
+
camera.lookAt( _lookTarget );
|
|
9434
|
+
camera.updateMatrixWorld();
|
|
9435
|
+
|
|
9436
|
+
shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
|
|
9437
|
+
|
|
9438
|
+
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
9439
|
+
shadow._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
|
|
9440
|
+
|
|
9441
|
+
} else {
|
|
8805
9442
|
|
|
8806
|
-
|
|
9443
|
+
shadow.updateMatrices( light );
|
|
8807
9444
|
|
|
8808
|
-
|
|
9445
|
+
}
|
|
8809
9446
|
|
|
8810
9447
|
_frustum = shadow.getFrustum();
|
|
8811
9448
|
|
|
@@ -8849,13 +9486,16 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
8849
9486
|
|
|
8850
9487
|
if ( shadow.mapPass === null ) {
|
|
8851
9488
|
|
|
8852
|
-
shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y
|
|
9489
|
+
shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {
|
|
9490
|
+
format: RGFormat,
|
|
9491
|
+
type: HalfFloatType
|
|
9492
|
+
} );
|
|
8853
9493
|
|
|
8854
9494
|
}
|
|
8855
9495
|
|
|
8856
|
-
// vertical pass
|
|
9496
|
+
// vertical pass - read from native depth texture
|
|
8857
9497
|
|
|
8858
|
-
shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.
|
|
9498
|
+
shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.depthTexture;
|
|
8859
9499
|
shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;
|
|
8860
9500
|
shadowMaterialVertical.uniforms.radius.value = shadow.radius;
|
|
8861
9501
|
renderer.setRenderTarget( shadow.mapPass );
|
|
@@ -9054,18 +9694,6 @@ function WebGLShadowMap( renderer, objects, capabilities ) {
|
|
|
9054
9694
|
|
|
9055
9695
|
}
|
|
9056
9696
|
|
|
9057
|
-
const reversedFuncs = {
|
|
9058
|
-
[ NeverDepth ]: AlwaysDepth,
|
|
9059
|
-
[ LessDepth ]: GreaterDepth,
|
|
9060
|
-
[ EqualDepth ]: NotEqualDepth,
|
|
9061
|
-
[ LessEqualDepth ]: GreaterEqualDepth,
|
|
9062
|
-
|
|
9063
|
-
[ AlwaysDepth ]: NeverDepth,
|
|
9064
|
-
[ GreaterDepth ]: LessDepth,
|
|
9065
|
-
[ NotEqualDepth ]: EqualDepth,
|
|
9066
|
-
[ GreaterEqualDepth ]: LessEqualDepth,
|
|
9067
|
-
};
|
|
9068
|
-
|
|
9069
9697
|
function WebGLState( gl, extensions ) {
|
|
9070
9698
|
|
|
9071
9699
|
function ColorBuffer() {
|
|
@@ -9197,7 +9825,7 @@ function WebGLState( gl, extensions ) {
|
|
|
9197
9825
|
|
|
9198
9826
|
setFunc: function ( depthFunc ) {
|
|
9199
9827
|
|
|
9200
|
-
if ( currentReversed ) depthFunc =
|
|
9828
|
+
if ( currentReversed ) depthFunc = ReversedDepthFuncs[ depthFunc ];
|
|
9201
9829
|
|
|
9202
9830
|
if ( currentDepthFunc !== depthFunc ) {
|
|
9203
9831
|
|
|
@@ -9265,6 +9893,8 @@ function WebGLState( gl, extensions ) {
|
|
|
9265
9893
|
|
|
9266
9894
|
if ( currentDepthClear !== depth ) {
|
|
9267
9895
|
|
|
9896
|
+
currentDepthClear = depth;
|
|
9897
|
+
|
|
9268
9898
|
if ( currentReversed ) {
|
|
9269
9899
|
|
|
9270
9900
|
depth = 1 - depth;
|
|
@@ -9272,7 +9902,6 @@ function WebGLState( gl, extensions ) {
|
|
|
9272
9902
|
}
|
|
9273
9903
|
|
|
9274
9904
|
gl.clearDepth( depth );
|
|
9275
|
-
currentDepthClear = depth;
|
|
9276
9905
|
|
|
9277
9906
|
}
|
|
9278
9907
|
|
|
@@ -9926,11 +10555,17 @@ function WebGLState( gl, extensions ) {
|
|
|
9926
10555
|
|
|
9927
10556
|
if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {
|
|
9928
10557
|
|
|
9929
|
-
gl.polygonOffset( factor, units );
|
|
9930
|
-
|
|
9931
10558
|
currentPolygonOffsetFactor = factor;
|
|
9932
10559
|
currentPolygonOffsetUnits = units;
|
|
9933
10560
|
|
|
10561
|
+
if ( depthBuffer.getReversed() ) {
|
|
10562
|
+
|
|
10563
|
+
factor = - factor;
|
|
10564
|
+
|
|
10565
|
+
}
|
|
10566
|
+
|
|
10567
|
+
gl.polygonOffset( factor, units );
|
|
10568
|
+
|
|
9934
10569
|
}
|
|
9935
10570
|
|
|
9936
10571
|
} else {
|
|
@@ -10034,9 +10669,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10034
10669
|
|
|
10035
10670
|
gl.compressedTexImage2D( ...arguments );
|
|
10036
10671
|
|
|
10037
|
-
} catch (
|
|
10672
|
+
} catch ( e ) {
|
|
10038
10673
|
|
|
10039
|
-
error( 'WebGLState:',
|
|
10674
|
+
error( 'WebGLState:', e );
|
|
10040
10675
|
|
|
10041
10676
|
}
|
|
10042
10677
|
|
|
@@ -10048,9 +10683,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10048
10683
|
|
|
10049
10684
|
gl.compressedTexImage3D( ...arguments );
|
|
10050
10685
|
|
|
10051
|
-
} catch (
|
|
10686
|
+
} catch ( e ) {
|
|
10052
10687
|
|
|
10053
|
-
error( 'WebGLState:',
|
|
10688
|
+
error( 'WebGLState:', e );
|
|
10054
10689
|
|
|
10055
10690
|
}
|
|
10056
10691
|
|
|
@@ -10062,9 +10697,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10062
10697
|
|
|
10063
10698
|
gl.texSubImage2D( ...arguments );
|
|
10064
10699
|
|
|
10065
|
-
} catch (
|
|
10700
|
+
} catch ( e ) {
|
|
10066
10701
|
|
|
10067
|
-
error( 'WebGLState:',
|
|
10702
|
+
error( 'WebGLState:', e );
|
|
10068
10703
|
|
|
10069
10704
|
}
|
|
10070
10705
|
|
|
@@ -10076,9 +10711,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10076
10711
|
|
|
10077
10712
|
gl.texSubImage3D( ...arguments );
|
|
10078
10713
|
|
|
10079
|
-
} catch (
|
|
10714
|
+
} catch ( e ) {
|
|
10080
10715
|
|
|
10081
|
-
error( 'WebGLState:',
|
|
10716
|
+
error( 'WebGLState:', e );
|
|
10082
10717
|
|
|
10083
10718
|
}
|
|
10084
10719
|
|
|
@@ -10090,9 +10725,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10090
10725
|
|
|
10091
10726
|
gl.compressedTexSubImage2D( ...arguments );
|
|
10092
10727
|
|
|
10093
|
-
} catch (
|
|
10728
|
+
} catch ( e ) {
|
|
10094
10729
|
|
|
10095
|
-
error( 'WebGLState:',
|
|
10730
|
+
error( 'WebGLState:', e );
|
|
10096
10731
|
|
|
10097
10732
|
}
|
|
10098
10733
|
|
|
@@ -10104,9 +10739,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10104
10739
|
|
|
10105
10740
|
gl.compressedTexSubImage3D( ...arguments );
|
|
10106
10741
|
|
|
10107
|
-
} catch (
|
|
10742
|
+
} catch ( e ) {
|
|
10108
10743
|
|
|
10109
|
-
error( 'WebGLState:',
|
|
10744
|
+
error( 'WebGLState:', e );
|
|
10110
10745
|
|
|
10111
10746
|
}
|
|
10112
10747
|
|
|
@@ -10118,9 +10753,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10118
10753
|
|
|
10119
10754
|
gl.texStorage2D( ...arguments );
|
|
10120
10755
|
|
|
10121
|
-
} catch (
|
|
10756
|
+
} catch ( e ) {
|
|
10122
10757
|
|
|
10123
|
-
error( 'WebGLState:',
|
|
10758
|
+
error( 'WebGLState:', e );
|
|
10124
10759
|
|
|
10125
10760
|
}
|
|
10126
10761
|
|
|
@@ -10132,9 +10767,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10132
10767
|
|
|
10133
10768
|
gl.texStorage3D( ...arguments );
|
|
10134
10769
|
|
|
10135
|
-
} catch (
|
|
10770
|
+
} catch ( e ) {
|
|
10136
10771
|
|
|
10137
|
-
error( 'WebGLState:',
|
|
10772
|
+
error( 'WebGLState:', e );
|
|
10138
10773
|
|
|
10139
10774
|
}
|
|
10140
10775
|
|
|
@@ -10146,9 +10781,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10146
10781
|
|
|
10147
10782
|
gl.texImage2D( ...arguments );
|
|
10148
10783
|
|
|
10149
|
-
} catch (
|
|
10784
|
+
} catch ( e ) {
|
|
10150
10785
|
|
|
10151
|
-
error( 'WebGLState:',
|
|
10786
|
+
error( 'WebGLState:', e );
|
|
10152
10787
|
|
|
10153
10788
|
}
|
|
10154
10789
|
|
|
@@ -10160,9 +10795,9 @@ function WebGLState( gl, extensions ) {
|
|
|
10160
10795
|
|
|
10161
10796
|
gl.texImage3D( ...arguments );
|
|
10162
10797
|
|
|
10163
|
-
} catch (
|
|
10798
|
+
} catch ( e ) {
|
|
10164
10799
|
|
|
10165
|
-
error( 'WebGLState:',
|
|
10800
|
+
error( 'WebGLState:', e );
|
|
10166
10801
|
|
|
10167
10802
|
}
|
|
10168
10803
|
|
|
@@ -10400,9 +11035,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
10400
11035
|
try {
|
|
10401
11036
|
|
|
10402
11037
|
useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'
|
|
10403
|
-
// eslint-disable-next-line compat/compat
|
|
10404
11038
|
&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;
|
|
10405
11039
|
|
|
11040
|
+
|
|
10406
11041
|
} catch ( err ) {
|
|
10407
11042
|
|
|
10408
11043
|
// Ignore any errors
|
|
@@ -10414,7 +11049,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
10414
11049
|
// Use OffscreenCanvas when available. Specially needed in web workers
|
|
10415
11050
|
|
|
10416
11051
|
return useOffscreenCanvas ?
|
|
10417
|
-
// eslint-disable-next-line compat/compat
|
|
10418
11052
|
new OffscreenCanvas( width, height ) : createElementNS( 'canvas' );
|
|
10419
11053
|
|
|
10420
11054
|
}
|
|
@@ -10959,7 +11593,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
10959
11593
|
|
|
10960
11594
|
const textureProperties = properties.get( texture );
|
|
10961
11595
|
|
|
10962
|
-
if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
|
|
11596
|
+
if ( texture.isCubeDepthTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {
|
|
10963
11597
|
|
|
10964
11598
|
uploadCubeTexture( textureProperties, texture, slot );
|
|
10965
11599
|
return;
|
|
@@ -11951,7 +12585,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
11951
12585
|
}
|
|
11952
12586
|
|
|
11953
12587
|
// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
|
|
11954
|
-
function setupRenderBufferStorage( renderbuffer, renderTarget,
|
|
12588
|
+
function setupRenderBufferStorage( renderbuffer, renderTarget, useMultisample ) {
|
|
11955
12589
|
|
|
11956
12590
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
|
|
11957
12591
|
|
|
@@ -11964,15 +12598,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
11964
12598
|
const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
|
|
11965
12599
|
|
|
11966
12600
|
// set up the attachment
|
|
11967
|
-
|
|
11968
|
-
const isUseMultisampledRTT = useMultisampledRTT( renderTarget );
|
|
11969
|
-
if ( isUseMultisampledRTT ) {
|
|
12601
|
+
if ( useMultisampledRTT( renderTarget ) ) {
|
|
11970
12602
|
|
|
11971
|
-
multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER,
|
|
12603
|
+
multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );
|
|
11972
12604
|
|
|
11973
|
-
} else if (
|
|
12605
|
+
} else if ( useMultisample ) {
|
|
11974
12606
|
|
|
11975
|
-
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER,
|
|
12607
|
+
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );
|
|
11976
12608
|
|
|
11977
12609
|
} else {
|
|
11978
12610
|
|
|
@@ -11993,15 +12625,14 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
11993
12625
|
const glFormat = utils.convert( texture.format, texture.colorSpace );
|
|
11994
12626
|
const glType = utils.convert( texture.type );
|
|
11995
12627
|
const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );
|
|
11996
|
-
const samples = getRenderTargetSamples( renderTarget );
|
|
11997
12628
|
|
|
11998
|
-
if (
|
|
12629
|
+
if ( useMultisampledRTT( renderTarget ) ) {
|
|
11999
12630
|
|
|
12000
|
-
|
|
12631
|
+
multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );
|
|
12001
12632
|
|
|
12002
|
-
} else if (
|
|
12633
|
+
} else if ( useMultisample ) {
|
|
12003
12634
|
|
|
12004
|
-
|
|
12635
|
+
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );
|
|
12005
12636
|
|
|
12006
12637
|
} else {
|
|
12007
12638
|
|
|
@@ -12018,10 +12649,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
12018
12649
|
}
|
|
12019
12650
|
|
|
12020
12651
|
// Setup resources for a Depth Texture for a FBO (needs an extension)
|
|
12021
|
-
function setupDepthTexture( framebuffer, renderTarget ) {
|
|
12652
|
+
function setupDepthTexture( framebuffer, renderTarget, cubeFace ) {
|
|
12022
12653
|
|
|
12023
|
-
const isCube = ( renderTarget
|
|
12024
|
-
if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );
|
|
12654
|
+
const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
|
|
12025
12655
|
|
|
12026
12656
|
state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
12027
12657
|
|
|
@@ -12045,20 +12675,69 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
12045
12675
|
|
|
12046
12676
|
}
|
|
12047
12677
|
|
|
12048
|
-
|
|
12678
|
+
if ( isCube ) {
|
|
12679
|
+
|
|
12680
|
+
// For cube depth textures, initialize and bind without uploading image data
|
|
12681
|
+
if ( textureProperties.__webglInit === undefined ) {
|
|
12682
|
+
|
|
12683
|
+
textureProperties.__webglInit = true;
|
|
12684
|
+
renderTarget.depthTexture.addEventListener( 'dispose', onTextureDispose );
|
|
12685
|
+
|
|
12686
|
+
}
|
|
12687
|
+
|
|
12688
|
+
// Only create and allocate storage once
|
|
12689
|
+
if ( textureProperties.__webglTexture === undefined ) {
|
|
12690
|
+
|
|
12691
|
+
textureProperties.__webglTexture = _gl.createTexture();
|
|
12692
|
+
|
|
12693
|
+
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
12694
|
+
setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.depthTexture );
|
|
12695
|
+
|
|
12696
|
+
// Allocate storage for all 6 faces with correct depth texture format
|
|
12697
|
+
const glFormat = utils.convert( renderTarget.depthTexture.format );
|
|
12698
|
+
const glType = utils.convert( renderTarget.depthTexture.type );
|
|
12699
|
+
|
|
12700
|
+
// Use proper internal format for depth textures
|
|
12701
|
+
let glInternalFormat;
|
|
12702
|
+
if ( renderTarget.depthTexture.format === DepthFormat ) {
|
|
12703
|
+
|
|
12704
|
+
glInternalFormat = _gl.DEPTH_COMPONENT24;
|
|
12705
|
+
|
|
12706
|
+
} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
|
|
12707
|
+
|
|
12708
|
+
glInternalFormat = _gl.DEPTH24_STENCIL8;
|
|
12709
|
+
|
|
12710
|
+
}
|
|
12711
|
+
|
|
12712
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
12713
|
+
|
|
12714
|
+
_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
12715
|
+
|
|
12716
|
+
}
|
|
12717
|
+
|
|
12718
|
+
}
|
|
12719
|
+
|
|
12720
|
+
} else {
|
|
12721
|
+
|
|
12722
|
+
setTexture2D( renderTarget.depthTexture, 0 );
|
|
12723
|
+
|
|
12724
|
+
}
|
|
12049
12725
|
|
|
12050
12726
|
const webglDepthTexture = textureProperties.__webglTexture;
|
|
12051
12727
|
const samples = getRenderTargetSamples( renderTarget );
|
|
12052
12728
|
|
|
12729
|
+
const glTextureType = isCube ? _gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace : _gl.TEXTURE_2D;
|
|
12730
|
+
const glAttachmentType = renderTarget.depthTexture.format === DepthStencilFormat ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
|
|
12731
|
+
|
|
12053
12732
|
if ( renderTarget.depthTexture.format === DepthFormat ) {
|
|
12054
12733
|
|
|
12055
12734
|
if ( useMultisampledRTT( renderTarget ) ) {
|
|
12056
12735
|
|
|
12057
|
-
multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER,
|
|
12736
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );
|
|
12058
12737
|
|
|
12059
12738
|
} else {
|
|
12060
12739
|
|
|
12061
|
-
_gl.framebufferTexture2D( _gl.FRAMEBUFFER,
|
|
12740
|
+
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );
|
|
12062
12741
|
|
|
12063
12742
|
}
|
|
12064
12743
|
|
|
@@ -12066,11 +12745,11 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
12066
12745
|
|
|
12067
12746
|
if ( useMultisampledRTT( renderTarget ) ) {
|
|
12068
12747
|
|
|
12069
|
-
multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER,
|
|
12748
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );
|
|
12070
12749
|
|
|
12071
12750
|
} else {
|
|
12072
12751
|
|
|
12073
|
-
_gl.framebufferTexture2D( _gl.FRAMEBUFFER,
|
|
12752
|
+
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );
|
|
12074
12753
|
|
|
12075
12754
|
}
|
|
12076
12755
|
|
|
@@ -12121,17 +12800,28 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
12121
12800
|
|
|
12122
12801
|
if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
|
|
12123
12802
|
|
|
12124
|
-
if ( isCube )
|
|
12803
|
+
if ( isCube ) {
|
|
12125
12804
|
|
|
12126
|
-
|
|
12805
|
+
// For cube render targets with depth texture, setup each face
|
|
12806
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
12127
12807
|
|
|
12128
|
-
|
|
12808
|
+
setupDepthTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, i );
|
|
12129
12809
|
|
|
12130
|
-
|
|
12810
|
+
}
|
|
12131
12811
|
|
|
12132
12812
|
} else {
|
|
12133
12813
|
|
|
12134
|
-
|
|
12814
|
+
const mipmaps = renderTarget.texture.mipmaps;
|
|
12815
|
+
|
|
12816
|
+
if ( mipmaps && mipmaps.length > 0 ) {
|
|
12817
|
+
|
|
12818
|
+
setupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget, 0 );
|
|
12819
|
+
|
|
12820
|
+
} else {
|
|
12821
|
+
|
|
12822
|
+
setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 0 );
|
|
12823
|
+
|
|
12824
|
+
}
|
|
12135
12825
|
|
|
12136
12826
|
}
|
|
12137
12827
|
|
|
@@ -12713,6 +13403,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
12713
13403
|
this.setupFrameBufferTexture = setupFrameBufferTexture;
|
|
12714
13404
|
this.useMultisampledRTT = useMultisampledRTT;
|
|
12715
13405
|
|
|
13406
|
+
this.isReversedDepthBuffer = function () {
|
|
13407
|
+
|
|
13408
|
+
return state.buffers.depth.getReversed();
|
|
13409
|
+
|
|
13410
|
+
};
|
|
13411
|
+
|
|
12716
13412
|
}
|
|
12717
13413
|
|
|
12718
13414
|
function WebGLUtils( gl, extensions ) {
|
|
@@ -12816,7 +13512,7 @@ function WebGLUtils( gl, extensions ) {
|
|
|
12816
13512
|
|
|
12817
13513
|
// ETC
|
|
12818
13514
|
|
|
12819
|
-
if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
|
|
13515
|
+
if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format || p === R11_EAC_Format || p === SIGNED_R11_EAC_Format || p === RG11_EAC_Format || p === SIGNED_RG11_EAC_Format ) {
|
|
12820
13516
|
|
|
12821
13517
|
extension = extensions.get( 'WEBGL_compressed_texture_etc' );
|
|
12822
13518
|
|
|
@@ -12824,6 +13520,10 @@ function WebGLUtils( gl, extensions ) {
|
|
|
12824
13520
|
|
|
12825
13521
|
if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
|
|
12826
13522
|
if ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;
|
|
13523
|
+
if ( p === R11_EAC_Format ) return extension.COMPRESSED_R11_EAC;
|
|
13524
|
+
if ( p === SIGNED_R11_EAC_Format ) return extension.COMPRESSED_SIGNED_R11_EAC;
|
|
13525
|
+
if ( p === RG11_EAC_Format ) return extension.COMPRESSED_RG11_EAC;
|
|
13526
|
+
if ( p === SIGNED_RG11_EAC_Format ) return extension.COMPRESSED_SIGNED_RG11_EAC;
|
|
12827
13527
|
|
|
12828
13528
|
} else {
|
|
12829
13529
|
|
|
@@ -13807,8 +14507,8 @@ class WebXRManager extends EventDispatcher {
|
|
|
13807
14507
|
|
|
13808
14508
|
// inherit camera layers and enable eye layers (1 = left, 2 = right)
|
|
13809
14509
|
cameraXR.layers.mask = camera.layers.mask | 0b110;
|
|
13810
|
-
cameraL.layers.mask = cameraXR.layers.mask &
|
|
13811
|
-
cameraR.layers.mask = cameraXR.layers.mask &
|
|
14510
|
+
cameraL.layers.mask = cameraXR.layers.mask & -5;
|
|
14511
|
+
cameraR.layers.mask = cameraXR.layers.mask & -3;
|
|
13812
14512
|
|
|
13813
14513
|
const parent = camera.parent;
|
|
13814
14514
|
const cameras = cameraXR.cameras;
|
|
@@ -14202,6 +14902,12 @@ function WebGLMaterials( renderer, properties ) {
|
|
|
14202
14902
|
|
|
14203
14903
|
refreshUniformsCommon( uniforms, material );
|
|
14204
14904
|
|
|
14905
|
+
if ( material.envMap ) {
|
|
14906
|
+
|
|
14907
|
+
uniforms.envMapIntensity.value = material.envMapIntensity;
|
|
14908
|
+
|
|
14909
|
+
}
|
|
14910
|
+
|
|
14205
14911
|
} else if ( material.isMeshToonMaterial ) {
|
|
14206
14912
|
|
|
14207
14913
|
refreshUniformsCommon( uniforms, material );
|
|
@@ -14212,6 +14918,12 @@ function WebGLMaterials( renderer, properties ) {
|
|
|
14212
14918
|
refreshUniformsCommon( uniforms, material );
|
|
14213
14919
|
refreshUniformsPhong( uniforms, material );
|
|
14214
14920
|
|
|
14921
|
+
if ( material.envMap ) {
|
|
14922
|
+
|
|
14923
|
+
uniforms.envMapIntensity.value = material.envMapIntensity;
|
|
14924
|
+
|
|
14925
|
+
}
|
|
14926
|
+
|
|
14215
14927
|
} else if ( material.isMeshStandardMaterial ) {
|
|
14216
14928
|
|
|
14217
14929
|
refreshUniformsCommon( uniforms, material );
|
|
@@ -15147,45 +15859,29 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) {
|
|
|
15147
15859
|
|
|
15148
15860
|
/**
|
|
15149
15861
|
* Precomputed DFG LUT for Image-Based Lighting
|
|
15150
|
-
* Resolution:
|
|
15862
|
+
* Resolution: 16x16
|
|
15151
15863
|
* Samples: 4096 per texel
|
|
15152
15864
|
* Format: RG16F (2 half floats per texel: scale, bias)
|
|
15153
15865
|
*/
|
|
15154
15866
|
|
|
15155
15867
|
|
|
15156
15868
|
const DATA = new Uint16Array( [
|
|
15157
|
-
|
|
15158
|
-
|
|
15159
|
-
|
|
15160
|
-
|
|
15161
|
-
|
|
15162
|
-
|
|
15163
|
-
|
|
15164
|
-
|
|
15165
|
-
|
|
15166
|
-
|
|
15167
|
-
|
|
15168
|
-
|
|
15169
|
-
|
|
15170
|
-
|
|
15171
|
-
|
|
15172
|
-
|
|
15173
|
-
0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,
|
|
15174
|
-
0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,
|
|
15175
|
-
0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,
|
|
15176
|
-
0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,
|
|
15177
|
-
0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,
|
|
15178
|
-
0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,
|
|
15179
|
-
0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,
|
|
15180
|
-
0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,
|
|
15181
|
-
0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,
|
|
15182
|
-
0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,
|
|
15183
|
-
0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,
|
|
15184
|
-
0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,
|
|
15185
|
-
0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,
|
|
15186
|
-
0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,
|
|
15187
|
-
0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,
|
|
15188
|
-
0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347
|
|
15869
|
+
0x30b5, 0x3ad1, 0x314c, 0x3a4d, 0x33d2, 0x391c, 0x35ef, 0x3828, 0x37f3, 0x36a6, 0x38d1, 0x3539, 0x3979, 0x3410, 0x39f8, 0x3252, 0x3a53, 0x30f0, 0x3a94, 0x2fc9, 0x3abf, 0x2e35, 0x3ada, 0x2d05, 0x3ae8, 0x2c1f, 0x3aed, 0x2ae0, 0x3aea, 0x29d1, 0x3ae1, 0x28ff,
|
|
15870
|
+
0x3638, 0x38e4, 0x364a, 0x38ce, 0x3699, 0x385e, 0x374e, 0x372c, 0x3839, 0x35a4, 0x38dc, 0x3462, 0x396e, 0x32c4, 0x39de, 0x3134, 0x3a2b, 0x3003, 0x3a59, 0x2e3a, 0x3a6d, 0x2ce1, 0x3a6e, 0x2bba, 0x3a5f, 0x2a33, 0x3a49, 0x290a, 0x3a2d, 0x2826, 0x3a0a, 0x26e8,
|
|
15871
|
+
0x3894, 0x36d7, 0x3897, 0x36c9, 0x38a3, 0x3675, 0x38bc, 0x35ac, 0x38ee, 0x349c, 0x393e, 0x3332, 0x3997, 0x3186, 0x39e2, 0x3038, 0x3a13, 0x2e75, 0x3a29, 0x2cf5, 0x3a2d, 0x2bac, 0x3a21, 0x29ff, 0x3a04, 0x28bc, 0x39dc, 0x2790, 0x39ad, 0x261a, 0x3978, 0x24fa,
|
|
15872
|
+
0x39ac, 0x34a8, 0x39ac, 0x34a3, 0x39ae, 0x3480, 0x39ae, 0x3423, 0x39b1, 0x330e, 0x39c2, 0x31a9, 0x39e0, 0x3063, 0x39fc, 0x2eb5, 0x3a0c, 0x2d1d, 0x3a14, 0x2bcf, 0x3a07, 0x29ff, 0x39e9, 0x28a3, 0x39be, 0x273c, 0x3989, 0x25b3, 0x394a, 0x2488, 0x3907, 0x2345,
|
|
15873
|
+
0x3a77, 0x3223, 0x3a76, 0x321f, 0x3a73, 0x3204, 0x3a6a, 0x31b3, 0x3a58, 0x3114, 0x3a45, 0x303b, 0x3a34, 0x2eb6, 0x3a26, 0x2d31, 0x3a1e, 0x2bef, 0x3a0b, 0x2a0d, 0x39ec, 0x28a1, 0x39c0, 0x271b, 0x3987, 0x2580, 0x3944, 0x2449, 0x38fa, 0x22bd, 0x38ac, 0x2155,
|
|
15874
|
+
0x3b07, 0x2fca, 0x3b06, 0x2fca, 0x3b00, 0x2fb8, 0x3af4, 0x2f7c, 0x3adb, 0x2eea, 0x3ab4, 0x2e00, 0x3a85, 0x2cec, 0x3a5e, 0x2bc5, 0x3a36, 0x2a00, 0x3a0d, 0x2899, 0x39dc, 0x2707, 0x39a0, 0x2562, 0x395a, 0x2424, 0x390b, 0x2268, 0x38b7, 0x20fd, 0x385f, 0x1fd1,
|
|
15875
|
+
0x3b69, 0x2cb9, 0x3b68, 0x2cbb, 0x3b62, 0x2cbb, 0x3b56, 0x2cae, 0x3b3b, 0x2c78, 0x3b0d, 0x2c0a, 0x3acf, 0x2ae3, 0x3a92, 0x2998, 0x3a54, 0x2867, 0x3a17, 0x26d0, 0x39d3, 0x253c, 0x3989, 0x2402, 0x3935, 0x2226, 0x38dc, 0x20bd, 0x387d, 0x1f54, 0x381d, 0x1db3,
|
|
15876
|
+
0x3ba9, 0x296b, 0x3ba8, 0x296f, 0x3ba3, 0x297b, 0x3b98, 0x2987, 0x3b7f, 0x2976, 0x3b4e, 0x2927, 0x3b0e, 0x2895, 0x3ac2, 0x27b7, 0x3a73, 0x263b, 0x3a23, 0x24e7, 0x39d0, 0x239b, 0x3976, 0x21d9, 0x3917, 0x207e, 0x38b2, 0x1ee7, 0x384b, 0x1d53, 0x37c7, 0x1c1e,
|
|
15877
|
+
0x3bd2, 0x25cb, 0x3bd1, 0x25d3, 0x3bcd, 0x25f0, 0x3bc2, 0x261f, 0x3bad, 0x2645, 0x3b7d, 0x262d, 0x3b3e, 0x25c4, 0x3aec, 0x250f, 0x3a93, 0x243a, 0x3a32, 0x22ce, 0x39d0, 0x215b, 0x3969, 0x202a, 0x38fe, 0x1e6e, 0x388f, 0x1cf1, 0x381f, 0x1b9b, 0x3762, 0x19dd,
|
|
15878
|
+
0x3be9, 0x21ab, 0x3be9, 0x21b7, 0x3be5, 0x21e5, 0x3bdd, 0x2241, 0x3bc9, 0x22a7, 0x3ba0, 0x22ec, 0x3b62, 0x22cd, 0x3b0f, 0x2247, 0x3aae, 0x2175, 0x3a44, 0x2088, 0x39d4, 0x1f49, 0x3960, 0x1dbe, 0x38e9, 0x1c77, 0x3870, 0x1ae8, 0x37f1, 0x1953, 0x3708, 0x181b,
|
|
15879
|
+
0x3bf6, 0x1cea, 0x3bf6, 0x1cfb, 0x3bf3, 0x1d38, 0x3bec, 0x1dbd, 0x3bda, 0x1e7c, 0x3bb7, 0x1f25, 0x3b7d, 0x1f79, 0x3b2c, 0x1f4c, 0x3ac6, 0x1ea6, 0x3a55, 0x1dbb, 0x39da, 0x1cbd, 0x395a, 0x1b9d, 0x38d8, 0x1a00, 0x3855, 0x18ac, 0x37ab, 0x173c, 0x36b7, 0x1598,
|
|
15880
|
+
0x3bfc, 0x1736, 0x3bfc, 0x1759, 0x3bf9, 0x17e7, 0x3bf4, 0x1896, 0x3be4, 0x1997, 0x3bc6, 0x1aa8, 0x3b91, 0x1b84, 0x3b43, 0x1bd2, 0x3ade, 0x1b8a, 0x3a65, 0x1acd, 0x39e2, 0x19d3, 0x3957, 0x18cd, 0x38ca, 0x17b3, 0x383e, 0x1613, 0x376d, 0x14bf, 0x366f, 0x135e,
|
|
15881
|
+
0x3bff, 0x101b, 0x3bff, 0x1039, 0x3bfc, 0x10c8, 0x3bf9, 0x1226, 0x3bea, 0x1428, 0x3bcf, 0x1584, 0x3b9f, 0x16c5, 0x3b54, 0x179a, 0x3af0, 0x17ce, 0x3a76, 0x1771, 0x39ea, 0x16a4, 0x3956, 0x15a7, 0x38bf, 0x14a7, 0x3829, 0x1379, 0x3735, 0x11ea, 0x362d, 0x10a1,
|
|
15882
|
+
0x3c00, 0x061b, 0x3c00, 0x066a, 0x3bfe, 0x081c, 0x3bfa, 0x0a4c, 0x3bed, 0x0d16, 0x3bd5, 0x0fb3, 0x3ba9, 0x114d, 0x3b63, 0x127c, 0x3b01, 0x132f, 0x3a85, 0x1344, 0x39f4, 0x12d2, 0x3957, 0x120d, 0x38b5, 0x1122, 0x3817, 0x103c, 0x3703, 0x0ed3, 0x35f0, 0x0d6d,
|
|
15883
|
+
0x3c00, 0x007a, 0x3c00, 0x0089, 0x3bfe, 0x011d, 0x3bfb, 0x027c, 0x3bf0, 0x04fa, 0x3bda, 0x0881, 0x3bb1, 0x0acd, 0x3b6f, 0x0c97, 0x3b10, 0x0d7b, 0x3a93, 0x0df1, 0x39fe, 0x0def, 0x3959, 0x0d8a, 0x38af, 0x0ce9, 0x3808, 0x0c31, 0x36d5, 0x0af0, 0x35b9, 0x09a3,
|
|
15884
|
+
0x3c00, 0x0000, 0x3c00, 0x0001, 0x3bff, 0x0015, 0x3bfb, 0x0059, 0x3bf2, 0x00fd, 0x3bdd, 0x01df, 0x3bb7, 0x031c, 0x3b79, 0x047c, 0x3b1d, 0x05d4, 0x3aa0, 0x06d5, 0x3a08, 0x075a, 0x395d, 0x075e, 0x38aa, 0x06f7, 0x37f4, 0x0648, 0x36ac, 0x0576, 0x3586, 0x049f
|
|
15189
15885
|
] );
|
|
15190
15886
|
|
|
15191
15887
|
let lut = null;
|
|
@@ -15194,7 +15890,8 @@ function getDFGLUT() {
|
|
|
15194
15890
|
|
|
15195
15891
|
if ( lut === null ) {
|
|
15196
15892
|
|
|
15197
|
-
lut = new DataTexture( DATA,
|
|
15893
|
+
lut = new DataTexture( DATA, 16, 16, RGFormat, HalfFloatType );
|
|
15894
|
+
lut.name = 'DFG_LUT';
|
|
15198
15895
|
lut.minFilter = LinearFilter;
|
|
15199
15896
|
lut.magFilter = LinearFilter;
|
|
15200
15897
|
lut.wrapS = ClampToEdgeWrapping;
|
|
@@ -15234,6 +15931,7 @@ class WebGLRenderer {
|
|
|
15234
15931
|
powerPreference = 'default',
|
|
15235
15932
|
failIfMajorPerformanceCaveat = false,
|
|
15236
15933
|
reversedDepthBuffer = false,
|
|
15934
|
+
outputBufferType = UnsignedByteType,
|
|
15237
15935
|
} = parameters;
|
|
15238
15936
|
|
|
15239
15937
|
/**
|
|
@@ -15263,6 +15961,8 @@ class WebGLRenderer {
|
|
|
15263
15961
|
|
|
15264
15962
|
}
|
|
15265
15963
|
|
|
15964
|
+
const _outputBufferType = outputBufferType;
|
|
15965
|
+
|
|
15266
15966
|
const INTEGER_FORMATS = new Set( [
|
|
15267
15967
|
RGBAIntegerFormat,
|
|
15268
15968
|
RGIntegerFormat,
|
|
@@ -15290,10 +15990,14 @@ class WebGLRenderer {
|
|
|
15290
15990
|
const renderListStack = [];
|
|
15291
15991
|
const renderStateStack = [];
|
|
15292
15992
|
|
|
15993
|
+
// internal render target for non-UnsignedByteType color buffer
|
|
15994
|
+
|
|
15995
|
+
let output = null;
|
|
15996
|
+
|
|
15293
15997
|
// public properties
|
|
15294
15998
|
|
|
15295
15999
|
/**
|
|
15296
|
-
* A canvas where the renderer draws its output.This is automatically created by the renderer
|
|
16000
|
+
* A canvas where the renderer draws its output. This is automatically created by the renderer
|
|
15297
16001
|
* in the constructor (if not provided already); you just need to add it to your page like so:
|
|
15298
16002
|
* ```js
|
|
15299
16003
|
* document.body.appendChild( renderer.domElement );
|
|
@@ -15309,7 +16013,7 @@ class WebGLRenderer {
|
|
|
15309
16013
|
* - `checkShaderErrors`: If it is `true`, defines whether material shader programs are
|
|
15310
16014
|
* checked for errors during compilation and linkage process. It may be useful to disable
|
|
15311
16015
|
* this check in production for performance gain. It is strongly recommended to keep these
|
|
15312
|
-
* checks enabled during development. If the shader does not compile and link
|
|
16016
|
+
* checks enabled during development. If the shader does not compile and link, it will not
|
|
15313
16017
|
* work and associated material will not render.
|
|
15314
16018
|
* - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that
|
|
15315
16019
|
* can be used for custom error reporting. The callback receives the WebGL context, an instance
|
|
@@ -15550,15 +16254,15 @@ class WebGLRenderer {
|
|
|
15550
16254
|
|
|
15551
16255
|
}
|
|
15552
16256
|
|
|
15553
|
-
} catch (
|
|
16257
|
+
} catch ( e ) {
|
|
15554
16258
|
|
|
15555
|
-
error( 'WebGLRenderer: ' +
|
|
15556
|
-
throw
|
|
16259
|
+
error( 'WebGLRenderer: ' + e.message );
|
|
16260
|
+
throw e;
|
|
15557
16261
|
|
|
15558
16262
|
}
|
|
15559
16263
|
|
|
15560
16264
|
let extensions, capabilities, state, info;
|
|
15561
|
-
let properties, textures,
|
|
16265
|
+
let properties, textures, environments, attributes, geometries, objects;
|
|
15562
16266
|
let programCache, materials, renderLists, renderStates, clipping, shadowMap;
|
|
15563
16267
|
|
|
15564
16268
|
let background, morphtargets, bufferRenderer, indexedBufferRenderer;
|
|
@@ -15585,19 +16289,18 @@ class WebGLRenderer {
|
|
|
15585
16289
|
info = new WebGLInfo( _gl );
|
|
15586
16290
|
properties = new WebGLProperties();
|
|
15587
16291
|
textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
|
|
15588
|
-
|
|
15589
|
-
cubeuvmaps = new WebGLCubeUVMaps( _this );
|
|
16292
|
+
environments = new WebGLEnvironments( _this );
|
|
15590
16293
|
attributes = new WebGLAttributes( _gl );
|
|
15591
16294
|
bindingStates = new WebGLBindingStates( _gl, attributes );
|
|
15592
16295
|
geometries = new WebGLGeometries( _gl, attributes, info, bindingStates );
|
|
15593
|
-
objects = new WebGLObjects( _gl, geometries, attributes, info );
|
|
16296
|
+
objects = new WebGLObjects( _gl, geometries, attributes, bindingStates, info );
|
|
15594
16297
|
morphtargets = new WebGLMorphtargets( _gl, capabilities, textures );
|
|
15595
16298
|
clipping = new WebGLClipping( properties );
|
|
15596
|
-
programCache = new WebGLPrograms( _this,
|
|
16299
|
+
programCache = new WebGLPrograms( _this, environments, extensions, capabilities, bindingStates, clipping );
|
|
15597
16300
|
materials = new WebGLMaterials( _this, properties );
|
|
15598
16301
|
renderLists = new WebGLRenderLists();
|
|
15599
16302
|
renderStates = new WebGLRenderStates( extensions );
|
|
15600
|
-
background = new WebGLBackground( _this,
|
|
16303
|
+
background = new WebGLBackground( _this, environments, state, objects, _alpha, premultipliedAlpha );
|
|
15601
16304
|
shadowMap = new WebGLShadowMap( _this, objects, capabilities );
|
|
15602
16305
|
uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
|
|
15603
16306
|
|
|
@@ -15685,6 +16388,14 @@ class WebGLRenderer {
|
|
|
15685
16388
|
|
|
15686
16389
|
initGLContext();
|
|
15687
16390
|
|
|
16391
|
+
// initialize internal render target for non-UnsignedByteType color buffer
|
|
16392
|
+
|
|
16393
|
+
if ( _outputBufferType !== UnsignedByteType ) {
|
|
16394
|
+
|
|
16395
|
+
output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil );
|
|
16396
|
+
|
|
16397
|
+
}
|
|
16398
|
+
|
|
15688
16399
|
// xr
|
|
15689
16400
|
|
|
15690
16401
|
const xr = new WebXRManager( _this, _gl );
|
|
@@ -15807,6 +16518,12 @@ class WebGLRenderer {
|
|
|
15807
16518
|
|
|
15808
16519
|
}
|
|
15809
16520
|
|
|
16521
|
+
if ( output !== null ) {
|
|
16522
|
+
|
|
16523
|
+
output.setSize( canvas.width, canvas.height );
|
|
16524
|
+
|
|
16525
|
+
}
|
|
16526
|
+
|
|
15810
16527
|
this.setViewport( 0, 0, width, height );
|
|
15811
16528
|
|
|
15812
16529
|
};
|
|
@@ -15850,6 +16567,39 @@ class WebGLRenderer {
|
|
|
15850
16567
|
|
|
15851
16568
|
};
|
|
15852
16569
|
|
|
16570
|
+
/**
|
|
16571
|
+
* Sets the post-processing effects to be applied after rendering.
|
|
16572
|
+
*
|
|
16573
|
+
* @param {Array} effects - An array of post-processing effects.
|
|
16574
|
+
*/
|
|
16575
|
+
this.setEffects = function ( effects ) {
|
|
16576
|
+
|
|
16577
|
+
if ( _outputBufferType === UnsignedByteType ) {
|
|
16578
|
+
|
|
16579
|
+
console.error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' );
|
|
16580
|
+
return;
|
|
16581
|
+
|
|
16582
|
+
}
|
|
16583
|
+
|
|
16584
|
+
if ( effects ) {
|
|
16585
|
+
|
|
16586
|
+
for ( let i = 0; i < effects.length; i ++ ) {
|
|
16587
|
+
|
|
16588
|
+
if ( effects[ i ].isOutputPass === true ) {
|
|
16589
|
+
|
|
16590
|
+
console.warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' );
|
|
16591
|
+
break;
|
|
16592
|
+
|
|
16593
|
+
}
|
|
16594
|
+
|
|
16595
|
+
}
|
|
16596
|
+
|
|
16597
|
+
}
|
|
16598
|
+
|
|
16599
|
+
output.setEffects( effects || [] );
|
|
16600
|
+
|
|
16601
|
+
};
|
|
16602
|
+
|
|
15853
16603
|
/**
|
|
15854
16604
|
* Returns the current viewport definition.
|
|
15855
16605
|
*
|
|
@@ -16107,7 +16857,11 @@ class WebGLRenderer {
|
|
|
16107
16857
|
|
|
16108
16858
|
}
|
|
16109
16859
|
|
|
16110
|
-
|
|
16860
|
+
if ( bits !== 0 ) {
|
|
16861
|
+
|
|
16862
|
+
_gl.clear( bits );
|
|
16863
|
+
|
|
16864
|
+
}
|
|
16111
16865
|
|
|
16112
16866
|
};
|
|
16113
16867
|
|
|
@@ -16152,8 +16906,7 @@ class WebGLRenderer {
|
|
|
16152
16906
|
renderLists.dispose();
|
|
16153
16907
|
renderStates.dispose();
|
|
16154
16908
|
properties.dispose();
|
|
16155
|
-
|
|
16156
|
-
cubeuvmaps.dispose();
|
|
16909
|
+
environments.dispose();
|
|
16157
16910
|
objects.dispose();
|
|
16158
16911
|
bindingStates.dispose();
|
|
16159
16912
|
uniformsGroups.dispose();
|
|
@@ -16699,6 +17452,12 @@ class WebGLRenderer {
|
|
|
16699
17452
|
|
|
16700
17453
|
if ( _isContextLost === true ) return;
|
|
16701
17454
|
|
|
17455
|
+
// use internal render target for HalfFloatType color buffer (only when tone mapping is enabled)
|
|
17456
|
+
|
|
17457
|
+
const isXRPresenting = xr.enabled === true && xr.isPresenting === true;
|
|
17458
|
+
|
|
17459
|
+
const useOutput = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.begin( _this, _currentRenderTarget );
|
|
17460
|
+
|
|
16702
17461
|
// update scene graph
|
|
16703
17462
|
|
|
16704
17463
|
if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
|
|
@@ -16707,7 +17466,7 @@ class WebGLRenderer {
|
|
|
16707
17466
|
|
|
16708
17467
|
if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
|
|
16709
17468
|
|
|
16710
|
-
if ( xr.enabled === true && xr.isPresenting === true ) {
|
|
17469
|
+
if ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCompositing() === false ) ) {
|
|
16711
17470
|
|
|
16712
17471
|
if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
|
|
16713
17472
|
|
|
@@ -16779,46 +17538,52 @@ class WebGLRenderer {
|
|
|
16779
17538
|
|
|
16780
17539
|
if ( this.info.autoReset === true ) this.info.reset();
|
|
16781
17540
|
|
|
16782
|
-
// render scene
|
|
17541
|
+
// render scene (skip if first effect is a render pass - it will render the scene itself)
|
|
16783
17542
|
|
|
16784
|
-
const
|
|
16785
|
-
const transmissiveObjects = currentRenderList.transmissive;
|
|
17543
|
+
const skipSceneRender = useOutput && output.hasRenderPass();
|
|
16786
17544
|
|
|
16787
|
-
|
|
17545
|
+
if ( skipSceneRender === false ) {
|
|
16788
17546
|
|
|
16789
|
-
|
|
17547
|
+
const opaqueObjects = currentRenderList.opaque;
|
|
17548
|
+
const transmissiveObjects = currentRenderList.transmissive;
|
|
16790
17549
|
|
|
16791
|
-
|
|
17550
|
+
currentRenderState.setupLights();
|
|
16792
17551
|
|
|
16793
|
-
if (
|
|
17552
|
+
if ( camera.isArrayCamera ) {
|
|
16794
17553
|
|
|
16795
|
-
|
|
17554
|
+
const cameras = camera.cameras;
|
|
16796
17555
|
|
|
16797
|
-
|
|
17556
|
+
if ( transmissiveObjects.length > 0 ) {
|
|
16798
17557
|
|
|
16799
|
-
|
|
17558
|
+
for ( let i = 0, l = cameras.length; i < l; i ++ ) {
|
|
17559
|
+
|
|
17560
|
+
const camera2 = cameras[ i ];
|
|
17561
|
+
|
|
17562
|
+
renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );
|
|
17563
|
+
|
|
17564
|
+
}
|
|
16800
17565
|
|
|
16801
17566
|
}
|
|
16802
17567
|
|
|
16803
|
-
|
|
17568
|
+
if ( _renderBackground ) background.render( scene );
|
|
16804
17569
|
|
|
16805
|
-
|
|
17570
|
+
for ( let i = 0, l = cameras.length; i < l; i ++ ) {
|
|
16806
17571
|
|
|
16807
|
-
|
|
17572
|
+
const camera2 = cameras[ i ];
|
|
16808
17573
|
|
|
16809
|
-
|
|
17574
|
+
renderScene( currentRenderList, scene, camera2, camera2.viewport );
|
|
16810
17575
|
|
|
16811
|
-
|
|
17576
|
+
}
|
|
16812
17577
|
|
|
16813
|
-
}
|
|
17578
|
+
} else {
|
|
16814
17579
|
|
|
16815
|
-
|
|
17580
|
+
if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
|
|
16816
17581
|
|
|
16817
|
-
|
|
17582
|
+
if ( _renderBackground ) background.render( scene );
|
|
16818
17583
|
|
|
16819
|
-
|
|
17584
|
+
renderScene( currentRenderList, scene, camera );
|
|
16820
17585
|
|
|
16821
|
-
|
|
17586
|
+
}
|
|
16822
17587
|
|
|
16823
17588
|
}
|
|
16824
17589
|
|
|
@@ -16836,6 +17601,14 @@ class WebGLRenderer {
|
|
|
16836
17601
|
|
|
16837
17602
|
}
|
|
16838
17603
|
|
|
17604
|
+
// copy from internal render target to canvas using fullscreen quad
|
|
17605
|
+
|
|
17606
|
+
if ( useOutput ) {
|
|
17607
|
+
|
|
17608
|
+
output.end( _this );
|
|
17609
|
+
|
|
17610
|
+
}
|
|
17611
|
+
|
|
16839
17612
|
//
|
|
16840
17613
|
|
|
16841
17614
|
if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
|
|
@@ -17024,11 +17797,13 @@ class WebGLRenderer {
|
|
|
17024
17797
|
|
|
17025
17798
|
if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {
|
|
17026
17799
|
|
|
17800
|
+
const hasHalfFloatSupport = extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' );
|
|
17801
|
+
|
|
17027
17802
|
currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {
|
|
17028
17803
|
generateMipmaps: true,
|
|
17029
|
-
type:
|
|
17804
|
+
type: hasHalfFloatSupport ? HalfFloatType : UnsignedByteType,
|
|
17030
17805
|
minFilter: LinearMipmapLinearFilter,
|
|
17031
|
-
samples: 4,
|
|
17806
|
+
samples: Math.max( 4, capabilities.samples ), // to avoid feedback loops, the transmission render target requires a resolve, see #26177
|
|
17032
17807
|
stencilBuffer: stencil,
|
|
17033
17808
|
resolveDepthBuffer: false,
|
|
17034
17809
|
resolveStencilBuffer: false,
|
|
@@ -17210,9 +17985,11 @@ class WebGLRenderer {
|
|
|
17210
17985
|
|
|
17211
17986
|
// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change
|
|
17212
17987
|
|
|
17213
|
-
materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
17988
|
+
materialProperties.environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null;
|
|
17214
17989
|
materialProperties.fog = scene.fog;
|
|
17215
|
-
|
|
17990
|
+
|
|
17991
|
+
const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap );
|
|
17992
|
+
materialProperties.envMap = environments.get( material.envMap || materialProperties.environment, usePMREM );
|
|
17216
17993
|
materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;
|
|
17217
17994
|
|
|
17218
17995
|
if ( programs === undefined ) {
|
|
@@ -17285,12 +18062,9 @@ class WebGLRenderer {
|
|
|
17285
18062
|
uniforms.pointLightShadows.value = lights.state.pointShadow;
|
|
17286
18063
|
uniforms.hemisphereLights.value = lights.state.hemi;
|
|
17287
18064
|
|
|
17288
|
-
uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
|
|
17289
18065
|
uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
|
|
17290
|
-
uniforms.spotShadowMap.value = lights.state.spotShadowMap;
|
|
17291
18066
|
uniforms.spotLightMatrix.value = lights.state.spotLightMatrix;
|
|
17292
18067
|
uniforms.spotLightMap.value = lights.state.spotLightMap;
|
|
17293
|
-
uniforms.pointShadowMap.value = lights.state.pointShadowMap;
|
|
17294
18068
|
uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
|
|
17295
18069
|
// TODO (abelnation): add area lights shadow info to uniforms
|
|
17296
18070
|
|
|
@@ -17346,9 +18120,10 @@ class WebGLRenderer {
|
|
|
17346
18120
|
textures.resetTextureUnits();
|
|
17347
18121
|
|
|
17348
18122
|
const fog = scene.fog;
|
|
17349
|
-
const environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
18123
|
+
const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null;
|
|
17350
18124
|
const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );
|
|
17351
|
-
const
|
|
18125
|
+
const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap );
|
|
18126
|
+
const envMap = environments.get( material.envMap || environment, usePMREM );
|
|
17352
18127
|
const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;
|
|
17353
18128
|
const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );
|
|
17354
18129
|
const morphTargets = !! geometry.morphAttributes.position;
|
|
@@ -17604,6 +18379,30 @@ class WebGLRenderer {
|
|
|
17604
18379
|
|
|
17605
18380
|
}
|
|
17606
18381
|
|
|
18382
|
+
// Pre-allocate texture units for shadow samplers before setting data textures
|
|
18383
|
+
if ( materialProperties.needsLights ) {
|
|
18384
|
+
|
|
18385
|
+
// Set shadow map uniforms first to ensure they get the first texture units
|
|
18386
|
+
if ( lights.state.directionalShadowMap.length > 0 ) {
|
|
18387
|
+
|
|
18388
|
+
p_uniforms.setValue( _gl, 'directionalShadowMap', lights.state.directionalShadowMap, textures );
|
|
18389
|
+
|
|
18390
|
+
}
|
|
18391
|
+
|
|
18392
|
+
if ( lights.state.spotShadowMap.length > 0 ) {
|
|
18393
|
+
|
|
18394
|
+
p_uniforms.setValue( _gl, 'spotShadowMap', lights.state.spotShadowMap, textures );
|
|
18395
|
+
|
|
18396
|
+
}
|
|
18397
|
+
|
|
18398
|
+
if ( lights.state.pointShadowMap.length > 0 ) {
|
|
18399
|
+
|
|
18400
|
+
p_uniforms.setValue( _gl, 'pointShadowMap', lights.state.pointShadowMap, textures );
|
|
18401
|
+
|
|
18402
|
+
}
|
|
18403
|
+
|
|
18404
|
+
}
|
|
18405
|
+
|
|
17607
18406
|
// skinning and morph target uniforms must be set even if material didn't change
|
|
17608
18407
|
// auto-setting of texture unit for bone and morph texture must go before other textures
|
|
17609
18408
|
// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures
|
|
@@ -17665,17 +18464,7 @@ class WebGLRenderer {
|
|
|
17665
18464
|
|
|
17666
18465
|
}
|
|
17667
18466
|
|
|
17668
|
-
|
|
17669
|
-
|
|
17670
|
-
if ( material.isMeshGouraudMaterial && material.envMap !== null ) {
|
|
17671
|
-
|
|
17672
|
-
m_uniforms.envMap.value = envMap;
|
|
17673
|
-
|
|
17674
|
-
m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;
|
|
17675
|
-
|
|
17676
|
-
}
|
|
17677
|
-
|
|
17678
|
-
if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {
|
|
18467
|
+
if ( ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) && material.envMap === null && scene.environment !== null ) {
|
|
17679
18468
|
|
|
17680
18469
|
m_uniforms.envMapIntensity.value = scene.environmentIntensity;
|
|
17681
18470
|
|
|
@@ -17866,7 +18655,6 @@ class WebGLRenderer {
|
|
|
17866
18655
|
_currentActiveCubeFace = activeCubeFace;
|
|
17867
18656
|
_currentActiveMipmapLevel = activeMipmapLevel;
|
|
17868
18657
|
|
|
17869
|
-
let useDefaultFramebuffer = true;
|
|
17870
18658
|
let framebuffer = null;
|
|
17871
18659
|
let isCube = false;
|
|
17872
18660
|
let isRenderTarget3D = false;
|
|
@@ -17877,9 +18665,21 @@ class WebGLRenderer {
|
|
|
17877
18665
|
|
|
17878
18666
|
if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {
|
|
17879
18667
|
|
|
17880
|
-
//
|
|
17881
|
-
|
|
17882
|
-
|
|
18668
|
+
// Externally-managed framebuffer (e.g. XR)
|
|
18669
|
+
// Bind to the stored framebuffer (may be null for default, or a WebGLFramebuffer)
|
|
18670
|
+
state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
18671
|
+
|
|
18672
|
+
_currentViewport.copy( renderTarget.viewport );
|
|
18673
|
+
_currentScissor.copy( renderTarget.scissor );
|
|
18674
|
+
_currentScissorTest = renderTarget.scissorTest;
|
|
18675
|
+
|
|
18676
|
+
state.viewport( _currentViewport );
|
|
18677
|
+
state.scissor( _currentScissor );
|
|
18678
|
+
state.setScissorTest( _currentScissorTest );
|
|
18679
|
+
|
|
18680
|
+
_currentMaterialId = -1;
|
|
18681
|
+
|
|
18682
|
+
return;
|
|
17883
18683
|
|
|
17884
18684
|
} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {
|
|
17885
18685
|
|
|
@@ -17978,7 +18778,7 @@ class WebGLRenderer {
|
|
|
17978
18778
|
|
|
17979
18779
|
const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
17980
18780
|
|
|
17981
|
-
if ( framebufferBound
|
|
18781
|
+
if ( framebufferBound ) {
|
|
17982
18782
|
|
|
17983
18783
|
state.drawBuffers( renderTarget, framebuffer );
|
|
17984
18784
|
|
|
@@ -18057,6 +18857,10 @@ class WebGLRenderer {
|
|
|
18057
18857
|
const textureFormat = texture.format;
|
|
18058
18858
|
const textureType = texture.type;
|
|
18059
18859
|
|
|
18860
|
+
// when using MRT, select the correct color buffer for the subsequent read command
|
|
18861
|
+
|
|
18862
|
+
if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
|
|
18863
|
+
|
|
18060
18864
|
if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
|
|
18061
18865
|
|
|
18062
18866
|
error( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
|
|
@@ -18075,10 +18879,6 @@ class WebGLRenderer {
|
|
|
18075
18879
|
|
|
18076
18880
|
if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
|
|
18077
18881
|
|
|
18078
|
-
// when using MRT, select the correct color buffer for the subsequent read command
|
|
18079
|
-
|
|
18080
|
-
if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
|
|
18081
|
-
|
|
18082
18882
|
_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
|
|
18083
18883
|
|
|
18084
18884
|
}
|
|
@@ -18139,6 +18939,11 @@ class WebGLRenderer {
|
|
|
18139
18939
|
const textureFormat = texture.format;
|
|
18140
18940
|
const textureType = texture.type;
|
|
18141
18941
|
|
|
18942
|
+
// when using MRT, select the correct color buffer for the subsequent read command
|
|
18943
|
+
|
|
18944
|
+
if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
|
|
18945
|
+
|
|
18946
|
+
|
|
18142
18947
|
if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
|
|
18143
18948
|
|
|
18144
18949
|
throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );
|
|
@@ -18155,10 +18960,6 @@ class WebGLRenderer {
|
|
|
18155
18960
|
_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );
|
|
18156
18961
|
_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );
|
|
18157
18962
|
|
|
18158
|
-
// when using MRT, select the correct color buffer for the subsequent read command
|
|
18159
|
-
|
|
18160
|
-
if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
|
|
18161
|
-
|
|
18162
18963
|
_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );
|
|
18163
18964
|
|
|
18164
18965
|
// reset the frame buffer to the currently set buffer before waiting
|
|
@@ -18228,27 +19029,9 @@ class WebGLRenderer {
|
|
|
18228
19029
|
* @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.
|
|
18229
19030
|
* @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.
|
|
18230
19031
|
* @param {number} [srcLevel=0] - The source mipmap level to copy.
|
|
18231
|
-
* @param {?number} [dstLevel=
|
|
19032
|
+
* @param {?number} [dstLevel=0] - The destination mipmap level.
|
|
18232
19033
|
*/
|
|
18233
|
-
this.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel =
|
|
18234
|
-
|
|
18235
|
-
// support the previous signature with just a single dst mipmap level
|
|
18236
|
-
if ( dstLevel === null ) {
|
|
18237
|
-
|
|
18238
|
-
if ( srcLevel !== 0 ) {
|
|
18239
|
-
|
|
18240
|
-
// @deprecated, r171
|
|
18241
|
-
warnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );
|
|
18242
|
-
dstLevel = srcLevel;
|
|
18243
|
-
srcLevel = 0;
|
|
18244
|
-
|
|
18245
|
-
} else {
|
|
18246
|
-
|
|
18247
|
-
dstLevel = 0;
|
|
18248
|
-
|
|
18249
|
-
}
|
|
18250
|
-
|
|
18251
|
-
}
|
|
19034
|
+
this.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
|
|
18252
19035
|
|
|
18253
19036
|
// gather the necessary dimensions to copy
|
|
18254
19037
|
let width, height, depth, minX, minY, minZ;
|
|
@@ -18592,4 +19375,4 @@ class WebGLRenderer {
|
|
|
18592
19375
|
|
|
18593
19376
|
}
|
|
18594
19377
|
|
|
18595
|
-
export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, CylindricalMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION,
|
|
19378
|
+
export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, CylindricalMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, Float32BufferAttribute, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, TriPlanarMapping, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };
|