super-three 0.155.0 → 0.157.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +361 -324
- package/build/three.js +361 -324
- package/build/three.min.js +2 -2
- package/build/three.module.js +354 -323
- package/build/three.module.min.js +1 -1
- package/examples/jsm/capabilities/WebGL.js +17 -0
- package/examples/jsm/controls/DragControls.js +3 -2
- package/examples/jsm/controls/OrbitControls.js +13 -5
- package/examples/jsm/csm/CSMShader.js +59 -21
- package/examples/jsm/exporters/EXRExporter.js +102 -24
- package/examples/jsm/exporters/GLTFExporter.js +1 -1
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/libs/tween.module.js +790 -735
- package/examples/jsm/libs/utif.module.js +1644 -1558
- package/examples/jsm/lights/LightProbeGenerator.js +37 -3
- package/examples/jsm/lines/LineMaterial.js +90 -156
- package/examples/jsm/loaders/3DMLoader.js +378 -104
- package/examples/jsm/loaders/DDSLoader.js +46 -3
- package/examples/jsm/loaders/EXRLoader.js +4 -4
- package/examples/jsm/loaders/FBXLoader.js +2 -0
- package/examples/jsm/loaders/GLTFLoader.js +18 -8
- package/examples/jsm/loaders/KTX2Loader.js +126 -77
- package/examples/jsm/loaders/LDrawLoader.js +22 -16
- package/examples/jsm/loaders/LogLuvLoader.js +2 -2
- package/examples/jsm/loaders/MMDLoader.js +10 -7
- package/examples/jsm/loaders/RGBELoader.js +48 -66
- package/examples/jsm/loaders/STLLoader.js +7 -0
- package/examples/jsm/loaders/USDZLoader.js +215 -12
- package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
- package/examples/jsm/nodes/Nodes.js +8 -1
- package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +30 -4
- package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
- package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +19 -4
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +4 -5
- package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +29 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +23 -13
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +12 -9
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
- package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
- package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
- package/examples/jsm/nodes/accessors/Object3DNode.js +3 -3
- package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
- package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
- package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
- package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
- package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +18 -8
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
- package/examples/jsm/nodes/accessors/UVNode.js +1 -1
- package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
- package/examples/jsm/nodes/code/CodeNode.js +1 -1
- package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
- package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
- package/examples/jsm/nodes/code/FunctionNode.js +18 -7
- package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
- package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
- package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
- package/examples/jsm/nodes/core/AttributeNode.js +3 -3
- package/examples/jsm/nodes/core/BypassNode.js +1 -1
- package/examples/jsm/nodes/core/CacheNode.js +1 -1
- package/examples/jsm/nodes/core/ConstNode.js +1 -1
- package/examples/jsm/nodes/core/ContextNode.js +2 -2
- package/examples/jsm/nodes/core/IndexNode.js +1 -1
- package/examples/jsm/nodes/core/InputNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +45 -14
- package/examples/jsm/nodes/core/NodeBuilder.js +83 -15
- package/examples/jsm/nodes/core/NodeFrame.js +37 -14
- package/examples/jsm/nodes/core/NodeUniform.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +62 -0
- package/examples/jsm/nodes/core/PropertyNode.js +3 -1
- package/examples/jsm/nodes/core/StackNode.js +5 -5
- package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/UniformNode.js +3 -1
- package/examples/jsm/nodes/core/VarNode.js +1 -1
- package/examples/jsm/nodes/core/VaryingNode.js +1 -1
- package/examples/jsm/nodes/core/constants.js +1 -1
- package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
- package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
- package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
- package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
- package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +21 -7
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
- package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
- package/examples/jsm/nodes/fog/FogNode.js +2 -2
- package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AONode.js +2 -2
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/LightNode.js +2 -2
- package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
- package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
- package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
- package/examples/jsm/nodes/materials/Materials.js +2 -0
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/NodeMaterial.js +39 -29
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/math/CondNode.js +1 -1
- package/examples/jsm/nodes/math/HashNode.js +34 -0
- package/examples/jsm/nodes/math/MathNode.js +2 -2
- package/examples/jsm/nodes/math/OperatorNode.js +1 -1
- package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +85 -28
- package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
- package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
- package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
- package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
- package/examples/jsm/nodes/utils/JoinNode.js +1 -1
- package/examples/jsm/nodes/utils/LoopNode.js +11 -11
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/OscNode.js +2 -2
- package/examples/jsm/nodes/utils/PackingNode.js +2 -2
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
- package/examples/jsm/nodes/utils/SetNode.js +62 -0
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +2 -2
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
- package/examples/jsm/nodes/utils/TimerNode.js +2 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
- package/examples/jsm/objects/Sky.js +1 -3
- package/examples/jsm/postprocessing/FilmPass.js +3 -5
- package/examples/jsm/postprocessing/OutputPass.js +3 -2
- package/examples/jsm/postprocessing/RenderPass.js +30 -12
- package/examples/jsm/postprocessing/SAOPass.js +23 -98
- package/examples/jsm/postprocessing/SSAOPass.js +10 -30
- package/examples/jsm/renderers/common/Backend.js +11 -8
- package/examples/jsm/renderers/common/Background.js +2 -2
- package/examples/jsm/renderers/common/Binding.js +6 -0
- package/examples/jsm/renderers/common/Bindings.js +4 -5
- package/examples/jsm/renderers/common/Pipelines.js +9 -9
- package/examples/jsm/renderers/common/RenderContext.js +3 -0
- package/examples/jsm/renderers/common/RenderContexts.js +26 -1
- package/examples/jsm/renderers/common/RenderList.js +12 -4
- package/examples/jsm/renderers/common/RenderObject.js +43 -15
- package/examples/jsm/renderers/common/RenderObjects.js +8 -14
- package/examples/jsm/renderers/common/Renderer.js +52 -16
- package/examples/jsm/renderers/common/SampledTexture.js +6 -3
- package/examples/jsm/renderers/common/Sampler.js +1 -1
- package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
- package/examples/jsm/renderers/common/StorageTexture.js +19 -0
- package/examples/jsm/renderers/common/Textures.js +166 -21
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +21 -11
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -7
- package/examples/jsm/renderers/common/nodes/Nodes.js +79 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +702 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +207 -20
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +212 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
- package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +4 -4
- package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +14 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +282 -43
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +93 -60
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -14
- package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +205 -284
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
- package/examples/jsm/shaders/FilmShader.js +11 -54
- package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
- package/examples/jsm/shaders/MMDToonShader.js +4 -4
- package/examples/jsm/shaders/OutputShader.js +2 -2
- package/examples/jsm/shaders/SAOShader.js +0 -13
- package/examples/jsm/shaders/SSAOShader.js +33 -26
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
- package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
- package/package.json +1 -1
- package/src/Three.js +1 -2
- package/src/animation/AnimationUtils.js +3 -20
- package/src/animation/KeyframeTrack.js +8 -8
- package/src/audio/Audio.js +6 -0
- package/src/cameras/Camera.js +1 -5
- package/src/cameras/CubeCamera.js +14 -8
- package/src/constants.js +10 -1
- package/src/core/Object3D.js +1 -14
- package/src/core/RenderTarget.js +16 -7
- package/src/core/UniformsGroup.js +2 -2
- package/src/extras/core/CurvePath.js +4 -1
- package/src/loaders/DataTextureLoader.js +0 -2
- package/src/loaders/MaterialLoader.js +1 -1
- package/src/loaders/ObjectLoader.js +6 -0
- package/src/materials/Material.js +10 -10
- package/src/math/Color.js +1 -5
- package/src/math/ColorManagement.js +82 -60
- package/src/math/Vector2.js +2 -2
- package/src/math/Vector3.js +3 -3
- package/src/math/Vector4.js +4 -4
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Sprite.js +2 -2
- package/src/renderers/WebGLRenderer.js +42 -51
- package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +2 -2
- package/src/renderers/webgl/WebGLBackground.js +9 -17
- package/src/renderers/webgl/WebGLLights.js +14 -3
- package/src/renderers/webgl/WebGLProgram.js +36 -5
- package/src/renderers/webgl/WebGLPrograms.js +9 -1
- package/src/renderers/webgl/WebGLTextures.js +19 -8
- package/src/renderers/webgl/WebGLUtils.js +25 -20
- package/src/scenes/Fog.js +1 -0
- package/src/scenes/FogExp2.js +1 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +2 -2
- package/src/utils.js +9 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
- package/src/lights/AmbientLightProbe.js +0 -21
- package/src/lights/HemisphereLightProbe.js +0 -30
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
|
@@ -62,6 +62,7 @@ class WebGPUBackend extends Backend {
|
|
|
62
62
|
this.bindingUtils = new WebGPUBindingUtils( this );
|
|
63
63
|
this.pipelineUtils = new WebGPUPipelineUtils( this );
|
|
64
64
|
this.textureUtils = new WebGPUTextureUtils( this );
|
|
65
|
+
this.occludedResolveCache = new Map();
|
|
65
66
|
|
|
66
67
|
}
|
|
67
68
|
|
|
@@ -135,6 +136,32 @@ class WebGPUBackend extends Backend {
|
|
|
135
136
|
const renderContextData = this.get( renderContext );
|
|
136
137
|
|
|
137
138
|
const device = this.device;
|
|
139
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
140
|
+
|
|
141
|
+
let occlusionQuerySet;
|
|
142
|
+
|
|
143
|
+
if ( occlusionQueryCount > 0 ) {
|
|
144
|
+
|
|
145
|
+
if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
|
|
146
|
+
if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
|
|
147
|
+
|
|
148
|
+
// Get a reference to the array of objects with queries. The renderContextData property
|
|
149
|
+
// can be changed by another render pass before the buffer.mapAsyc() completes.
|
|
150
|
+
renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
|
|
151
|
+
renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
|
|
152
|
+
renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
|
|
153
|
+
|
|
154
|
+
//
|
|
155
|
+
|
|
156
|
+
occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount } );
|
|
157
|
+
|
|
158
|
+
renderContextData.occlusionQuerySet = occlusionQuerySet;
|
|
159
|
+
renderContextData.occlusionQueryIndex = 0;
|
|
160
|
+
renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
|
|
161
|
+
|
|
162
|
+
renderContextData.lastOcclusionObject = null;
|
|
163
|
+
|
|
164
|
+
}
|
|
138
165
|
|
|
139
166
|
const descriptor = {
|
|
140
167
|
colorAttachments: [ {
|
|
@@ -142,7 +169,8 @@ class WebGPUBackend extends Backend {
|
|
|
142
169
|
} ],
|
|
143
170
|
depthStencilAttachment: {
|
|
144
171
|
view: null
|
|
145
|
-
}
|
|
172
|
+
},
|
|
173
|
+
occlusionQuerySet
|
|
146
174
|
};
|
|
147
175
|
|
|
148
176
|
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
@@ -150,30 +178,51 @@ class WebGPUBackend extends Backend {
|
|
|
150
178
|
|
|
151
179
|
const antialias = this.parameters.antialias;
|
|
152
180
|
|
|
153
|
-
if ( renderContext.
|
|
181
|
+
if ( renderContext.textures !== null ) {
|
|
154
182
|
|
|
155
|
-
const
|
|
156
|
-
const depthTextureData = this.get( renderContext.depthTexture );
|
|
183
|
+
const textures = renderContext.textures;
|
|
157
184
|
|
|
158
|
-
|
|
159
|
-
baseMipLevel: 0,
|
|
160
|
-
mipLevelCount: 1,
|
|
161
|
-
baseArrayLayer: renderContext.activeCubeFace,
|
|
162
|
-
dimension: GPUTextureViewDimension.TwoD
|
|
163
|
-
} );
|
|
185
|
+
descriptor.colorAttachments = [];
|
|
164
186
|
|
|
165
|
-
|
|
187
|
+
const colorAttachments = descriptor.colorAttachments;
|
|
166
188
|
|
|
167
|
-
|
|
168
|
-
colorAttachment.resolveTarget = view;
|
|
189
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
169
190
|
|
|
170
|
-
|
|
191
|
+
const textureData = this.get( textures[ i ] );
|
|
171
192
|
|
|
172
|
-
|
|
173
|
-
|
|
193
|
+
const textureView = textureData.texture.createView( {
|
|
194
|
+
baseMipLevel: renderContext.activeMipmapLevel,
|
|
195
|
+
mipLevelCount: 1,
|
|
196
|
+
baseArrayLayer: renderContext.activeCubeFace,
|
|
197
|
+
dimension: GPUTextureViewDimension.TwoD
|
|
198
|
+
} );
|
|
199
|
+
|
|
200
|
+
let view, resolveTarget;
|
|
201
|
+
|
|
202
|
+
if ( textureData.msaaTexture !== undefined ) {
|
|
203
|
+
|
|
204
|
+
view = textureData.msaaTexture.createView();
|
|
205
|
+
resolveTarget = textureView;
|
|
206
|
+
|
|
207
|
+
} else {
|
|
208
|
+
|
|
209
|
+
view = textureView;
|
|
210
|
+
resolveTarget = undefined;
|
|
211
|
+
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
colorAttachments.push( {
|
|
215
|
+
view,
|
|
216
|
+
resolveTarget,
|
|
217
|
+
loadOp: GPULoadOp.Load,
|
|
218
|
+
storeOp: GPUStoreOp.Store
|
|
219
|
+
|
|
220
|
+
} );
|
|
174
221
|
|
|
175
222
|
}
|
|
176
223
|
|
|
224
|
+
const depthTextureData = this.get( renderContext.depthTexture );
|
|
225
|
+
|
|
177
226
|
depthStencilAttachment.view = depthTextureData.texture.createView();
|
|
178
227
|
|
|
179
228
|
if ( renderContext.stencil && renderContext.depthTexture.format === DepthFormat ) {
|
|
@@ -200,16 +249,44 @@ class WebGPUBackend extends Backend {
|
|
|
200
249
|
|
|
201
250
|
}
|
|
202
251
|
|
|
203
|
-
if ( renderContext.
|
|
252
|
+
if ( renderContext.textures !== null ) {
|
|
253
|
+
|
|
254
|
+
const colorAttachments = descriptor.colorAttachments;
|
|
255
|
+
|
|
256
|
+
for ( let i = 0; i < colorAttachments.length; i ++ ) {
|
|
257
|
+
|
|
258
|
+
const colorAttachment = colorAttachments[ i ];
|
|
259
|
+
|
|
260
|
+
if ( renderContext.clearColor ) {
|
|
261
|
+
|
|
262
|
+
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
263
|
+
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
264
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
265
|
+
|
|
266
|
+
} else {
|
|
267
|
+
|
|
268
|
+
colorAttachment.loadOp = GPULoadOp.Load;
|
|
269
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
270
|
+
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
}
|
|
204
274
|
|
|
205
|
-
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
206
|
-
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
207
|
-
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
208
275
|
|
|
209
276
|
} else {
|
|
210
277
|
|
|
211
|
-
|
|
212
|
-
|
|
278
|
+
if ( renderContext.clearColor ) {
|
|
279
|
+
|
|
280
|
+
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
281
|
+
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
282
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
283
|
+
|
|
284
|
+
} else {
|
|
285
|
+
|
|
286
|
+
colorAttachment.loadOp = GPULoadOp.Load;
|
|
287
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
288
|
+
|
|
289
|
+
}
|
|
213
290
|
|
|
214
291
|
}
|
|
215
292
|
|
|
@@ -259,7 +336,7 @@ class WebGPUBackend extends Backend {
|
|
|
259
336
|
renderContextData.descriptor = descriptor;
|
|
260
337
|
renderContextData.encoder = encoder;
|
|
261
338
|
renderContextData.currentPass = currentPass;
|
|
262
|
-
renderContextData.
|
|
339
|
+
renderContextData.currentSets = { attributes: {} };
|
|
263
340
|
|
|
264
341
|
//
|
|
265
342
|
|
|
@@ -273,7 +350,7 @@ class WebGPUBackend extends Backend {
|
|
|
273
350
|
|
|
274
351
|
const { x, y, width, height } = renderContext.scissorValue;
|
|
275
352
|
|
|
276
|
-
currentPass.setScissorRect( x, y, width, height );
|
|
353
|
+
currentPass.setScissorRect( x, renderContext.height - height - y, width, height );
|
|
277
354
|
|
|
278
355
|
}
|
|
279
356
|
|
|
@@ -282,16 +359,123 @@ class WebGPUBackend extends Backend {
|
|
|
282
359
|
finishRender( renderContext ) {
|
|
283
360
|
|
|
284
361
|
const renderContextData = this.get( renderContext );
|
|
362
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
363
|
+
|
|
364
|
+
if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
|
|
365
|
+
|
|
366
|
+
renderContextData.currentPass.endOcclusionQuery();
|
|
367
|
+
|
|
368
|
+
}
|
|
285
369
|
|
|
286
370
|
renderContextData.currentPass.end();
|
|
287
371
|
|
|
372
|
+
if ( occlusionQueryCount > 0 ) {
|
|
373
|
+
|
|
374
|
+
const bufferSize = occlusionQueryCount * 8; // 8 byte entries for query results
|
|
375
|
+
|
|
376
|
+
//
|
|
377
|
+
|
|
378
|
+
let queryResolveBuffer = this.occludedResolveCache.get( bufferSize );
|
|
379
|
+
|
|
380
|
+
if ( queryResolveBuffer === undefined ) {
|
|
381
|
+
|
|
382
|
+
queryResolveBuffer = this.device.createBuffer(
|
|
383
|
+
{
|
|
384
|
+
size: bufferSize,
|
|
385
|
+
usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
|
|
386
|
+
}
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
this.occludedResolveCache.set( bufferSize, queryResolveBuffer );
|
|
390
|
+
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
//
|
|
394
|
+
|
|
395
|
+
const readBuffer = this.device.createBuffer(
|
|
396
|
+
{
|
|
397
|
+
size: bufferSize,
|
|
398
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
399
|
+
}
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
// two buffers required here - WebGPU doesn't allow usage of QUERY_RESOLVE & MAP_READ to be combined
|
|
403
|
+
renderContextData.encoder.resolveQuerySet( renderContextData.occlusionQuerySet, 0, occlusionQueryCount, queryResolveBuffer, 0 );
|
|
404
|
+
renderContextData.encoder.copyBufferToBuffer( queryResolveBuffer, 0, readBuffer, 0, bufferSize );
|
|
405
|
+
|
|
406
|
+
renderContextData.occlusionQueryBuffer = readBuffer;
|
|
407
|
+
|
|
408
|
+
//
|
|
409
|
+
|
|
410
|
+
this.resolveOccludedAsync( renderContext );
|
|
411
|
+
|
|
412
|
+
}
|
|
413
|
+
|
|
288
414
|
this.device.queue.submit( [ renderContextData.encoder.finish() ] );
|
|
289
415
|
|
|
290
416
|
//
|
|
291
417
|
|
|
292
|
-
if ( renderContext.
|
|
418
|
+
if ( renderContext.textures !== null ) {
|
|
419
|
+
|
|
420
|
+
const textures = renderContext.textures;
|
|
421
|
+
|
|
422
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
423
|
+
|
|
424
|
+
const texture = textures[ i ];
|
|
425
|
+
|
|
426
|
+
if ( texture.generateMipmaps === true ) {
|
|
293
427
|
|
|
294
|
-
|
|
428
|
+
this.textureUtils.generateMipmaps( texture );
|
|
429
|
+
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
isOccluded( renderContext, object ) {
|
|
439
|
+
|
|
440
|
+
const renderContextData = this.get( renderContext );
|
|
441
|
+
|
|
442
|
+
return renderContextData.occluded && renderContextData.occluded.has( object );
|
|
443
|
+
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
async resolveOccludedAsync( renderContext ) {
|
|
447
|
+
|
|
448
|
+
const renderContextData = this.get( renderContext );
|
|
449
|
+
|
|
450
|
+
// handle occlusion query results
|
|
451
|
+
|
|
452
|
+
const { currentOcclusionQueryBuffer, currentOcclusionQueryObjects } = renderContextData;
|
|
453
|
+
|
|
454
|
+
if ( currentOcclusionQueryBuffer && currentOcclusionQueryObjects ) {
|
|
455
|
+
|
|
456
|
+
const occluded = new WeakSet();
|
|
457
|
+
|
|
458
|
+
renderContextData.currentOcclusionQueryObjects = null;
|
|
459
|
+
renderContextData.currentOcclusionQueryBuffer = null;
|
|
460
|
+
|
|
461
|
+
await currentOcclusionQueryBuffer.mapAsync( GPUMapMode.READ );
|
|
462
|
+
|
|
463
|
+
const buffer = currentOcclusionQueryBuffer.getMappedRange();
|
|
464
|
+
const results = new BigUint64Array( buffer );
|
|
465
|
+
|
|
466
|
+
for ( let i = 0; i < currentOcclusionQueryObjects.length; i++ ) {
|
|
467
|
+
|
|
468
|
+
if ( results[ i ] !== 0n ) {
|
|
469
|
+
|
|
470
|
+
occluded.add( currentOcclusionQueryObjects[ i ] );
|
|
471
|
+
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
currentOcclusionQueryBuffer.destroy();
|
|
477
|
+
|
|
478
|
+
renderContextData.occluded = occluded;
|
|
295
479
|
|
|
296
480
|
}
|
|
297
481
|
|
|
@@ -300,9 +484,9 @@ class WebGPUBackend extends Backend {
|
|
|
300
484
|
updateViewport( renderContext ) {
|
|
301
485
|
|
|
302
486
|
const { currentPass } = this.get( renderContext );
|
|
303
|
-
|
|
487
|
+
let { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
|
|
304
488
|
|
|
305
|
-
currentPass.setViewport( x, y, width, height, minDepth, maxDepth );
|
|
489
|
+
currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
|
|
306
490
|
|
|
307
491
|
}
|
|
308
492
|
|
|
@@ -317,6 +501,7 @@ class WebGPUBackend extends Backend {
|
|
|
317
501
|
stencil = stencil && renderContext.stencil;
|
|
318
502
|
|
|
319
503
|
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
504
|
+
const depthStencilAttachment = descriptor.depthStencilAttachment;
|
|
320
505
|
|
|
321
506
|
const antialias = this.parameters.antialias;
|
|
322
507
|
|
|
@@ -340,19 +525,31 @@ class WebGPUBackend extends Backend {
|
|
|
340
525
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
341
526
|
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
342
527
|
|
|
528
|
+
} else {
|
|
529
|
+
|
|
530
|
+
colorAttachment.loadOp = GPULoadOp.Load;
|
|
531
|
+
|
|
343
532
|
}
|
|
344
533
|
|
|
345
534
|
if ( depth ) {
|
|
346
535
|
|
|
347
|
-
|
|
348
|
-
|
|
536
|
+
depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
|
|
537
|
+
depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
|
|
538
|
+
|
|
539
|
+
} else {
|
|
540
|
+
|
|
541
|
+
depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
|
|
349
542
|
|
|
350
543
|
}
|
|
351
544
|
|
|
352
545
|
if ( stencil ) {
|
|
353
546
|
|
|
354
|
-
|
|
355
|
-
|
|
547
|
+
depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
|
|
548
|
+
depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
|
|
549
|
+
|
|
550
|
+
} else {
|
|
551
|
+
|
|
552
|
+
depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
|
|
356
553
|
|
|
357
554
|
}
|
|
358
555
|
|
|
@@ -412,12 +609,19 @@ class WebGPUBackend extends Backend {
|
|
|
412
609
|
const bindingsData = this.get( renderObject.getBindings() );
|
|
413
610
|
const contextData = this.get( context );
|
|
414
611
|
const pipelineGPU = this.get( pipeline ).pipeline;
|
|
415
|
-
const
|
|
612
|
+
const currentSets = contextData.currentSets;
|
|
416
613
|
|
|
417
614
|
// pipeline
|
|
418
615
|
|
|
419
616
|
const passEncoderGPU = contextData.currentPass;
|
|
420
|
-
|
|
617
|
+
|
|
618
|
+
if ( currentSets.pipeline !== pipelineGPU ) {
|
|
619
|
+
|
|
620
|
+
passEncoderGPU.setPipeline( pipelineGPU );
|
|
621
|
+
|
|
622
|
+
currentSets.pipeline = pipelineGPU;
|
|
623
|
+
|
|
624
|
+
}
|
|
421
625
|
|
|
422
626
|
// bind group
|
|
423
627
|
|
|
@@ -434,14 +638,14 @@ class WebGPUBackend extends Backend {
|
|
|
434
638
|
|
|
435
639
|
if ( hasIndex === true ) {
|
|
436
640
|
|
|
437
|
-
if (
|
|
438
|
-
|
|
641
|
+
if ( currentSets.index !== index ) {
|
|
642
|
+
|
|
439
643
|
const buffer = this.get( index ).buffer;
|
|
440
644
|
const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
|
|
441
645
|
|
|
442
646
|
passEncoderGPU.setIndexBuffer( buffer, indexFormat );
|
|
443
647
|
|
|
444
|
-
|
|
648
|
+
currentSets.index = index;
|
|
445
649
|
|
|
446
650
|
}
|
|
447
651
|
|
|
@@ -455,12 +659,40 @@ class WebGPUBackend extends Backend {
|
|
|
455
659
|
|
|
456
660
|
const vertexBuffer = vertexBuffers[ i ];
|
|
457
661
|
|
|
458
|
-
if (
|
|
662
|
+
if ( currentSets.attributes[ i ] !== vertexBuffer ) {
|
|
459
663
|
|
|
460
664
|
const buffer = this.get( vertexBuffer ).buffer;
|
|
461
665
|
passEncoderGPU.setVertexBuffer( i, buffer );
|
|
462
666
|
|
|
463
|
-
|
|
667
|
+
currentSets.attributes[ i ] = vertexBuffer;
|
|
668
|
+
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
// occlusion queries - handle multiple consecutive draw calls for an object
|
|
674
|
+
|
|
675
|
+
if ( contextData.occlusionQuerySet !== undefined ) {
|
|
676
|
+
|
|
677
|
+
const lastObject = contextData.lastOcclusionObject;
|
|
678
|
+
|
|
679
|
+
if ( lastObject !== object ) {
|
|
680
|
+
|
|
681
|
+
if ( lastObject !== null && lastObject.occlusionTest === true ) {
|
|
682
|
+
|
|
683
|
+
passEncoderGPU.endOcclusionQuery();
|
|
684
|
+
contextData.occlusionQueryIndex ++;
|
|
685
|
+
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if ( object.occlusionTest === true ) {
|
|
689
|
+
|
|
690
|
+
passEncoderGPU.beginOcclusionQuery( contextData.occlusionQueryIndex );
|
|
691
|
+
contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
|
|
692
|
+
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
contextData.lastOcclusionObject = object;
|
|
464
696
|
|
|
465
697
|
}
|
|
466
698
|
|
|
@@ -472,6 +704,7 @@ class WebGPUBackend extends Backend {
|
|
|
472
704
|
const firstVertex = drawRange.start;
|
|
473
705
|
|
|
474
706
|
const instanceCount = this.getInstanceCount( renderObject );
|
|
707
|
+
if ( instanceCount === 0 ) return;
|
|
475
708
|
|
|
476
709
|
if ( hasIndex === true ) {
|
|
477
710
|
|
|
@@ -571,9 +804,15 @@ class WebGPUBackend extends Backend {
|
|
|
571
804
|
|
|
572
805
|
}
|
|
573
806
|
|
|
574
|
-
updateTexture( texture ) {
|
|
807
|
+
updateTexture( texture, options ) {
|
|
808
|
+
|
|
809
|
+
this.textureUtils.updateTexture( texture, options );
|
|
810
|
+
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
generateMipmaps( texture ) {
|
|
575
814
|
|
|
576
|
-
this.textureUtils.
|
|
815
|
+
this.textureUtils.generateMipmaps( texture );
|
|
577
816
|
|
|
578
817
|
}
|
|
579
818
|
|
|
@@ -756,7 +995,7 @@ class WebGPUBackend extends Backend {
|
|
|
756
995
|
if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
|
|
757
996
|
|
|
758
997
|
renderContextData.currentPass = encoder.beginRenderPass( descriptor );
|
|
759
|
-
renderContextData.
|
|
998
|
+
renderContextData.currentSets = { attributes: {} };
|
|
760
999
|
|
|
761
1000
|
}
|
|
762
1001
|
|
|
@@ -801,7 +1040,7 @@ class WebGPUBackend extends Backend {
|
|
|
801
1040
|
depthTexture.image.width = width;
|
|
802
1041
|
depthTexture.image.height = height;
|
|
803
1042
|
|
|
804
|
-
this.textureUtils.createTexture( depthTexture, { sampleCount: this.parameters.sampleCount } );
|
|
1043
|
+
this.textureUtils.createTexture( depthTexture, { sampleCount: this.parameters.sampleCount, width, height } );
|
|
805
1044
|
|
|
806
1045
|
return this.get( depthTexture ).texture;
|
|
807
1046
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import Renderer from '../common/Renderer.js';
|
|
2
|
+
import WebGLBackend from '../webgl/WebGLBackend.js';
|
|
2
3
|
import WebGPUBackend from './WebGPUBackend.js';
|
|
4
|
+
import WebGPU from '../../capabilities/WebGPU.js';
|
|
3
5
|
/*
|
|
4
6
|
const debugHandler = {
|
|
5
7
|
|
|
@@ -18,9 +20,23 @@ class WebGPURenderer extends Renderer {
|
|
|
18
20
|
|
|
19
21
|
constructor( parameters = {} ) {
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
//const backend = new Proxy( new WebGPUBackend( parameters ), debugHandler );
|
|
23
|
+
let BackendClass;
|
|
23
24
|
|
|
25
|
+
if ( WebGPU.isAvailable() ) {
|
|
26
|
+
|
|
27
|
+
BackendClass = WebGPUBackend;
|
|
28
|
+
|
|
29
|
+
} else {
|
|
30
|
+
|
|
31
|
+
BackendClass = WebGLBackend;
|
|
32
|
+
|
|
33
|
+
console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const backend = new BackendClass( parameters );
|
|
38
|
+
|
|
39
|
+
//super( new Proxy( backend, debugHandler ) );
|
|
24
40
|
super( backend );
|
|
25
41
|
|
|
26
42
|
this.isWebGPURenderer = true;
|