super-three 0.181.0 → 0.184.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -35,13 +35,13 @@ export default /* glsl */`
35
35
  #ifdef USE_BATCHING_COLOR
36
36
 
37
37
  uniform sampler2D batchingColorTexture;
38
- vec3 getBatchingColor( const in float i ) {
38
+ vec4 getBatchingColor( const in float i ) {
39
39
 
40
40
  int size = textureSize( batchingColorTexture, 0 ).x;
41
41
  int j = int( i );
42
42
  int x = j % size;
43
43
  int y = j / size;
44
- return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;
44
+ return texelFetch( batchingColorTexture, ivec2( x, y ), 0 );
45
45
 
46
46
  }
47
47
 
@@ -1,11 +1,7 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_COLOR_ALPHA )
2
+ #if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )
3
3
 
4
4
  diffuseColor *= vColor;
5
5
 
6
- #elif defined( USE_COLOR )
7
-
8
- diffuseColor.rgb *= vColor;
9
-
10
6
  #endif
11
7
  `;
@@ -1,11 +1,7 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_COLOR_ALPHA )
2
+ #if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )
3
3
 
4
4
  varying vec4 vColor;
5
5
 
6
- #elif defined( USE_COLOR )
7
-
8
- varying vec3 vColor;
9
-
10
6
  #endif
11
7
  `;
@@ -1,11 +1,7 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_COLOR_ALPHA )
2
+ #if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
3
3
 
4
4
  varying vec4 vColor;
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
-
8
- varying vec3 vColor;
9
-
10
6
  #endif
11
7
  `;
@@ -1,31 +1,29 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_COLOR_ALPHA )
2
+ #if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
3
3
 
4
4
  vColor = vec4( 1.0 );
5
5
 
6
- #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
7
-
8
- vColor = vec3( 1.0 );
9
-
10
6
  #endif
11
7
 
12
- #ifdef USE_COLOR
8
+ #ifdef USE_COLOR_ALPHA
13
9
 
14
10
  vColor *= color;
15
11
 
12
+ #elif defined( USE_COLOR )
13
+
14
+ vColor.rgb *= color;
15
+
16
16
  #endif
17
17
 
18
18
  #ifdef USE_INSTANCING_COLOR
19
19
 
20
- vColor.xyz *= instanceColor.xyz;
20
+ vColor.rgb *= instanceColor.rgb;
21
21
 
22
22
  #endif
23
23
 
24
24
  #ifdef USE_BATCHING_COLOR
25
25
 
26
- vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );
27
-
28
- vColor.xyz *= batchingColor.xyz;
26
+ vColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );
29
27
 
30
28
  #endif
31
29
  `;
@@ -2,7 +2,6 @@ export default /* glsl */`
2
2
  #ifdef USE_ENVMAP
3
3
 
4
4
  uniform float envMapIntensity;
5
- uniform float flipEnvMap;
6
5
  uniform mat3 envMapRotation;
7
6
 
8
7
  #ifdef ENVMAP_TYPE_CUBE
