super-three 0.168.0 → 0.169.1

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 (288) hide show
  1. package/build/three.cjs +384 -700
  2. package/build/three.module.js +384 -700
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +24644 -22406
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -6
  9. package/examples/jsm/controls/TrackballControls.js +32 -12
  10. package/examples/jsm/controls/TransformControls.js +97 -62
  11. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  12. package/examples/jsm/exporters/EXRExporter.js +19 -11
  13. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  14. package/examples/jsm/exporters/OBJExporter.js +5 -1
  15. package/examples/jsm/exporters/PLYExporter.js +9 -7
  16. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  17. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  18. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  19. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  20. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  21. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  22. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  23. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  24. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  25. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  26. package/examples/jsm/loaders/FBXLoader.js +30 -20
  27. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  28. package/examples/jsm/loaders/KTX2Loader.js +10 -7
  29. package/examples/jsm/loaders/MTLLoader.js +4 -3
  30. package/examples/jsm/loaders/MaterialXLoader.js +29 -10
  31. package/examples/jsm/loaders/OBJLoader.js +5 -3
  32. package/examples/jsm/loaders/PCDLoader.js +5 -4
  33. package/examples/jsm/loaders/PDBLoader.js +3 -2
  34. package/examples/jsm/loaders/PLYLoader.js +8 -5
  35. package/examples/jsm/loaders/STLLoader.js +3 -2
  36. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  37. package/examples/jsm/loaders/VTKLoader.js +4 -3
  38. package/examples/jsm/loaders/XYZLoader.js +3 -2
  39. package/examples/jsm/misc/Timer.js +1 -1
  40. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  41. package/examples/jsm/objects/LensflareMesh.js +322 -0
  42. package/examples/jsm/objects/SkyMesh.js +1 -2
  43. package/examples/jsm/objects/Water2Mesh.js +2 -3
  44. package/examples/jsm/objects/WaterMesh.js +1 -2
  45. package/examples/jsm/physics/JoltPhysics.js +1 -1
  46. package/examples/jsm/physics/RapierPhysics.js +1 -1
  47. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  48. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  49. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  50. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  51. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  52. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  53. package/examples/jsm/utils/TextureUtils.js +1 -0
  54. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  55. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  56. package/package.json +2 -2
  57. package/src/Three.WebGPU.Nodes.js +200 -0
  58. package/src/Three.WebGPU.js +2 -1
  59. package/src/audio/Audio.js +2 -2
  60. package/src/constants.js +1 -1
  61. package/src/core/BufferAttribute.js +0 -9
  62. package/src/core/Clock.js +1 -1
  63. package/src/core/InterleavedBuffer.js +0 -9
  64. package/src/extras/Controls.js +1 -1
  65. package/src/geometries/CylinderGeometry.js +11 -4
  66. package/src/loaders/MaterialLoader.js +7 -1
  67. package/src/loaders/nodes/NodeLoader.js +24 -4
  68. package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
  69. package/src/loaders/nodes/NodeObjectLoader.js +19 -0
  70. package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
  71. package/src/materials/nodes/Line2NodeMaterial.js +26 -26
  72. package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
  73. package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
  74. package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
  75. package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
  76. package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
  77. package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
  78. package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
  79. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
  80. package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
  81. package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
  82. package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
  83. package/src/materials/nodes/NodeMaterial.js +20 -45
  84. package/src/materials/nodes/NodeMaterials.js +2 -0
  85. package/src/materials/nodes/PointsNodeMaterial.js +7 -3
  86. package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
  87. package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
  88. package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
  89. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  90. package/src/math/Triangle.js +24 -0
  91. package/src/nodes/Nodes.js +3 -3
  92. package/src/nodes/TSL.js +96 -93
  93. package/src/nodes/accessors/BatchNode.js +7 -3
  94. package/src/nodes/accessors/BufferAttributeNode.js +6 -3
  95. package/src/nodes/accessors/BufferNode.js +6 -3
  96. package/src/nodes/accessors/Camera.js +10 -16
  97. package/src/nodes/accessors/ClippingNode.js +7 -3
  98. package/src/nodes/accessors/CubeTextureNode.js +6 -3
  99. package/src/nodes/accessors/InstanceNode.js +11 -11
  100. package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
  101. package/src/nodes/accessors/Lights.js +51 -0
  102. package/src/nodes/accessors/MaterialNode.js +8 -4
  103. package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
  104. package/src/nodes/accessors/ModelNode.js +42 -7
  105. package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
  106. package/src/nodes/accessors/MorphNode.js +7 -3
  107. package/src/nodes/accessors/Normal.js +32 -6
  108. package/src/nodes/accessors/Object3DNode.js +11 -27
  109. package/src/nodes/accessors/PointUVNode.js +7 -3
  110. package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
  111. package/src/nodes/accessors/ReferenceNode.js +40 -3
  112. package/src/nodes/accessors/RendererReferenceNode.js +9 -3
  113. package/src/nodes/accessors/SceneNode.js +7 -3
  114. package/src/nodes/accessors/SkinningNode.js +7 -3
  115. package/src/nodes/accessors/StorageBufferNode.js +21 -3
  116. package/src/nodes/accessors/StorageTextureNode.js +7 -4
  117. package/src/nodes/accessors/Texture3DNode.js +7 -4
  118. package/src/nodes/accessors/TextureNode.js +19 -8
  119. package/src/nodes/accessors/TextureSizeNode.js +8 -5
  120. package/src/nodes/accessors/UniformArrayNode.js +12 -9
  121. package/src/nodes/accessors/UserDataNode.js +9 -6
  122. package/src/nodes/accessors/VelocityNode.js +74 -23
  123. package/src/nodes/accessors/VertexColorNode.js +6 -3
  124. package/src/nodes/code/CodeNode.js +7 -3
  125. package/src/nodes/code/ExpressionNode.js +8 -4
  126. package/src/nodes/code/FunctionCallNode.js +6 -3
  127. package/src/nodes/code/FunctionNode.js +6 -3
  128. package/src/nodes/code/ScriptableNode.js +11 -6
  129. package/src/nodes/code/ScriptableValueNode.js +7 -3
  130. package/src/nodes/core/AssignNode.js +9 -6
  131. package/src/nodes/core/AttributeNode.js +7 -3
  132. package/src/nodes/core/BypassNode.js +8 -4
  133. package/src/nodes/core/CacheNode.js +8 -4
  134. package/src/nodes/core/ConstNode.js +6 -3
  135. package/src/nodes/core/ContextNode.js +7 -3
  136. package/src/nodes/core/IndexNode.js +25 -3
  137. package/src/nodes/core/InputNode.js +7 -3
  138. package/src/nodes/core/MRTNode.js +6 -3
  139. package/src/nodes/core/Node.js +10 -51
  140. package/src/nodes/core/NodeBuilder.js +71 -5
  141. package/src/nodes/core/NodeUtils.js +48 -6
  142. package/src/nodes/core/OutputStructNode.js +8 -4
  143. package/src/nodes/core/ParameterNode.js +6 -3
  144. package/src/nodes/core/PropertyNode.js +7 -3
  145. package/src/nodes/core/StackNode.js +7 -3
  146. package/src/nodes/core/StructTypeNode.js +7 -3
  147. package/src/nodes/core/TempNode.js +8 -4
  148. package/src/nodes/core/UniformGroupNode.js +10 -6
  149. package/src/nodes/core/UniformNode.js +6 -3
  150. package/src/nodes/core/VarNode.js +8 -4
  151. package/src/nodes/core/VaryingNode.js +7 -3
  152. package/src/nodes/display/AfterImageNode.js +6 -0
  153. package/src/nodes/display/AnaglyphPassNode.js +6 -0
  154. package/src/nodes/display/AnamorphicNode.js +6 -0
  155. package/src/nodes/display/BloomNode.js +6 -0
  156. package/src/nodes/display/BumpMapNode.js +6 -0
  157. package/src/nodes/display/ColorSpaceFunctions.js +4 -4
  158. package/src/nodes/display/ColorSpaceNode.js +43 -14
  159. package/src/nodes/display/DenoiseNode.js +6 -3
  160. package/src/nodes/display/DepthOfFieldNode.js +6 -3
  161. package/src/nodes/display/DotScreenNode.js +8 -5
  162. package/src/nodes/display/FXAANode.js +6 -3
  163. package/src/nodes/display/FilmNode.js +6 -3
  164. package/src/nodes/display/FrontFacingNode.js +7 -3
  165. package/src/nodes/display/GTAONode.js +6 -3
  166. package/src/nodes/display/GaussianBlurNode.js +6 -3
  167. package/src/nodes/display/Lut3DNode.js +6 -3
  168. package/src/nodes/display/NormalMapNode.js +8 -6
  169. package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
  170. package/src/nodes/display/PassNode.js +18 -7
  171. package/src/nodes/display/PixelationPassNode.js +12 -5
  172. package/src/nodes/display/PosterizeNode.js +6 -3
  173. package/src/nodes/display/RGBShiftNode.js +6 -3
  174. package/src/nodes/display/RenderOutputNode.js +12 -8
  175. package/src/nodes/display/SSAAPassNode.js +6 -3
  176. package/src/nodes/display/ScreenNode.js +181 -0
  177. package/src/nodes/display/SobelOperatorNode.js +6 -3
  178. package/src/nodes/display/StereoCompositePassNode.js +6 -3
  179. package/src/nodes/display/StereoPassNode.js +6 -3
  180. package/src/nodes/display/ToneMappingFunctions.js +12 -12
  181. package/src/nodes/display/ToneMappingNode.js +8 -7
  182. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  183. package/src/nodes/display/TransitionNode.js +6 -3
  184. package/src/nodes/display/ViewportDepthNode.js +7 -3
  185. package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
  186. package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
  187. package/src/nodes/display/ViewportTextureNode.js +8 -5
  188. package/src/nodes/fog/FogExp2Node.js +6 -3
  189. package/src/nodes/fog/FogNode.js +7 -3
  190. package/src/nodes/fog/FogRangeNode.js +6 -3
  191. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  192. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  193. package/src/nodes/geometry/RangeNode.js +7 -3
  194. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  195. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  196. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  197. package/src/nodes/gpgpu/ComputeNode.js +8 -4
  198. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  199. package/src/nodes/lighting/AONode.js +6 -3
  200. package/src/nodes/lighting/AmbientLightNode.js +6 -3
  201. package/src/nodes/lighting/AnalyticLightNode.js +198 -30
  202. package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
  203. package/src/nodes/lighting/BasicLightMapNode.js +6 -3
  204. package/src/nodes/lighting/DirectionalLightNode.js +7 -4
  205. package/src/nodes/lighting/EnvironmentNode.js +6 -3
  206. package/src/nodes/lighting/HemisphereLightNode.js +10 -6
  207. package/src/nodes/lighting/IESSpotLightNode.js +6 -3
  208. package/src/nodes/lighting/IrradianceNode.js +6 -3
  209. package/src/nodes/lighting/LightProbeNode.js +8 -31
  210. package/src/nodes/lighting/LightingContextNode.js +6 -3
  211. package/src/nodes/lighting/LightingNode.js +7 -3
  212. package/src/nodes/lighting/LightsNode.js +24 -5
  213. package/src/nodes/lighting/PointLightNode.js +11 -7
  214. package/src/nodes/lighting/RectAreaLightNode.js +11 -7
  215. package/src/nodes/lighting/SpotLightNode.js +13 -10
  216. package/src/nodes/math/ConditionalNode.js +23 -6
  217. package/src/nodes/math/MathNode.js +6 -3
  218. package/src/nodes/math/OperatorNode.js +6 -3
  219. package/src/nodes/pmrem/PMREMNode.js +6 -3
  220. package/src/nodes/utils/ArrayElementNode.js +8 -4
  221. package/src/nodes/utils/ConvertNode.js +7 -3
  222. package/src/nodes/utils/CubeMapNode.js +6 -3
  223. package/src/nodes/utils/EquirectUVNode.js +6 -3
  224. package/src/nodes/utils/FlipNode.js +7 -4
  225. package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
  226. package/src/nodes/utils/JoinNode.js +6 -3
  227. package/src/nodes/utils/LoopNode.js +7 -3
  228. package/src/nodes/utils/MatcapUVNode.js +6 -3
  229. package/src/nodes/utils/MaxMipLevelNode.js +6 -3
  230. package/src/nodes/utils/OscNode.js +7 -3
  231. package/src/nodes/utils/RTTNode.js +6 -3
  232. package/src/nodes/utils/ReflectorNode.js +8 -5
  233. package/src/nodes/utils/RemapNode.js +7 -3
  234. package/src/nodes/utils/RotateNode.js +6 -3
  235. package/src/nodes/utils/SetNode.js +7 -4
  236. package/src/nodes/utils/SplitNode.js +7 -3
  237. package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
  238. package/src/nodes/utils/StorageArrayElementNode.js +9 -8
  239. package/src/nodes/utils/TimerNode.js +6 -3
  240. package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
  241. package/src/nodes/utils/ViewportUtils.js +2 -2
  242. package/src/objects/BatchedMesh.js +76 -10
  243. package/src/objects/LOD.js +21 -0
  244. package/src/objects/Line.js +1 -0
  245. package/src/objects/Mesh.js +7 -23
  246. package/src/objects/Points.js +2 -0
  247. package/src/renderers/WebGLRenderer.js +65 -50
  248. package/src/renderers/common/BundleGroup.js +26 -0
  249. package/src/renderers/common/ClippingContext.js +4 -3
  250. package/src/renderers/common/RenderContext.js +4 -5
  251. package/src/renderers/common/RenderObject.js +116 -5
  252. package/src/renderers/common/RenderObjects.js +8 -1
  253. package/src/renderers/common/Renderer.js +57 -49
  254. package/src/renderers/common/extras/PMREMGenerator.js +7 -9
  255. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  256. package/src/renderers/common/nodes/Nodes.js +33 -14
  257. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  258. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  259. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  260. package/src/renderers/webgl/WebGLProgram.js +2 -0
  261. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  262. package/src/renderers/webgl/WebGLState.js +21 -0
  263. package/src/renderers/webgl/WebGLTextures.js +22 -0
  264. package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
  265. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
  266. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  267. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
  268. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
  269. package/src/renderers/webgpu/WebGPUBackend.js +33 -25
  270. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  271. package/src/renderers/webgpu/WebGPURenderer.js +5 -2
  272. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  273. package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
  274. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
  275. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  276. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
  277. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
  278. package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  279. package/src/utils.js +33 -1
  280. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  281. package/examples/jsm/loaders/TiltLoader.js +0 -520
  282. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  283. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  284. package/src/nodes/display/ViewportNode.js +0 -138
  285. package/src/nodes/lighting/LightNode.js +0 -57
  286. package/src/renderers/common/StandardRenderer.js +0 -18
  287. package/src/renderers/webvr/WebVRManager.js +0 -495
  288. package/src/renderers/webvr/WebVRUtils.js +0 -66
