@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +2 -1
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +22 -8
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +57 -38
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +679 -300
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +48 -8
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +11 -2
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -180,7 +180,7 @@ class WebGLBackend extends Backend {
180
180
  * A unique collection of bindings.
181
181
  *
182
182
  * @private
183
- * @type {WeakSet}
183
+ * @type {WeakSet<Array<BindGroup>>}
184
184
  */
185
185
  this._knownBindings = new WeakSet();
186
186
 
@@ -264,6 +264,7 @@ class WebGLBackend extends Backend {
264
264
  this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
265
265
  this.extensions.get( 'WEBGL_render_shared_exponent' );
266
266
  this.extensions.get( 'WEBGL_multi_draw' );
267
+ this.extensions.get( 'OVR_multiview2' );
267
268
 
268
269
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
269
270
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
@@ -360,13 +361,13 @@ class WebGLBackend extends Backend {
360
361
 
361
362
  // The multisample_render_to_texture extension doesn't work properly if there
362
363
  // are midframe flushes and an external depth texture.
363
- if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.autoAllocateDepthBuffer ) {
364
+ if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
364
365
 
365
366
  console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
366
367
 
367
368
  }
368
369
 
369
- renderTarget.autoAllocateDepthBuffer = false;
370
+ renderTarget._autoAllocateDepthBuffer = false;
370
371
 
371
372
  }
372
373
 
@@ -440,7 +441,7 @@ class WebGLBackend extends Backend {
440
441
  */
441
442
  beginRender( renderContext ) {
442
443
 
443
- const { state, gl } = this;
444
+ const { state } = this;
444
445
  const renderContextData = this.get( renderContext );
445
446
 
446
447
  //
@@ -451,7 +452,8 @@ class WebGLBackend extends Backend {
451
452
 
452
453
  } else {
453
454
 
454
- state.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
455
+ const { width, height } = this.getDrawingBufferSize();
456
+ state.viewport( 0, 0, width, height );
455
457
 
456
458
  }
457
459
 
@@ -471,10 +473,8 @@ class WebGLBackend extends Backend {
471
473
  this._currentContext = renderContext;
472
474
 
473
475
  this._setFramebuffer( renderContext );
474
-
475
476
  this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
476
477
 
477
-
478
478
  const occlusionQueryCount = renderContext.occlusionQueryCount;
479
479
 
480
480
  if ( occlusionQueryCount > 0 ) {
@@ -540,29 +540,60 @@ class WebGLBackend extends Backend {
540
540
  }
541
541
 
542
542
  this._currentContext = previousContext;
543
+ const renderTarget = renderContext.renderTarget;
543
544
 
544
- if ( renderContext.textures !== null && renderContext.renderTarget ) {
545
-
546
- const renderTargetContextData = this.get( renderContext.renderTarget );
545
+ if ( renderContext.textures !== null && renderTarget ) {
547
546
 
548
- const { samples } = renderContext.renderTarget;
547
+ const renderTargetContextData = this.get( renderTarget );
549
548
 
550
- if ( samples > 0 && this._useMultisampledRTT( renderContext.renderTarget ) === false ) {
549
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
551
550
 
552
551
  const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
553
552
 
554
- const mask = gl.COLOR_BUFFER_BIT;
553
+ let mask = gl.COLOR_BUFFER_BIT;
554
+
555
+ if ( renderTarget.resolveDepthBuffer ) {
556
+
557
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
558
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
559
+
560
+ }
555
561
 
556
562
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
563
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
557
564
 
558
565
  const textures = renderContext.textures;
566
+ const isMRT = textures.length > 1;
559
567
 
560
568
  state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
561
569
  state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
562
570
 
571
+ if ( isMRT ) {
572
+
573
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
574
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
575
+
576
+ for ( let i = 0; i < textures.length; i ++ ) {
577
+
578
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
579
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
580
+
581
+ }
582
+
583
+ }
584
+
563
585
  for ( let i = 0; i < textures.length; i ++ ) {
564
586
 
565
- // TODO Add support for MRT
587
+ if ( isMRT ) {
588
+
589
+ // configure attachment for resolve
590
+
591
+ const { textureGPU } = this.get( textures[ i ] );
592
+
593
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
594
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
595
+
596
+ }
566
597
 
567
598
  if ( renderContext.scissor ) {
568
599
 
@@ -572,28 +603,42 @@ class WebGLBackend extends Backend {
572
603
 
573
604
  gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
574
605
 
575
- if ( this._supportsInvalidateFramebuffer === true ) {
606
+ } else {
576
607
 
577
- gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
608
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
578
609
 
579
- }
610
+ }
580
611
 
581
- } else {
612
+ }
582
613
 
583
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
614
+ if ( isMRT ) {
584
615
 
585
- if ( this._supportsInvalidateFramebuffer === true ) {
616
+ // restore attachments
586
617
 
587
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
618
+ for ( let i = 0; i < textures.length; i ++ ) {
588
619
 
589
- }
620
+ const { textureGPU } = this.get( textures[ i ] );
621
+
622
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
623
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
590
624
 
591
625
  }
592
626
 
593
627
  }
594
628
 
595
- }
629
+ if ( this._supportsInvalidateFramebuffer === true ) {
630
+
631
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
596
632
 
633
+ }
634
+
635
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
636
+
637
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
638
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
639
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
640
+
641
+ }
597
642
 
598
643
  }
599
644
 
@@ -607,7 +652,8 @@ class WebGLBackend extends Backend {
607
652
 
608
653
  } else {
609
654
 
610
- state.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
655
+ const { width, height } = this.getDrawingBufferSize();
656
+ state.viewport( 0, 0, width, height );
611
657
 
612
658
  }
613
659
 
@@ -866,8 +912,9 @@ class WebGLBackend extends Backend {
866
912
  * @param {Node} computeNode - The compute node.
867
913
  * @param {Array<BindGroup>} bindings - The bindings.
868
914
  * @param {ComputePipeline} pipeline - The compute pipeline.
915
+ * @param {number|null} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
869
916
  */
870
- compute( computeGroup, computeNode, bindings, pipeline ) {
917
+ compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
871
918
 
872
919
  const { state, gl } = this;
873
920
 
@@ -887,7 +934,7 @@ class WebGLBackend extends Backend {
887
934
 
888
935
  if ( vaoGPU === undefined ) {
889
936
 
890
- this._createVao( attributes );
937
+ this.vaoCache[ vaoKey ] = this._createVao( attributes );
891
938
 
892
939
  } else {
893
940
 
@@ -904,13 +951,23 @@ class WebGLBackend extends Backend {
904
951
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
905
952
  gl.beginTransformFeedback( gl.POINTS );
906
953
 
954
+ count = ( count !== null ) ? count : computeNode.count;
955
+
956
+ if ( Array.isArray( count ) ) {
957
+
958
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
959
+
960
+ count = count[ 0 ];
961
+
962
+ }
963
+
907
964
  if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
908
965
 
909
- gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
966
+ gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
910
967
 
911
968
  } else {
912
969
 
913
- gl.drawArrays( gl.POINTS, 0, computeNode.count );
970
+ gl.drawArrays( gl.POINTS, 0, count );
914
971
 
915
972
  }
916
973
 
@@ -923,7 +980,7 @@ class WebGLBackend extends Backend {
923
980
 
924
981
  const dualAttributeData = transformBuffers[ i ];
925
982
 
926
- if ( dualAttributeData.pbo ) {
983
+ if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
927
984
 
928
985
  this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
929
986
 
@@ -960,6 +1017,20 @@ class WebGLBackend extends Backend {
960
1017
 
961
1018
  }
962
1019
 
1020
+ /**
1021
+ * Internal to determine if the current render target is a render target array with depth 2D array texture.
1022
+ *
1023
+ * @param {RenderContext} renderContext - The render context.
1024
+ * @return {boolean} Whether the render target is a render target array with depth 2D array texture.
1025
+ *
1026
+ * @private
1027
+ */
1028
+ _isRenderCameraDepthArray( renderContext ) {
1029
+
1030
+ return renderContext.depthTexture && renderContext.depthTexture.isArrayTexture && renderContext.camera.isArrayCamera;
1031
+
1032
+ }
1033
+
963
1034
  /**
964
1035
  * Executes a draw command for the given render object.
965
1036
  *
@@ -991,28 +1062,23 @@ class WebGLBackend extends Backend {
991
1062
 
992
1063
  // vertex state
993
1064
 
994
- const renderObjectData = this.get( renderObject );
1065
+ const attributes = renderObject.getAttributes();
1066
+ const attributesData = this.get( attributes );
995
1067
 
996
- let vaoGPU = renderObjectData.staticVao;
1068
+ let vaoGPU = attributesData.vaoGPU;
997
1069
 
998
- if ( vaoGPU === undefined || renderObjectData.geometryId !== renderObject.geometry.id ) {
1070
+ if ( vaoGPU === undefined ) {
999
1071
 
1000
- const vaoKey = this._getVaoKey( renderObject.getAttributes() );
1072
+ const vaoKey = this._getVaoKey( attributes );
1001
1073
 
1002
1074
  vaoGPU = this.vaoCache[ vaoKey ];
1003
1075
 
1004
1076
  if ( vaoGPU === undefined ) {
1005
1077
 
1006
- let staticVao;
1007
-
1008
- ( { vaoGPU, staticVao } = this._createVao( renderObject.getAttributes() ) );
1009
-
1010
- if ( staticVao ) {
1011
-
1012
- renderObjectData.staticVao = vaoGPU;
1013
- renderObjectData.geometryId = renderObject.geometry.id;
1078
+ vaoGPU = this._createVao( attributes );
1014
1079
 
1015
- }
1080
+ this.vaoCache[ vaoKey ] = vaoGPU;
1081
+ attributesData.vaoGPU = vaoGPU;
1016
1082
 
1017
1083
  }
1018
1084
 
@@ -1128,7 +1194,7 @@ class WebGLBackend extends Backend {
1128
1194
 
1129
1195
  };
1130
1196
 
1131
- if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
1197
+ if ( renderObject.camera.isArrayCamera === true && renderObject.camera.cameras.length > 0 && renderObject.camera.isMultiViewCamera === false ) {
1132
1198
 
1133
1199
  const cameraData = this.get( renderObject.camera );
1134
1200
  const cameras = renderObject.camera.cameras;
@@ -1159,25 +1225,71 @@ class WebGLBackend extends Backend {
1159
1225
  const cameraIndexData = this.get( cameraIndex );
1160
1226
  const pixelRatio = this.renderer.getPixelRatio();
1161
1227
 
1228
+ const renderTarget = this._currentContext.renderTarget;
1229
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( this._currentContext );
1230
+ const prevActiveCubeFace = this._currentContext.activeCubeFace;
1231
+
1232
+ if ( isRenderCameraDepthArray ) {
1233
+
1234
+ // Clear the depth texture
1235
+ const textureData = this.get( renderTarget.depthTexture );
1236
+
1237
+ if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
1238
+
1239
+ textureData.clearedRenderId = this.renderer._nodes.nodeFrame.renderId;
1240
+
1241
+ const { stencilBuffer } = renderTarget;
1242
+
1243
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1244
+
1245
+ this.renderer._activeCubeFace = i;
1246
+ this._currentContext.activeCubeFace = i;
1247
+
1248
+ this._setFramebuffer( this._currentContext );
1249
+ this.clear( false, true, stencilBuffer, this._currentContext, false );
1250
+
1251
+ }
1252
+
1253
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1254
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1255
+
1256
+ }
1257
+
1258
+ }
1259
+
1162
1260
  for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1163
1261
 
1164
1262
  const subCamera = cameras[ i ];
1165
1263
 
1166
1264
  if ( object.layers.test( subCamera.layers ) ) {
1167
1265
 
1266
+ if ( isRenderCameraDepthArray ) {
1267
+
1268
+ // Update the active layer
1269
+ this.renderer._activeCubeFace = i;
1270
+ this._currentContext.activeCubeFace = i;
1271
+
1272
+ this._setFramebuffer( this._currentContext );
1273
+
1274
+ }
1275
+
1168
1276
  const vp = subCamera.viewport;
1169
1277
 
1170
- const x = vp.x * pixelRatio;
1171
- const y = vp.y * pixelRatio;
1172
- const width = vp.width * pixelRatio;
1173
- const height = vp.height * pixelRatio;
1278
+ if ( vp !== undefined ) {
1174
1279
 
1175
- state.viewport(
1176
- Math.floor( x ),
1177
- Math.floor( renderObject.context.height - height - y ),
1178
- Math.floor( width ),
1179
- Math.floor( height )
1180
- );
1280
+ const x = vp.x * pixelRatio;
1281
+ const y = vp.y * pixelRatio;
1282
+ const width = vp.width * pixelRatio;
1283
+ const height = vp.height * pixelRatio;
1284
+
1285
+ state.viewport(
1286
+ Math.floor( x ),
1287
+ Math.floor( renderObject.context.height - height - y ),
1288
+ Math.floor( width ),
1289
+ Math.floor( height )
1290
+ );
1291
+
1292
+ }
1181
1293
 
1182
1294
  state.bindBufferBase( gl.UNIFORM_BUFFER, cameraIndexData.index, cameraData.indexesGPU[ i ] );
1183
1295
 
@@ -1185,6 +1297,9 @@ class WebGLBackend extends Backend {
1185
1297
 
1186
1298
  }
1187
1299
 
1300
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1301
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1302
+
1188
1303
  }
1189
1304
 
1190
1305
  } else {
@@ -1467,7 +1582,9 @@ class WebGLBackend extends Backend {
1467
1582
  _getShaderErrors( gl, shader, type ) {
1468
1583
 
1469
1584
  const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
1470
- const errors = gl.getShaderInfoLog( shader ).trim();
1585
+
1586
+ const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
1587
+ const errors = shaderInfoLog.trim();
1471
1588
 
1472
1589
  if ( status && errors === '' ) return '';
1473
1590
 
@@ -1499,11 +1616,11 @@ class WebGLBackend extends Backend {
1499
1616
 
1500
1617
  const gl = this.gl;
1501
1618
 
1502
- const programLog = gl.getProgramInfoLog( programGPU ).trim();
1619
+ const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
1620
+ const programLog = programInfoLog.trim();
1503
1621
 
1504
1622
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
1505
1623
 
1506
-
1507
1624
  if ( typeof this.renderer.debug.onShaderError === 'function' ) {
1508
1625
 
1509
1626
  this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
@@ -1928,15 +2045,15 @@ class WebGLBackend extends Backend {
1928
2045
 
1929
2046
  const isCube = renderTarget.isWebGLCubeRenderTarget === true;
1930
2047
  const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
1931
- const isRenderTargetArray = renderTarget.isRenderTargetArray === true;
2048
+ const isRenderTargetArray = renderTarget.depth > 1;
1932
2049
  const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
1933
- const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true );
2050
+ const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
1934
2051
 
1935
2052
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1936
2053
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1937
2054
  const multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
1938
- const useMultisampledRTT = this._useMultisampledRTT( renderTarget );
1939
-
2055
+ const multiviewExt = this.extensions.get( 'OVR_multiview2' );
2056
+ const useMultisampledRTT = this._useMultisampledExtension( renderTarget );
1940
2057
  const cacheKey = getCacheKey( descriptor );
1941
2058
 
1942
2059
  let fb;
@@ -1947,7 +2064,7 @@ class WebGLBackend extends Backend {
1947
2064
 
1948
2065
  fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1949
2066
 
1950
- } else if ( isXRRenderTarget && hasExternalTextures === false ) {
2067
+ } else if ( isXRRenderTarget && _hasExternalTextures === false ) {
1951
2068
 
1952
2069
  fb = this._xrFramebuffer;
1953
2070
 
@@ -1966,6 +2083,7 @@ class WebGLBackend extends Backend {
1966
2083
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1967
2084
 
1968
2085
  const textures = descriptor.textures;
2086
+ const depthInvalidationArray = [];
1969
2087
 
1970
2088
  if ( isCube ) {
1971
2089
 
@@ -1990,7 +2108,11 @@ class WebGLBackend extends Backend {
1990
2108
 
1991
2109
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1992
2110
 
1993
- if ( isRenderTarget3D || isRenderTargetArray ) {
2111
+ if ( renderTarget.multiview ) {
2112
+
2113
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
2114
+
2115
+ } else if ( isRenderTarget3D || isRenderTargetArray ) {
1994
2116
 
1995
2117
  const layer = this.renderer._activeCubeFace;
1996
2118
 
@@ -1998,7 +2120,7 @@ class WebGLBackend extends Backend {
1998
2120
 
1999
2121
  } else {
2000
2122
 
2001
- if ( hasExternalTextures && useMultisampledRTT ) {
2123
+ if ( useMultisampledRTT ) {
2002
2124
 
2003
2125
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2004
2126
 
@@ -2012,32 +2134,52 @@ class WebGLBackend extends Backend {
2012
2134
 
2013
2135
  }
2014
2136
 
2015
- state.drawBuffers( descriptor, fb );
2016
-
2017
2137
  }
2018
2138
 
2019
- if ( renderTarget.isXRRenderTarget && renderTarget.autoAllocateDepthBuffer === true ) {
2139
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2140
+
2141
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2020
2142
 
2021
2143
  const renderbuffer = gl.createRenderbuffer();
2022
2144
  this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
2023
2145
  renderTargetContextData.xrDepthRenderbuffer = renderbuffer;
2146
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2147
+
2148
+ gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
2149
+ gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
2150
+
2024
2151
 
2025
2152
  } else {
2026
2153
 
2027
2154
  if ( descriptor.depthTexture !== null ) {
2028
2155
 
2156
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2157
+
2029
2158
  const textureData = this.get( descriptor.depthTexture );
2030
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2031
2159
  textureData.renderTarget = descriptor.renderTarget;
2032
2160
  textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
2033
2161
 
2034
- if ( hasExternalTextures && useMultisampledRTT ) {
2162
+ if ( renderTarget.multiview ) {
2163
+
2164
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2165
+
2166
+ } else if ( _hasExternalTextures && useMultisampledRTT ) {
2035
2167
 
2036
2168
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2037
2169
 
2038
2170
  } else {
2039
2171
 
2040
- gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2172
+ if ( descriptor.depthTexture.isArrayTexture ) {
2173
+
2174
+ const layer = this.renderer._activeCubeFace;
2175
+
2176
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
2177
+
2178
+ } else {
2179
+
2180
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2181
+
2182
+ }
2041
2183
 
2042
2184
  }
2043
2185
 
@@ -2045,11 +2187,34 @@ class WebGLBackend extends Backend {
2045
2187
 
2046
2188
  }
2047
2189
 
2190
+ renderTargetContextData.depthInvalidationArray = depthInvalidationArray;
2191
+
2192
+
2048
2193
  } else {
2049
2194
 
2195
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( descriptor );
2196
+
2197
+ if ( isRenderCameraDepthArray ) {
2198
+
2199
+ state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2200
+
2201
+ const layer = this.renderer._activeCubeFace;
2202
+
2203
+ const depthData = this.get( descriptor.depthTexture );
2204
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2205
+ gl.framebufferTextureLayer(
2206
+ gl.FRAMEBUFFER,
2207
+ depthStyle,
2208
+ depthData.textureGPU,
2209
+ 0,
2210
+ layer
2211
+ );
2212
+
2213
+ }
2214
+
2050
2215
  // rebind external XR textures
2051
2216
 
2052
- if ( isXRRenderTarget && hasExternalTextures ) {
2217
+ if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
2053
2218
 
2054
2219
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2055
2220
 
@@ -2057,7 +2222,11 @@ class WebGLBackend extends Backend {
2057
2222
 
2058
2223
  const textureData = this.get( descriptor.textures[ 0 ] );
2059
2224
 
2060
- if ( useMultisampledRTT ) {
2225
+ if ( renderTarget.multiview ) {
2226
+
2227
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
2228
+
2229
+ } else if ( useMultisampledRTT ) {
2061
2230
 
2062
2231
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2063
2232
 
@@ -2071,7 +2240,7 @@ class WebGLBackend extends Backend {
2071
2240
 
2072
2241
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2073
2242
 
2074
- if ( renderTarget.autoAllocateDepthBuffer === true ) {
2243
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2075
2244
 
2076
2245
  const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
2077
2246
  gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
@@ -2081,7 +2250,11 @@ class WebGLBackend extends Backend {
2081
2250
 
2082
2251
  const textureData = this.get( descriptor.depthTexture );
2083
2252
 
2084
- if ( useMultisampledRTT ) {
2253
+ if ( renderTarget.multiview ) {
2254
+
2255
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2256
+
2257
+ } else if ( useMultisampledRTT ) {
2085
2258
 
2086
2259
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2087
2260
 
@@ -2097,7 +2270,7 @@ class WebGLBackend extends Backend {
2097
2270
 
2098
2271
  }
2099
2272
 
2100
- if ( samples > 0 && useMultisampledRTT === false ) {
2273
+ if ( samples > 0 && useMultisampledRTT === false && ! renderTarget.multiview ) {
2101
2274
 
2102
2275
  if ( msaaFb === undefined ) {
2103
2276
 
@@ -2119,13 +2292,6 @@ class WebGLBackend extends Backend {
2119
2292
 
2120
2293
  invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
2121
2294
 
2122
- if ( depthBuffer ) {
2123
-
2124
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2125
- invalidationArray.push( depthStyle );
2126
-
2127
- }
2128
-
2129
2295
  const texture = descriptor.textures[ i ];
2130
2296
  const textureData = this.get( texture );
2131
2297
 
@@ -2135,10 +2301,12 @@ class WebGLBackend extends Backend {
2135
2301
 
2136
2302
  }
2137
2303
 
2304
+ gl.bindRenderbuffer( gl.RENDERBUFFER, null );
2305
+
2138
2306
  renderTargetContextData.msaaFrameBuffer = msaaFb;
2139
2307
  renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
2140
2308
 
2141
- if ( depthRenderbuffer === undefined ) {
2309
+ if ( depthBuffer && depthRenderbuffer === undefined ) {
2142
2310
 
2143
2311
  depthRenderbuffer = gl.createRenderbuffer();
2144
2312
  this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
@@ -2162,6 +2330,8 @@ class WebGLBackend extends Backend {
2162
2330
 
2163
2331
  }
2164
2332
 
2333
+ state.drawBuffers( descriptor, fb );
2334
+
2165
2335
  }
2166
2336
 
2167
2337
  state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
@@ -2203,9 +2373,6 @@ class WebGLBackend extends Backend {
2203
2373
  const { gl } = this;
2204
2374
 
2205
2375
  const vaoGPU = gl.createVertexArray();
2206
- let key = '';
2207
-
2208
- let staticVao = true;
2209
2376
 
2210
2377
  gl.bindVertexArray( vaoGPU );
2211
2378
 
@@ -2214,13 +2381,9 @@ class WebGLBackend extends Backend {
2214
2381
  const attribute = attributes[ i ];
2215
2382
  const attributeData = this.get( attribute );
2216
2383
 
2217
- key += ':' + attributeData.id;
2218
-
2219
2384
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
2220
2385
  gl.enableVertexAttribArray( i );
2221
2386
 
2222
- if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
2223
-
2224
2387
  let stride, offset;
2225
2388
 
2226
2389
  if ( attribute.isInterleavedBufferAttribute === true ) {
@@ -2259,9 +2422,7 @@ class WebGLBackend extends Backend {
2259
2422
 
2260
2423
  gl.bindBuffer( gl.ARRAY_BUFFER, null );
2261
2424
 
2262
- this.vaoCache[ key ] = vaoGPU;
2263
-
2264
- return { vaoGPU, staticVao };
2425
+ return vaoGPU;
2265
2426
 
2266
2427
  }
2267
2428
 
@@ -2390,9 +2551,15 @@ class WebGLBackend extends Backend {
2390
2551
  * @param {RenderTarget} renderTarget - The render target that should be multisampled.
2391
2552
  * @return {boolean} Whether to use the `WEBGL_multisampled_render_to_texture` extension for MSAA or not.
2392
2553
  */
2393
- _useMultisampledRTT( renderTarget ) {
2554
+ _useMultisampledExtension( renderTarget ) {
2555
+
2556
+ if ( renderTarget.multiview === true ) {
2557
+
2558
+ return true;
2559
+
2560
+ }
2394
2561
 
2395
- return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.autoAllocateDepthBuffer !== false;
2562
+ return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
2396
2563
 
2397
2564
  }
2398
2565