@@ -36,25 +36,21 @@ export default /* glsl */`
36
36
 
37
37
  #ifdef ENVMAP_TYPE_CUBE
38
38
 
39
- vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );
39
+ vec4 envColor = textureCube( envMap, envMapRotation * reflectVec );
40
40
 
41
- #else
42
-
43
- vec4 envColor = vec4( 0.0 );
41
+ #ifdef ENVMAP_BLENDING_MULTIPLY
44
42
 
45
- #endif
43
+ outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );
46
44
 
47
- #ifdef ENVMAP_BLENDING_MULTIPLY
45
+ #elif defined( ENVMAP_BLENDING_MIX )
48
46
 
49
- outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );
47
+ outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );
50
48
 
51
- #elif defined( ENVMAP_BLENDING_MIX )
49
+ #elif defined( ENVMAP_BLENDING_ADD )
52
50
 
53
- outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );
51
+ outgoingLight += envColor.xyz * specularStrength * reflectivity;
54
52
 
55
- #elif defined( ENVMAP_BLENDING_ADD )
56
-
57
- outgoingLight += envColor.xyz * specularStrength * reflectivity;
53
+ #endif
58
54
 
59
55
  #endif
60
56
 
@@ -0,0 +1,80 @@
1
+ export default /* glsl */`
2
+ #ifdef USE_LIGHT_PROBES_GRID
3
+
4
+ // Single atlas 3D texture that stores all 7 SH sub-volumes stacked along Z.
5
+ // Atlas depth = 7 * ( nz + 2 ) where nz = probesResolution.z.
6
+ // Each sub-volume occupies ( nz + 2 ) slices: 1 padding + nz data + 1 padding.
7
+ // Padding is a copy of the first / last data slice and prevents color bleeding
8
+ // when the hardware linear filter reads across a sub-volume boundary.
9
+ uniform highp sampler3D probesSH;
10
+
11
+ uniform vec3 probesMin;
12
+ uniform vec3 probesMax;
13
+ uniform vec3 probesResolution;
14
+
15
+ vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) {
16
+
17
+ vec3 res = probesResolution;
18
+ vec3 gridRange = probesMax - probesMin;
19
+ vec3 resMinusOne = res - 1.0;
20
+ vec3 probeSpacing = gridRange / resMinusOne;
21
+
22
+ // Offset sample position along normal by half a probe spacing
23
+ vec3 samplePos = worldPos + worldNormal * probeSpacing * 0.5;
24
+ vec3 uvw = clamp( ( samplePos - probesMin ) / gridRange, 0.0, 1.0 );
25
+
26
+ // Remap to texel centers of the probe grid (XY and Z)
27
+ uvw = uvw * resMinusOne / res + 0.5 / res;
28
+
29
+ // Atlas UV mapping along Z:
30
+ // paddedSlices = nz + 2 (1 padding texel at each end of every sub-volume)
31
+ // atlasDepth = 7 * paddedSlices
32
+ // For sub-volume t the first DATA texel sits at atlas slice t*paddedSlices + 1.
33
+ // Given probe-grid texel-centre UVZ = ( iz + 0.5 ) / nz the atlas UV is:
34
+ // atlasUvZ = ( uvw.z * nz + t * paddedSlices + 1 ) / atlasDepth
35
+ //
36
+ // uvZBase encodes the nz-scaled Z plus the intra-volume offset (+ 1 for padding),
37
+ // so adding t*paddedSlices steps to each successive sub-volume.
38
+ float nz = res.z;
39
+ float paddedSlices = nz + 2.0;
40
+ float atlasDepth = 7.0 * paddedSlices;
41
+ float uvZBase = uvw.z * nz + 1.0;
42
+
43
+ vec4 s0 = texture( probesSH, vec3( uvw.xy, ( uvZBase ) / atlasDepth ) );
44
+ vec4 s1 = texture( probesSH, vec3( uvw.xy, ( uvZBase + paddedSlices ) / atlasDepth ) );
45
+ vec4 s2 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) );
46
+ vec4 s3 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) );
47
+ vec4 s4 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) );
48
+ vec4 s5 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) );
49
+ vec4 s6 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) );
50
+
51
+ // Unpack 9 vec3 SH L2 coefficients
52
+ vec3 c0 = s0.xyz;
53
+ vec3 c1 = vec3( s0.w, s1.xy );
54
+ vec3 c2 = vec3( s1.zw, s2.x );
55
+ vec3 c3 = s2.yzw;
56
+ vec3 c4 = s3.xyz;
57
+ vec3 c5 = vec3( s3.w, s4.xy );
58
+ vec3 c6 = vec3( s4.zw, s5.x );
59
+ vec3 c7 = s5.yzw;
60
+ vec3 c8 = s6.xyz;
61
+
62
+ // Evaluate L2 irradiance
63
+ float x = worldNormal.x, y = worldNormal.y, z = worldNormal.z;
64
+
65
+ vec3 result = c0 * 0.886227;
66
+ result += c1 * 2.0 * 0.511664 * y;
67
+ result += c2 * 2.0 * 0.511664 * z;
68
+ result += c3 * 2.0 * 0.511664 * x;
69
+ result += c4 * 2.0 * 0.429043 * x * y;
70
+ result += c5 * 2.0 * 0.429043 * y * z;
71
+ result += c6 * ( 0.743125 * z * z - 0.247708 );
72
+ result += c7 * 2.0 * 0.429043 * x * z;
73
+ result += c8 * 0.429043 * ( x * x - y * y );
74
+
75
+ return max( result, vec3( 0.0 ) );
76
+
77
+ }
78
+
79
+ #endif
80
+ `;
@@ -41,7 +41,10 @@ vec3 geometryClearcoatNormal = vec3( 0.0 );
41
41
 
42
42
  if ( material.iridescence > 0.0 ) {
43
43
 
44
- material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );
44
+ material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );
45
+ material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );
46
+
47
+ material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );
45
48
 
46
49
  // Iridescence F0 approximation
47
50
  material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );
@@ -66,7 +69,7 @@ IncidentLight directLight;
66
69
 
67
70
  getPointLightInfo( pointLight, geometryPosition, directLight );
68
71
 
69
- #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )
72
+ #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )
70
73
  pointLightShadow = pointLightShadows[ i ];
71
74
  directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;
72
75
  #endif
@@ -191,6 +194,14 @@ IncidentLight directLight;
191
194
 
192
195
  #endif
193
196
 
197
+ #ifdef USE_LIGHT_PROBES_GRID
198
+
199
+ vec3 probeWorldPos = ( ( vec4( geometryPosition, 1.0 ) - viewMatrix[ 3 ] ) * viewMatrix ).xyz;
200
+ vec3 probeWorldNormal = inverseTransformDirection( geometryNormal, viewMatrix );
201
+ irradiance += getLightProbeGridIrradiance( probeWorldPos, probeWorldNormal );
202
+
203
+ #endif
204
+
194
205
  #endif
195
206
 
196
207
  #if defined( RE_IndirectSpecular )
@@ -1,6 +1,12 @@
1
1
  export default /* glsl */`