@@ -425,7 +425,7 @@ class WebGPUBackend extends Backend {
425
425
  renderContextData.descriptor = descriptor;
426
426
  renderContextData.encoder = encoder;
427
427
  renderContextData.currentPass = currentPass;
428
- renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
428
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
429
429
  renderContextData.renderBundles = [];
430
430
 
431
431
  //
@@ -829,13 +829,17 @@ class WebGPUBackend extends Backend {
829
829
 
830
830
  draw( renderObject, info ) {
831
831
 
832
- const { object, geometry, context, pipeline } = renderObject;
832
+ const { object, context, pipeline } = renderObject;
833
833
  const bindings = renderObject.getBindings();
834
834
  const renderContextData = this.get( context );
835
835
  const pipelineGPU = this.get( pipeline ).pipeline;
836
836
  const currentSets = renderContextData.currentSets;
837
837
  const passEncoderGPU = renderContextData.currentPass;
838
838
 
839
+ const drawParms = renderObject.getDrawParameters();
840
+
841
+ if ( drawParms === null ) return;
842
+
839
843
  // pipeline
840
844
 
841
845
  if ( currentSets.pipeline !== pipelineGPU ) {
@@ -848,12 +852,19 @@ class WebGPUBackend extends Backend {
848
852
 
849
853
  // bind groups
850
854
 
855
+ const currentBindingGroups = currentSets.bindingGroups;
856
+
851
857
  for ( let i = 0, l = bindings.length; i < l; i ++ ) {
852
858
 
853
859
  const bindGroup = bindings[ i ];
854
860
  const bindingsData = this.get( bindGroup );
855
861
 
856
- passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
862
+ if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
863
+
864
+ passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
865
+ currentBindingGroups[ bindGroup.index ] = bindGroup.id;
866
+
867
+ }
857
868
 
858
869
  }
859
870
 
@@ -929,12 +940,6 @@ class WebGPUBackend extends Backend {
929
940
 
930
941
  // draw
931
942
 
932
- const drawRange = renderObject.drawRange;
933
- const firstVertex = drawRange.start;
934
-
935
- const instanceCount = this.getInstanceCount( renderObject );
936
- if ( instanceCount === 0 ) return;
937
-
938
943
  if ( object.isBatchedMesh === true ) {
939
944
 
940
945
  const starts = object._multiDrawStarts;
@@ -955,16 +960,15 @@ class WebGPUBackend extends Backend {
955
960
 
956
961
  } else if ( hasIndex === true ) {
957
962
 
958
- const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
963
+ const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParms;
959
964
 
960
- passEncoderGPU.drawIndexed( indexCount, instanceCount, firstVertex, 0, 0 );
965
+ passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
961
966
 
962
967
  info.update( object, indexCount, instanceCount );
963
968
 
964
969
  } else {
965
970
 
966
- const positionAttribute = geometry.attributes.position;
967
- const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
971
+ const { vertexCount, instanceCount, firstVertex } = drawParms;
968
972
 
969
973
  passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
970
974
 
@@ -1057,7 +1061,6 @@ class WebGPUBackend extends Backend {
1057
1061
 
1058
1062
  }
1059
1063
 
1060
-
1061
1064
  // textures
1062
1065
 
1063
1066
  createSampler( texture ) {
@@ -1102,9 +1105,9 @@ class WebGPUBackend extends Backend {
1102
1105
 
1103
1106
  }
1104
1107
 
1105
- copyTextureToBuffer( texture, x, y, width, height ) {
1108
+ copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
1106
1109
 
1107
- return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
1110
+ return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );
1108
1111
 
1109
1112
  }
1110
1113
 
@@ -1253,7 +1256,7 @@ class WebGPUBackend extends Backend {
1253
1256
  renderContextData._currentPass = renderContextData.currentPass;
1254
1257
  renderContextData._currentSets = renderContextData.currentSets;
1255
1258
 
1256
- renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
1259
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
1257
1260
  renderContextData.currentPass = this.pipelineUtils.createBundleEncoder( renderContext );
1258
1261
 
1259
1262
  }
@@ -1361,9 +1364,11 @@ class WebGPUBackend extends Backend {
1361
1364
 
1362
1365
  let dstX = 0;
1363
1366
  let dstY = 0;
1367
+ let dstLayer = 0;
1364
1368
 
1365
1369
  let srcX = 0;
1366
1370
  let srcY = 0;
1371
+ let srcLayer = 0;
1367
1372
 
1368
1373
  let srcWidth = srcTexture.image.width;
1369
1374
  let srcHeight = srcTexture.image.height;
@@ -1372,6 +1377,7 @@ class WebGPUBackend extends Backend {
1372
1377
 
1373
1378
  srcX = srcRegion.x;
1374
1379
  srcY = srcRegion.y;
1380
+ srcLayer = srcRegion.z || 0;
1375
1381
  srcWidth = srcRegion.width;
1376
1382
  srcHeight = srcRegion.height;
1377
1383
 
@@ -1381,6 +1387,7 @@ class WebGPUBackend extends Backend {
1381
1387
 
1382
1388
  dstX = dstPosition.x;
1383
1389
  dstY = dstPosition.y;
1390
+ dstLayer = dstPosition.z || 0;
1384
1391
 
1385
1392
  }
1386
1393
 
@@ -1393,16 +1400,17 @@ class WebGPUBackend extends Backend {
1393
1400
  {
1394
1401
  texture: sourceGPU,
1395
1402
  mipLevel: level,
1396
- origin: { x: srcX, y: srcY, z: 0 }
1403
+ origin: { x: srcX, y: srcY, z: srcLayer }
1397
1404
  },
1398
1405
  {
1399
1406
  texture: destinationGPU,
1400
1407
  mipLevel: level,
1401
- origin: { x: dstX, y: dstY, z: 0 }
1408
+ origin: { x: dstX, y: dstY, z: dstLayer }
1402
1409
  },
1403
1410
  [
1404
1411
  srcWidth,
1405
- srcHeight
1412
+ srcHeight,
1413
+ 1
1406
1414
  ]
1407
1415
  );
1408
1416
 
@@ -1410,7 +1418,7 @@ class WebGPUBackend extends Backend {
1410
1418
 
1411
1419
  }
1412
1420
 
1413
- copyFramebufferToTexture( texture, renderContext ) {
1421
+ copyFramebufferToTexture( texture, renderContext, rectangle ) {
1414
1422
 
1415
1423
  const renderContextData = this.get( renderContext );
1416
1424
 
@@ -1459,14 +1467,14 @@ class WebGPUBackend extends Backend {
1459
1467
  encoder.copyTextureToTexture(
1460
1468
  {
1461
1469
  texture: sourceGPU,
1462
- origin: { x: 0, y: 0, z: 0 }
1470
+ origin: { x: rectangle.x, y: rectangle.y, z: 0 }
1463
1471
  },
1464
1472
  {
1465
1473
  texture: destinationGPU
1466
1474
  },
1467
1475
  [
1468
- texture.image.width,
1469
- texture.image.height
1476
+ rectangle.z,
1477
+ rectangle.w
1470
1478
  ]
1471
1479
  );
1472
1480
 
@@ -1482,7 +1490,7 @@ class WebGPUBackend extends Backend {
1482
1490
  if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
1483
1491
 
1484
1492
  renderContextData.currentPass = encoder.beginRenderPass( descriptor );
1485
- renderContextData.currentSets = { attributes: {}, pipeline: null, index: null };
1493
+ renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
1486
1494
 
1487
1495
  }
1488
1496
 
@@ -0,0 +1,42 @@
1
+ import Renderer from '../common/Renderer.js';
2
+ import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
3
+ import WebGPUBackend from './WebGPUBackend.js';
4
+ import BasicNodeLibrary from './nodes/BasicNodeLibrary.js';
5
+
6
+ class WebGPURenderer extends Renderer {
7
+
8
+ constructor( parameters = {} ) {
9
+
10
+ let BackendClass;
11
+
12
+ if ( parameters.forceWebGL ) {
13
+
14
+ BackendClass = WebGLBackend;
15
+
16
+ } else {
17
+
18
+ BackendClass = WebGPUBackend;
19
+
20
+ parameters.getFallback = () => {
21
+
22
+ console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
23
+
24
+ return new WebGLBackend( parameters );
25
+
26
+ };
27
+
28
+ }
29
+
30
+ const backend = new BackendClass( parameters );
31
+
32
+ super( backend, parameters );
33
+
34
+ this.nodes.library = new BasicNodeLibrary();
35
+
36
+ this.isWebGPURenderer = true;
37
+
38
+ }
39
+
40
+ }
41
+
42
+ export default WebGPURenderer;
@@ -1,6 +1,7 @@
1
- import StandardRenderer from '../common/StandardRenderer.js';
1
+ import Renderer from '../common/Renderer.js';
2
2
  import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
3
3
  import WebGPUBackend from './WebGPUBackend.js';
4
+ import StandardNodeLibrary from './nodes/StandardNodeLibrary.js';
4
5
  /*
5
6
  const debugHandler = {
6
7
 
@@ -15,7 +16,7 @@ const debugHandler = {
15
16
 
16
17
  };
17
18
  */
18
- class WebGPURenderer extends StandardRenderer {
19
+ class WebGPURenderer extends Renderer {
19
20
 
20
21
  constructor( parameters = {} ) {
21
22
 
@@ -44,6 +45,8 @@ class WebGPURenderer extends StandardRenderer {
44
45
  //super( new Proxy( backend, debugHandler ) );
45
46
  super( backend, parameters );
46
47
 
48
+ this.nodes.library = new StandardNodeLibrary();
49
+
47
50
  this.isWebGPURenderer = true;
48
51
 
49
52
  }
@@ -0,0 +1,59 @@
1
+ import NodeLibrary from '../../common/nodes/NodeLibrary.js';
2
+
3
+ // Lights
4
+ import { PointLight } from '../../../lights/PointLight.js';
5
+ import { PointLightNode } from '../../../nodes/Nodes.js';
6
+ import { DirectionalLight } from '../../../lights/DirectionalLight.js';
7
+ import { DirectionalLightNode } from '../../../nodes/Nodes.js';
8
+ import { RectAreaLight } from '../../../lights/RectAreaLight.js';
9
+ import { RectAreaLightNode } from '../../../nodes/Nodes.js';
10
+ import { SpotLight } from '../../../lights/SpotLight.js';
11
+ import { SpotLightNode } from '../../../nodes/Nodes.js';
12
+ import { AmbientLight } from '../../../lights/AmbientLight.js';
13
+ import { AmbientLightNode } from '../../../nodes/Nodes.js';
14
+ import { HemisphereLight } from '../../../lights/HemisphereLight.js';
15
+ import { HemisphereLightNode } from '../../../nodes/Nodes.js';
16
+ import { LightProbe } from '../../../lights/LightProbe.js';
17
+ import { LightProbeNode } from '../../../nodes/Nodes.js';
18
+ import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
19
+ import { IESSpotLightNode } from '../../../nodes/Nodes.js';
20
+
21
+ // Tone Mapping
22
+ import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
23
+ import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
24
+
25
+ // Color Space
26
+ import { LinearSRGBColorSpace, SRGBColorSpace } from '../../../constants.js';
27
+ import { linearSRGBTosRGB, sRGBToLinearSRGB } from '../../../nodes/display/ColorSpaceFunctions.js';
28
+ import { getColorSpaceMethod } from '../../../nodes/display/ColorSpaceNode.js';
29
+
30
+ class BasicNodeLibrary extends NodeLibrary {
31
+
32
+ constructor() {
33
+
34
+ super();
35
+
36
+ this.addLight( PointLightNode, PointLight );
37
+ this.addLight( DirectionalLightNode, DirectionalLight );
38
+ this.addLight( RectAreaLightNode, RectAreaLight );
39
+ this.addLight( SpotLightNode, SpotLight );
40
+ this.addLight( AmbientLightNode, AmbientLight );
41
+ this.addLight( HemisphereLightNode, HemisphereLight );
42
+ this.addLight( LightProbeNode, LightProbe );
43
+ this.addLight( IESSpotLightNode, IESSpotLight );
44
+
45
+ this.addToneMapping( linearToneMapping, LinearToneMapping );
46
+ this.addToneMapping( reinhardToneMapping, ReinhardToneMapping );
47
+ this.addToneMapping( cineonToneMapping, CineonToneMapping );
48
+ this.addToneMapping( acesFilmicToneMapping, ACESFilmicToneMapping );
49
+ this.addToneMapping( agxToneMapping, AgXToneMapping );
50
+ this.addToneMapping( neutralToneMapping, NeutralToneMapping );
51
+
52
+ this.addColorSpace( linearSRGBTosRGB, getColorSpaceMethod( LinearSRGBColorSpace, SRGBColorSpace ) );
53
+ this.addColorSpace( sRGBToLinearSRGB, getColorSpaceMethod( SRGBColorSpace, LinearSRGBColorSpace ) );
54
+
55
+ }
56
+
57
+ }
58
+
59
+ export default BasicNodeLibrary;
@@ -1,4 +1,4 @@
1
- import NodeLibrary from './NodeLibrary.js';
1
+ import NodeLibrary from '../../common/nodes/NodeLibrary.js';
2
2
 
3
3
  // Materials
4
4
  import { MeshPhongMaterial } from '../../../materials/MeshPhongMaterial.js';
@@ -52,12 +52,12 @@ import { IESSpotLightNode } from '../../../nodes/Nodes.js';
52
52
 
53
53
  // Tone Mapping
54
54
  import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
55
- import * as TMF from '../../../nodes/display/ToneMappingFunctions.js';
55
+ import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
56
56
 
57
57
  // Color Space
58
58
  import { LinearSRGBColorSpace, SRGBColorSpace } from '../../../constants.js';
59
+ import { linearSRGBTosRGB, sRGBToLinearSRGB } from '../../../nodes/display/ColorSpaceFunctions.js';
59
60
  import { getColorSpaceMethod } from '../../../nodes/display/ColorSpaceNode.js';
60
- import * as CSF from '../../../nodes/display/ColorSpaceFunctions.js';
61
61
 
62
62
  class StandardNodeLibrary extends NodeLibrary {
63
63
 
@@ -88,15 +88,15 @@ class StandardNodeLibrary extends NodeLibrary {
88
88
  this.addLight( LightProbeNode, LightProbe );
89
89
  this.addLight( IESSpotLightNode, IESSpotLight );
90
90
 
91
- this.addToneMapping( TMF.LinearToneMapping, LinearToneMapping );
92
- this.addToneMapping( TMF.ReinhardToneMapping, ReinhardToneMapping );
93
- this.addToneMapping( TMF.CineonToneMapping, CineonToneMapping );
94
- this.addToneMapping( TMF.ACESFilmicToneMapping, ACESFilmicToneMapping );
95
- this.addToneMapping( TMF.AgXToneMapping, AgXToneMapping );
96
- this.addToneMapping( TMF.NeutralToneMapping, NeutralToneMapping );
91
+ this.addToneMapping( linearToneMapping, LinearToneMapping );
92
+ this.addToneMapping( reinhardToneMapping, ReinhardToneMapping );
93
+ this.addToneMapping( cineonToneMapping, CineonToneMapping );
94
+ this.addToneMapping( acesFilmicToneMapping, ACESFilmicToneMapping );
95
+ this.addToneMapping( agxToneMapping, AgXToneMapping );
96
+ this.addToneMapping( neutralToneMapping, NeutralToneMapping );
97
97
 
98
- this.addColorSpace( CSF.LinearTosRGB, getColorSpaceMethod( LinearSRGBColorSpace, SRGBColorSpace ) );
99
- this.addColorSpace( CSF.sRGBToLinear, getColorSpaceMethod( SRGBColorSpace, LinearSRGBColorSpace ) );
98
+ this.addColorSpace( linearSRGBTosRGB, getColorSpaceMethod( LinearSRGBColorSpace, SRGBColorSpace ) );
99
+ this.addColorSpace( sRGBToLinearSRGB, getColorSpaceMethod( SRGBColorSpace, LinearSRGBColorSpace ) );
100
100
 
101
101
  }
102
102
 
@@ -94,7 +94,8 @@ fn tsl_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32> {
94
94
  biquadraticTexture: new CodeNode( `
95
95
  fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, level : i32 ) -> vec4f {
96
96
 
97
- let res = vec2f( textureDimensions( map, level ) );
97
+ let iRes = vec2i( textureDimensions( map, level ) );
98
+ let res = vec2f( iRes );
98
99
 
99
100
  let uvScaled = coord * res;
100
101
  let uvWrapping = ( ( uvScaled % res ) + res ) % res;
@@ -105,10 +106,10 @@ fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, level : i32 ) -
105
106
  let iuv = floor( uv );
106
107
  let f = fract( uv );
107
108
 
108
- let rg1 = textureLoad( map, vec2i( iuv + vec2( 0.5, 0.5 ) ), level );
109
- let rg2 = textureLoad( map, vec2i( iuv + vec2( 1.5, 0.5 ) ), level );
110
- let rg3 = textureLoad( map, vec2i( iuv + vec2( 0.5, 1.5 ) ), level );
111
- let rg4 = textureLoad( map, vec2i( iuv + vec2( 1.5, 1.5 ) ), level );
109
+ let rg1 = textureLoad( map, vec2i( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );
110
+ let rg2 = textureLoad( map, vec2i( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );
111
+ let rg3 = textureLoad( map, vec2i( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );
112
+ let rg4 = textureLoad( map, vec2i( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );
112
113
 
113
114
  return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
114
115
 
@@ -149,6 +150,16 @@ if ( /Windows/g.test( navigator.userAgent ) ) {
149
150
 
150
151
  //
151
152
 
153
+ let diagnostics = '';
154
+
155
+ if ( /Firefox/g.test( navigator.userAgent ) !== true ) {
156
+
157
+ diagnostics += 'diagnostic( off, derivative_uniformity );\n';
158
+
159
+ }
160
+
161
+ //
162
+
152
163
  class WGSLNodeBuilder extends NodeBuilder {
153
164
 
154
165
  constructor( object, renderer ) {
@@ -161,6 +172,8 @@ class WGSLNodeBuilder extends NodeBuilder {
161
172
 
162
173
  this.directives = {};
163
174
 
175
+ this.scopedArrays = new Map();
176
+
164
177
  }
165
178
 
166
179
  needsToWorkingColorSpace( texture ) {
@@ -571,6 +584,12 @@ class WGSLNodeBuilder extends NodeBuilder {
571
584
 
572
585
  }
573
586
 
587
+ hasBuiltin( name, shaderStage = this.shaderStage ) {
588
+
589
+ return ( this.builtins[ shaderStage ] !== undefined && this.builtins[ shaderStage ].has( name ) );
590
+
591
+ }
592
+
574
593
  getVertexIndex() {
575
594
 
576
595
  if ( this.shaderStage === 'vertex' ) {
@@ -643,11 +662,19 @@ ${ flowData.code }
643
662
 
644
663
  }
645
664
 
665
+ getInvocationSubgroupIndex() {
666
+
667
+ this.enableSubGroups();
668
+
669
+ return this.getBuiltin( 'subgroup_invocation_id', 'invocationSubgroupIndex', 'u32', 'attribute' );
670
+
671
+ }
672
+
646
673
  getSubgroupIndex() {
647
674
 
648
675
  this.enableSubGroups();
649
676
 
650
- return this.getBuiltin( 'subgroup_invocation_id', 'subgroupIndex', 'u32', 'attribute' );
677
+ return this.getBuiltin( 'subgroup_id', 'subgroupIndex', 'u32', 'attribute' );
651
678
 
652
679
  }
653
680
 
@@ -756,6 +783,45 @@ ${ flowData.code }
756
783
 
757
784
  }
758
785
 
786
+ getScopedArray( name, scope, bufferType, bufferCount ) {
787
+
788
+ if ( this.scopedArrays.has( name ) === false ) {
789
+
790
+ this.scopedArrays.set( name, {
791
+ name,
792
+ scope,
793
+ bufferType,
794
+ bufferCount
795
+ } );
796
+
797
+ }
798
+
799
+ return name;
800
+
801
+ }
802
+
803
+ getScopedArrays( shaderStage ) {
804
+
805
+ if ( shaderStage !== 'compute' ) {
806
+
807
+ return;
808
+
809
+ }
810
+
811
+ const snippets = [];
812
+
813
+ for ( const { name, scope, bufferType, bufferCount } of this.scopedArrays.values() ) {
814
+
815
+ const type = this.getType( bufferType );
816
+
817
+ snippets.push( `var<${scope}> ${name}: array< ${type}, ${bufferCount} >;` );
818
+
819
+ }
820
+
821
+ return snippets.join( '\n' );
822
+
823
+ }
824
+
759
825
  getAttributes( shaderStage ) {
760
826
 
761
827
  const snippets = [];
@@ -767,6 +833,13 @@ ${ flowData.code }
767
833
  this.getBuiltin( 'local_invocation_id', 'localId', 'vec3<u32>', 'attribute' );
768
834
  this.getBuiltin( 'num_workgroups', 'numWorkgroups', 'vec3<u32>', 'attribute' );
769
835
 
836
+ if ( this.renderer.hasFeature( 'subgroups' ) ) {
837
+
838
+ this.enableDirective( 'subgroups', shaderStage );
839
+ this.getBuiltin( 'subgroup_size', 'subgroupSize', 'u32', 'attribute' );
840
+
841
+ }
842
+
770
843
  }
771
844
 
772
845
  if ( shaderStage === 'vertex' || shaderStage === 'compute' ) {
@@ -926,8 +999,8 @@ ${ flowData.code }
926
999
 
927
1000
  for ( const uniform of uniforms ) {
928
1001
 
929
- const groundName = uniform.groupNode.name;
930
- const uniformIndexes = this.bindingsIndexes[ groundName ];
1002
+ const groupName = uniform.groupNode.name;
1003
+ const uniformIndexes = this.bindingsIndexes[ groupName ];
931
1004
 
932
1005
  if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
933
1006
 
@@ -1001,7 +1074,8 @@ ${ flowData.code }
1001
1074
  const bufferCount = bufferNode.bufferCount;
1002
1075
 
1003
1076
  const bufferCountSnippet = bufferCount > 0 ? ', ' + bufferCount : '';
1004
- const bufferSnippet = `\t${ uniform.name } : array< ${ bufferType }${ bufferCountSnippet } >\n`;
1077
+ const bufferTypeSnippet = bufferNode.isAtomic ? `atomic<${bufferType}>` : `${bufferType}`;
1078
+ const bufferSnippet = `\t${ uniform.name } : array< ${ bufferTypeSnippet }${ bufferCountSnippet } >\n`;
1005
1079
  const bufferAccessMode = bufferNode.isStorageBufferNode ? `storage, ${ this.getStorageAccess( bufferNode ) }` : 'uniform';
1006
1080
 
1007
1081
  bufferSnippets.push( this._getWGSLStructBinding( 'NodeBuffer_' + bufferNode.id, bufferSnippet, bufferAccessMode, uniformIndexes.binding ++, uniformIndexes.group ) );
@@ -1043,6 +1117,8 @@ ${ flowData.code }
1043
1117
 
1044
1118
  const shadersData = this.material !== null ? { fragment: {}, vertex: {} } : { compute: {} };
1045
1119
 
1120
+ this.sortBindingGroups();
1121
+
1046
1122
  for ( const shaderStage in shadersData ) {
1047
1123
 
1048
1124
  const stageData = shadersData[ shaderStage ];
@@ -1053,6 +1129,7 @@ ${ flowData.code }
1053
1129
  stageData.vars = this.getVars( shaderStage );
1054
1130
  stageData.codes = this.getCodes( shaderStage );
1055
1131
  stageData.directives = this.getDirectives( shaderStage );
1132
+ stageData.scopedArrays = this.getScopedArrays( shaderStage );
1056
1133
 
1057
1134
  //
1058
1135
 
@@ -1244,8 +1321,8 @@ fn main( ${shaderData.attributes} ) -> VaryingsStruct {
1244
1321
  _getWGSLFragmentCode( shaderData ) {
1245
1322
 
1246
1323
  return `${ this.getSignature() }
1247
-
1248
- diagnostic( off, derivative_uniformity );
1324
+ // global
1325
+ ${ diagnostics }
1249
1326
 
1250
1327
  // uniforms
1251
1328
  ${shaderData.uniforms}
@@ -1279,6 +1356,9 @@ ${shaderData.directives}
1279
1356
  // system
1280
1357
  var<private> instanceIndex : u32;
1281
1358
 
1359
+ // locals
1360
+ ${shaderData.scopedArrays}
1361
+
1282
1362
  // uniforms
1283
1363
  ${shaderData.uniforms}
1284
1364
 
@@ -224,22 +224,12 @@ class WebGPUAttributeUtils {
224
224
  const bufferGPU = data.buffer;
225
225
  const size = bufferGPU.size;
226
226
 
227
- let readBufferGPU = data.readBuffer;
228
- let needsUnmap = true;
227
+ const readBufferGPU = device.createBuffer( {
228
+ label: attribute.name,
229
+ size,
230
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
231
+ } );
229
232
 
230
- if ( readBufferGPU === undefined ) {
231
-
232
- readBufferGPU = device.createBuffer( {
233
- label: attribute.name,
234
- size,
235
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
236
- } );
237
-
238
- needsUnmap = false;
239
-
240
- data.readBuffer = readBufferGPU;
241
-
242
- }
243
233
 
244
234
  const cmdEncoder = device.createCommandEncoder( {} );
245
235
 
@@ -251,7 +241,7 @@ class WebGPUAttributeUtils {
251
241
  size
252
242
  );
253
243
 
254
- if ( needsUnmap ) readBufferGPU.unmap();
244
+ readBufferGPU.unmap();
255
245
 
256
246
  const gpuCommands = cmdEncoder.finish();
257
247
  device.queue.submit( [ gpuCommands ] );
@@ -138,7 +138,7 @@ class WebGPUPipelineUtils {
138
138
  },
139
139
  multisample: {
140
140
  count: sampleCount,
141
- alphaToCoverageEnabled: material.alphaToCoverage
141
+ alphaToCoverageEnabled: material.alphaToCoverage && sampleCount > 1
142
142
  },
143
143
  layout: device.createPipelineLayout( {
144
144
  bindGroupLayouts
@@ -122,6 +122,8 @@ class WebGPUTextureUtils {
122
122
  const dimension = this._getDimension( texture );
123
123
  const format = texture.internalFormat || options.format || getFormat( texture, backend.device );
124
124
 
125
+ textureData.format = format;
126
+
125
127
  let sampleCount = options.sampleCount !== undefined ? options.sampleCount : 1;
126
128
 
127
129
  sampleCount = backend.utils.getSampleCount( sampleCount );
@@ -369,7 +371,7 @@ class WebGPUTextureUtils {
369
371
 
370
372
  }
371
373
 
372
- async copyTextureToBuffer( texture, x, y, width, height ) {
374
+ async copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
373
375
 
374
376
  const device = this.backend.device;
375
377
 
@@ -393,7 +395,7 @@ class WebGPUTextureUtils {
393
395
  encoder.copyTextureToBuffer(
394
396
  {
395
397
  texture: textureGPU,
396
- origin: { x, y },
398
+ origin: { x, y, z: faceIndex },
397
399
  },
398
400
  {
399
401
  buffer: readBuffer,
@@ -792,9 +794,9 @@ class WebGPUTextureUtils {
792
794
  if ( format === GPUTextureFormat.RG16Sint ) return Int16Array;
793
795
  if ( format === GPUTextureFormat.RGBA16Uint ) return Uint16Array;
794
796
  if ( format === GPUTextureFormat.RGBA16Sint ) return Int16Array;
795
- if ( format === GPUTextureFormat.R16Float ) return Float32Array;
796
- if ( format === GPUTextureFormat.RG16Float ) return Float32Array;
797
- if ( format === GPUTextureFormat.RGBA16Float ) return Float32Array;
797
+ if ( format === GPUTextureFormat.R16Float ) return Uint16Array;
798
+ if ( format === GPUTextureFormat.RG16Float ) return Uint16Array;
799
+ if ( format === GPUTextureFormat.RGBA16Float ) return Uint16Array;
798
800
 
799
801
 
800
802
  if ( format === GPUTextureFormat.R32Uint ) return Uint32Array;
@@ -32,7 +32,7 @@ class WebGPUUtils {
32
32
 
33
33
  getTextureFormatGPU( texture ) {
34
34
 
35
- return this.backend.get( texture ).texture.format;
35
+ return this.backend.get( texture ).format;
36
36
 
37
37
  }
38
38