2
2
  #if defined( RE_IndirectDiffuse )
3
3
 
4
+ #if defined( LAMBERT ) || defined( PHONG )
5
+
6
+ irradiance += iblIrradiance;
7
+
8
+ #endif
9
+
4
10
  RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
5
11
 
6
12
  #endif
@@ -10,9 +10,13 @@ export default /* glsl */`
10
10
 
11
11
  #endif
12
12
 
13
- #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )
13
+ #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )
14
14
 
15
- iblIrradiance += getIBLIrradiance( geometryNormal );
15
+ #if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )
16
+
17
+ iblIrradiance += getIBLIrradiance( geometryNormal );
18
+
19
+ #endif
16
20
 
17
21
  #endif
18
22
 
@@ -211,4 +211,6 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi
211
211
  }
212
212
 
213
213
  #endif
214
+
215
+ #include <lightprobes_pars_fragment>
214
216
  `;
@@ -1,6 +1,8 @@
1
1
  export default /* glsl */`
2
2
  PhysicalMaterial material;
3
- material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );
3
+ material.diffuseColor = diffuseColor.rgb;
4
+ material.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );
5
+ material.metalness = metalnessFactor;
4
6
 
5
7
  vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );
6
8
  float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );
@@ -40,11 +42,13 @@ material.roughness = min( material.roughness, 1.0 );
40
42
 
41
43
  #endif
42
44
 
43
- material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );
45
+ material.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;
46
+ material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );
44
47
 
45
48
  #else
46
49
 
47
- material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );
50
+ material.specularColor = vec3( 0.04 );
51
+ material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );
48
52
  material.specularF90 = 1.0;
49
53
 
50
54
  #endif
@@ -114,7 +118,7 @@ material.roughness = min( material.roughness, 1.0 );
114
118
 
115
119
  #endif
116
120
 
117
- material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );
121
+ material.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );
118
122
 
119
123
  #ifdef USE_SHEEN_ROUGHNESSMAP
120
124
 
@@ -5,8 +5,12 @@ uniform sampler2D dfgLUT;
5
5
  struct PhysicalMaterial {
6
6
 
7
7
  vec3 diffuseColor;
8
- float roughness;
8
+ vec3 diffuseContribution;
9
9
  vec3 specularColor;
10
+ vec3 specularColorBlended;
11
+
12
+ float roughness;
13
+ float metalness;
10
14
  float specularF90;
11
15
  float dispersion;
12
16
 
@@ -23,6 +27,8 @@ struct PhysicalMaterial {
23
27
  float iridescenceThickness;
24
28
  vec3 iridescenceFresnel;
25
29
  vec3 iridescenceF0;
30
+ vec3 iridescenceFresnelDielectric;
31
+ vec3 iridescenceFresnelMetallic;
26
32
  #endif
27
33
 
28
34
  #ifdef USE_SHEEN
@@ -70,7 +76,6 @@ vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH )
70
76
  float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {
71
77
 
72
78
  float a2 = pow2( alpha );
73
-
74
79
  float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );
75
80
  float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );
76
81
 
@@ -98,9 +103,7 @@ float D_GGX( const in float alpha, const in float dotNH ) {
98
103
 
99
104
  float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );
100
105
  float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );
101
- float v = 0.5 / ( gv + gl );
102
-
103
- return saturate(v);
106
+ return 0.5 / max( gv + gl, EPSILON );
104
107
 
105
108
  }
106
109
 
@@ -149,7 +152,7 @@ float D_GGX( const in float alpha, const in float dotNH ) {
149
152
 
150
153
  vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {
151
154
 
152
- vec3 f0 = material.specularColor;
155
+ vec3 f0 = material.specularColorBlended;
153
156
  float f90 = material.specularF90;
154
157
  float roughness = material.roughness;
155
158
 
@@ -354,39 +357,27 @@ vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 no
354
357
  #endif
355
358
 
356
359
  // This is a curve-fit approximation to the "Charlie sheen" BRDF integrated over the hemisphere from
357
- // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found
358
- // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
360
+ // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF".
359
361
  float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {
360
362
 
361
363
  float dotNV = saturate( dot( normal, viewDir ) );
362
364
 
363
365
  float r2 = roughness * roughness;
366
+ float rInv = 1.0 / ( roughness + 0.1 );
364
367
 
365
- float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;
366
-
367
- float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;
368
+ float a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;
369
+ float b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;
368
370
 
369
- float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );
371
+ float DG = exp( a * dotNV + b );
370
372
 
371
- return saturate( DG * RECIPROCAL_PI );
372
-
373
- }
374
-
375
- // DFG LUT sampling for physically-based rendering.
376
- // Uses a precomputed lookup table for the split-sum approximation
377
- // used in indirect specular lighting.
378
- // Reference: "Real Shading in Unreal Engine 4" by Brian Karis
379
- vec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {
380
-
381
- float dotNV = saturate( dot( normal, viewDir ) );
382
- vec2 uv = vec2( roughness, dotNV );
383
- return texture2D( dfgLUT, uv ).rg;
373
+ return saturate( DG );
384
374
 
385
375
  }
386
376
 
387
377
  vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {
388
378
 
389
- vec2 fab = DFGApprox( normal, viewDir, roughness );
379
+ float dotNV = saturate( dot( normal, viewDir ) );
380
+ vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;
390
381
 
391
382
  return specularColor * fab.x + specularF90 * fab.y;
392
383
 
@@ -401,7 +392,8 @@ void computeMultiscatteringIridescence( const in vec3 normal, const in vec3 view
401
392
  void 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 ) {
402
393
  #endif
403
394
 
404
- vec2 fab = DFGApprox( normal, viewDir, roughness );
395
+ float dotNV = saturate( dot( normal, viewDir ) );
396
+ vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;
405
397
 
406
398
  #ifdef USE_IRIDESCENCE
407
399
 
@@ -439,12 +431,12 @@ vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const
439
431
  float dotNV = saturate( dot( normal, viewDir ) );
440
432
 
441
433
  // Precomputed DFG values for view and light directions
442
- vec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );
443
- vec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );
434
+ vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;
435
+ vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;
444
436
 
445
437
  // Single-scattering energy for view and light
446
- vec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;
447
- vec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;
438
+ vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;
439
+ vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;
448
440
 
449
441
  float Ess_V = dfgV.x + dfgV.y;
450
442
  float Ess_L = dfgL.x + dfgL.y;
@@ -454,10 +446,10 @@ vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const
454
446
  float Ems_L = 1.0 - Ess_L;
455
447
 
456
448
  // Average Fresnel reflectance
457
- vec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619; // 1/21
449
+ vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619; // 1/21
458
450
 
459
451
  // Multiple scattering contribution
460
- vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );
452
+ vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );
461
453
 
462
454
  // Energy compensation factor
463
455
  float compensationFactor = Ems_V * Ems_L;
@@ -500,11 +492,33 @@ vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const
500
492
 
501
493
  // LTC Fresnel Approximation by Stephen Hill
502
494
  // http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf
503
- vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );
495
+ vec3 fresnel = ( material.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );
504
496
 
505
497
  reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );
506
498
 
507
- reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );
499
+ reflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );
500
+
501
+ #ifdef USE_CLEARCOAT
502
+
503
+ vec3 Ncc = geometryClearcoatNormal;
504
+
505
+ vec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );
506
+
507
+ vec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );
508
+ vec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );
509
+
510
+ mat3 mInvClearcoat = mat3(
511
+ vec3( t1Clearcoat.x, 0, t1Clearcoat.y ),
512
+ vec3( 0, 1, 0 ),
513
+ vec3( t1Clearcoat.z, 0, t1Clearcoat.w )
514
+ );
515
+
516
+ // LTC Fresnel Approximation for clearcoat
517
+ vec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;
518
+
519
+ clearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );
520
+
521
+ #endif
508
522
 
509
523
  }
510
524
 
@@ -527,19 +541,38 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
527
541
  #endif
528
542
 
529
543
  #ifdef USE_SHEEN
530
-
531
- sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );
532
-
533
- #endif
544
+
545
+ sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );
546
+
547
+ float sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
548
+ float sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );
549
+
550
+ float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );
551
+
552
+ irradiance *= sheenEnergyComp;
553
+
554
+ #endif
534
555
 
535
556
  reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );
536
557
 
537
- reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
558
+ reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );
538
559
  }
539
560
 
540
561
  void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
541
562
 
542
- reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
563
+ vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );
564
+
565
+ #ifdef USE_SHEEN
566
+
567
+ float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
568
+
569
+ float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;
570
+
571
+ diffuse *= sheenEnergyComp;
572
+
573
+ #endif
574
+
575
+ reflectedLight.indirectDiffuse += diffuse;
543
576
 
544
577
  }
545
578
 
@@ -553,33 +586,59 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
553
586
 
554
587
  #ifdef USE_SHEEN
555
588
 
556
- sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
589
+ sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;
557
590
 
558
- #endif
591
+ #endif
559
592
 
560
593
  // Both indirect specular and indirect diffuse light accumulate here
594
+ // Compute multiscattering separately for dielectric and metallic, then mix
561
595
 
562
- vec3 singleScattering = vec3( 0.0 );
563
- vec3 multiScattering = vec3( 0.0 );
564
- vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;
596
+ vec3 singleScatteringDielectric = vec3( 0.0 );
597
+ vec3 multiScatteringDielectric = vec3( 0.0 );
598
+
599
+ vec3 singleScatteringMetallic = vec3( 0.0 );
600
+ vec3 multiScatteringMetallic = vec3( 0.0 );
565
601
 
566
602
  #ifdef USE_IRIDESCENCE
567
603
 
568
- computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );
604
+ computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );
605
+ computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );
569
606
 
570
607
  #else
571
608
 
572
- computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );
609
+ computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );
610
+ computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );
573
611
 
574
612
  #endif
575
613
 
576
- vec3 totalScattering = singleScattering + multiScattering;
577
- vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );
614
+ // Mix based on metalness
615
+ vec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );
616
+ vec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );
578
617
 
579
- reflectedLight.indirectSpecular += radiance * singleScattering;
580
- reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;
618
+ // Diffuse energy conservation uses dielectric path
619
+ vec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;
620
+ vec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );
621
+
622
+ vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;
623
+
624
+ vec3 indirectSpecular = radiance * singleScattering;
625
+ indirectSpecular += multiScattering * cosineWeightedIrradiance;
626
+
627
+ vec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;
628
+
629
+ #ifdef USE_SHEEN
630
+
631
+ float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
632
+
633
+ float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;
634
+
635
+ indirectSpecular *= sheenEnergyComp;
636
+ indirectDiffuse *= sheenEnergyComp;
637
+
638
+ #endif
581
639
 
582
- reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;
640
+ reflectedLight.indirectSpecular += indirectSpecular;
641
+ reflectedLight.indirectDiffuse += indirectDiffuse;
583
642
 
584
643
  }
585
644
 
@@ -21,6 +21,13 @@ export default /* glsl */`
21
21
  #elif defined( USE_NORMALMAP_TANGENTSPACE )
22
22
 
23
23
  vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
24
+
25
+ #if defined( USE_PACKED_NORMALMAP )
26
+
27
+ mapN = vec3( mapN.xy, sqrt( saturate( 1.0 - dot( mapN.xy, mapN.xy ) ) ) );
28
+
29
+ #endif
30
+
24
31
  mapN.xy *= normalScale;
25
32
 
26
33
  normal = normalize( tbn * mapN );