@plastic-software/three 0.178.0 → 0.180.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/README.md +1 -1
- package/build/three.cjs +950 -230
- package/build/three.core.js +754 -138
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +197 -96
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +99 -25
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +4586 -1499
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +4544 -1499
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +2 -3
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +7 -7
- package/examples/jsm/controls/DragControls.js +6 -56
- package/examples/jsm/controls/FirstPersonControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +0 -8
- package/examples/jsm/csm/CSMShadowNode.js +4 -4
- package/examples/jsm/environments/RoomEnvironment.js +8 -3
- package/examples/jsm/exporters/GLTFExporter.js +30 -22
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +676 -299
- package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
- package/examples/jsm/interactive/HTMLMesh.js +5 -3
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
- package/examples/jsm/lights/LightProbeGenerator.js +14 -3
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +1 -1
- package/examples/jsm/loaders/EXRLoader.js +210 -22
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +9 -5
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +112 -32
- package/examples/jsm/loaders/MaterialXLoader.js +212 -30
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/TTFLoader.js +13 -1
- package/examples/jsm/loaders/USDLoader.js +219 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -892
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +741 -0
- package/examples/jsm/loaders/usd/USDCParser.js +17 -0
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +2 -2
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +3 -3
- package/examples/jsm/objects/SkyMesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +14 -5
- package/examples/jsm/postprocessing/GTAOPass.js +10 -9
- package/examples/jsm/postprocessing/OutlinePass.js +17 -17
- package/examples/jsm/postprocessing/SSAOPass.js +10 -9
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +23 -20
- package/examples/jsm/transpiler/TSLEncoder.js +2 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +27 -4
- package/examples/jsm/tsl/display/BloomNode.js +7 -6
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +439 -90
- package/examples/jsm/tsl/display/GTAONode.js +8 -0
- package/examples/jsm/tsl/display/GaussianBlurNode.js +51 -41
- package/examples/jsm/tsl/display/OutlineNode.js +2 -2
- package/examples/jsm/tsl/display/SSRNode.js +180 -65
- package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +181 -172
- package/examples/jsm/tsl/display/boxBlur.js +64 -0
- package/examples/jsm/tsl/display/hashBlur.js +15 -18
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +1 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/package.json +1 -1
- package/src/Three.Core.js +2 -0
- package/src/Three.TSL.js +98 -24
- package/src/animation/AnimationClip.js +17 -2
- package/src/animation/KeyframeTrack.js +1 -1
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/cameras/Camera.js +14 -0
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/constants.js +11 -3
- package/src/core/BufferGeometry.js +2 -2
- package/{examples/jsm/misc → src/core}/Timer.js +4 -42
- package/src/extras/PMREMGenerator.js +11 -0
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/lib/earcut.js +1 -1
- package/src/helpers/CameraHelper.js +41 -11
- package/src/helpers/SkeletonHelper.js +35 -6
- package/src/lights/LightShadow.js +21 -8
- package/src/lights/PointLightShadow.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/FileLoader.js +25 -2
- package/src/loaders/ImageBitmapLoader.js +23 -0
- package/src/loaders/Loader.js +14 -0
- package/src/loaders/LoadingManager.js +23 -0
- package/src/materials/Material.js +12 -0
- package/src/materials/MeshBasicMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +0 -8
- package/src/materials/nodes/NodeMaterial.js +1 -1
- package/src/materials/nodes/PointsNodeMaterial.js +86 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -2
- package/src/math/ColorManagement.js +7 -1
- package/src/math/Frustum.js +19 -8
- package/src/math/FrustumArray.js +10 -5
- package/src/math/Line3.js +129 -2
- package/src/math/Matrix4.js +48 -27
- package/src/math/Spherical.js +2 -2
- package/src/nodes/Nodes.js +4 -0
- package/src/nodes/TSL.js +4 -0
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +142 -16
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +2 -2
- package/src/nodes/accessors/InstanceNode.js +3 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +19 -4
- package/src/nodes/accessors/SceneNode.js +1 -1
- package/src/nodes/accessors/StorageTextureNode.js +1 -1
- package/src/nodes/accessors/Texture3DNode.js +13 -0
- package/src/nodes/accessors/TextureNode.js +83 -19
- package/src/nodes/code/FunctionCallNode.js +19 -0
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +12 -0
- package/src/nodes/core/AssignNode.js +6 -2
- package/src/nodes/core/ContextNode.js +44 -1
- package/src/nodes/core/Node.js +30 -22
- package/src/nodes/core/NodeBuilder.js +71 -32
- package/src/nodes/core/NodeFrame.js +1 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +5 -3
- package/src/nodes/core/StackNode.js +71 -4
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformNode.js +79 -14
- package/src/nodes/core/VarNode.js +83 -15
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/PassNode.js +148 -2
- package/src/nodes/display/ScreenNode.js +42 -13
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +94 -4
- package/src/nodes/functions/PhysicalLightingModel.js +2 -2
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +67 -23
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +1 -1
- package/src/nodes/lighting/ProjectorLightNode.js +19 -6
- package/src/nodes/lighting/ShadowFilterNode.js +1 -1
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +165 -1
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +19 -3
- package/src/nodes/math/MathNode.js +72 -60
- package/src/nodes/math/OperatorNode.js +26 -25
- package/src/nodes/tsl/TSLCore.js +477 -142
- package/src/nodes/utils/DebugNode.js +1 -1
- package/src/nodes/utils/EventNode.js +83 -0
- package/src/nodes/utils/JoinNode.js +3 -1
- package/src/nodes/utils/MemberNode.js +58 -7
- package/src/nodes/utils/RTTNode.js +10 -1
- package/src/nodes/utils/ReflectorNode.js +51 -7
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/objects/BatchedMesh.js +6 -4
- package/src/objects/LOD.js +1 -1
- package/src/objects/Sprite.js +2 -2
- package/src/renderers/WebGLRenderer.js +21 -31
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +19 -1
- package/src/renderers/common/Bindings.js +21 -18
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/Color4.js +2 -2
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +60 -5
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderObject.js +14 -2
- package/src/renderers/common/Renderer.js +55 -32
- package/src/renderers/common/SampledTexture.js +4 -72
- package/src/renderers/common/Sampler.js +91 -0
- package/src/renderers/common/Storage3DTexture.js +21 -0
- package/src/renderers/common/StorageArrayTexture.js +21 -0
- package/src/renderers/common/StorageTexture.js +19 -0
- package/src/renderers/common/Textures.js +52 -14
- package/src/renderers/common/TimestampQueryPool.js +3 -3
- package/src/renderers/common/XRManager.js +51 -17
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +5 -5
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLMaterials.js +6 -6
- package/src/renderers/webgl/WebGLProgram.js +24 -18
- package/src/renderers/webgl/WebGLPrograms.js +4 -4
- package/src/renderers/webgl/WebGLShadowMap.js +11 -1
- package/src/renderers/webgl/WebGLTextures.js +20 -7
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +207 -146
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +112 -19
- package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +87 -44
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +169 -99
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +35 -31
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +10 -19
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +120 -84
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +3 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
- package/src/renderers/webxr/WebXRManager.js +86 -11
- package/src/textures/ExternalTexture.js +56 -0
- package/src/textures/FramebufferTexture.js +2 -2
- package/src/textures/Source.js +12 -2
- package/src/textures/VideoTexture.js +27 -2
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
|
@@ -12,12 +12,9 @@ import { GLFeatureName } from './utils/WebGLConstants.js';
|
|
|
12
12
|
import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
|
|
13
13
|
|
|
14
14
|
import { warnOnce } from '../../utils.js';
|
|
15
|
-
import { WebGLCoordinateSystem } from '../../constants.js';
|
|
16
|
-
import { Vector2 } from '../../math/Vector2.js';
|
|
15
|
+
import { WebGLCoordinateSystem, TimestampQuery } from '../../constants.js';
|
|
17
16
|
import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
|
|
18
17
|
|
|
19
|
-
const _drawingBufferSize = /*@__PURE__*/ new Vector2();
|
|
20
|
-
|
|
21
18
|
/**
|
|
22
19
|
* A backend implementation targeting WebGL 2.
|
|
23
20
|
*
|
|
@@ -183,7 +180,7 @@ class WebGLBackend extends Backend {
|
|
|
183
180
|
* A unique collection of bindings.
|
|
184
181
|
*
|
|
185
182
|
* @private
|
|
186
|
-
* @type {WeakSet}
|
|
183
|
+
* @type {WeakSet<Array<BindGroup>>}
|
|
187
184
|
*/
|
|
188
185
|
this._knownBindings = new WeakSet();
|
|
189
186
|
|
|
@@ -201,7 +198,7 @@ class WebGLBackend extends Backend {
|
|
|
201
198
|
* the WebXR device API.
|
|
202
199
|
*
|
|
203
200
|
* @private
|
|
204
|
-
* @type {WebGLFramebuffer}
|
|
201
|
+
* @type {?WebGLFramebuffer}
|
|
205
202
|
* @default null
|
|
206
203
|
*/
|
|
207
204
|
this._xrFramebuffer = null;
|
|
@@ -379,14 +376,13 @@ class WebGLBackend extends Backend {
|
|
|
379
376
|
/**
|
|
380
377
|
* Inits a time stamp query for the given render context.
|
|
381
378
|
*
|
|
382
|
-
* @param {
|
|
379
|
+
* @param {string} type - The type of the timestamp query.
|
|
380
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
383
381
|
*/
|
|
384
|
-
initTimestampQuery(
|
|
382
|
+
initTimestampQuery( type, uid ) {
|
|
385
383
|
|
|
386
384
|
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
387
385
|
|
|
388
|
-
const type = renderContext.isComputeNode ? 'compute' : 'render';
|
|
389
|
-
|
|
390
386
|
if ( ! this.timestampQueryPool[ type ] ) {
|
|
391
387
|
|
|
392
388
|
// TODO: Variable maxQueries?
|
|
@@ -396,11 +392,11 @@ class WebGLBackend extends Backend {
|
|
|
396
392
|
|
|
397
393
|
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
398
394
|
|
|
399
|
-
const baseOffset = timestampQueryPool.allocateQueriesForContext(
|
|
395
|
+
const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
|
|
400
396
|
|
|
401
397
|
if ( baseOffset !== null ) {
|
|
402
398
|
|
|
403
|
-
timestampQueryPool.beginQuery(
|
|
399
|
+
timestampQueryPool.beginQuery( uid );
|
|
404
400
|
|
|
405
401
|
}
|
|
406
402
|
|
|
@@ -411,16 +407,16 @@ class WebGLBackend extends Backend {
|
|
|
411
407
|
/**
|
|
412
408
|
* Prepares the timestamp buffer.
|
|
413
409
|
*
|
|
414
|
-
* @param {
|
|
410
|
+
* @param {string} type - The type of the timestamp query.
|
|
411
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
415
412
|
*/
|
|
416
|
-
prepareTimestampBuffer(
|
|
413
|
+
prepareTimestampBuffer( type, uid ) {
|
|
417
414
|
|
|
418
415
|
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
419
416
|
|
|
420
|
-
const type = renderContext.isComputeNode ? 'compute' : 'render';
|
|
421
417
|
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
422
418
|
|
|
423
|
-
timestampQueryPool.endQuery(
|
|
419
|
+
timestampQueryPool.endQuery( uid );
|
|
424
420
|
|
|
425
421
|
}
|
|
426
422
|
|
|
@@ -449,13 +445,17 @@ class WebGLBackend extends Backend {
|
|
|
449
445
|
|
|
450
446
|
//
|
|
451
447
|
|
|
448
|
+
renderContextData.frameCalls = this.renderer.info.render.frameCalls;
|
|
449
|
+
|
|
450
|
+
//
|
|
451
|
+
|
|
452
452
|
if ( renderContext.viewport ) {
|
|
453
453
|
|
|
454
454
|
this.updateViewport( renderContext );
|
|
455
455
|
|
|
456
456
|
} else {
|
|
457
457
|
|
|
458
|
-
const { width, height } = this.getDrawingBufferSize(
|
|
458
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
459
459
|
state.viewport( 0, 0, width, height );
|
|
460
460
|
|
|
461
461
|
}
|
|
@@ -470,7 +470,7 @@ class WebGLBackend extends Backend {
|
|
|
470
470
|
|
|
471
471
|
//
|
|
472
472
|
|
|
473
|
-
this.initTimestampQuery( renderContext );
|
|
473
|
+
this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
474
474
|
|
|
475
475
|
renderContextData.previousContext = this._currentContext;
|
|
476
476
|
this._currentContext = renderContext;
|
|
@@ -543,107 +543,8 @@ class WebGLBackend extends Backend {
|
|
|
543
543
|
}
|
|
544
544
|
|
|
545
545
|
this._currentContext = previousContext;
|
|
546
|
-
const renderTarget = renderContext.renderTarget;
|
|
547
|
-
|
|
548
|
-
if ( renderContext.textures !== null && renderTarget ) {
|
|
549
|
-
|
|
550
|
-
const renderTargetContextData = this.get( renderTarget );
|
|
551
|
-
|
|
552
|
-
if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
|
|
553
|
-
|
|
554
|
-
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
555
546
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
if ( renderTarget.resolveDepthBuffer ) {
|
|
559
|
-
|
|
560
|
-
if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
|
|
561
|
-
if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
|
|
562
|
-
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
566
|
-
const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
|
|
567
|
-
|
|
568
|
-
const textures = renderContext.textures;
|
|
569
|
-
const isMRT = textures.length > 1;
|
|
570
|
-
|
|
571
|
-
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
572
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
573
|
-
|
|
574
|
-
if ( isMRT ) {
|
|
575
|
-
|
|
576
|
-
// blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
|
|
577
|
-
// the engine temporarily removes all attachments and then configures each attachment for the resolve.
|
|
578
|
-
|
|
579
|
-
for ( let i = 0; i < textures.length; i ++ ) {
|
|
580
|
-
|
|
581
|
-
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
|
|
582
|
-
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
|
|
583
|
-
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
for ( let i = 0; i < textures.length; i ++ ) {
|
|
589
|
-
|
|
590
|
-
if ( isMRT ) {
|
|
591
|
-
|
|
592
|
-
// configure attachment for resolve
|
|
593
|
-
|
|
594
|
-
const { textureGPU } = this.get( textures[ i ] );
|
|
595
|
-
|
|
596
|
-
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
597
|
-
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
if ( renderContext.scissor ) {
|
|
602
|
-
|
|
603
|
-
const { x, y, width, height } = renderContext.scissorValue;
|
|
604
|
-
|
|
605
|
-
const viewY = renderContext.height - height - y;
|
|
606
|
-
|
|
607
|
-
gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
|
|
608
|
-
|
|
609
|
-
} else {
|
|
610
|
-
|
|
611
|
-
gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
|
|
612
|
-
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
if ( isMRT ) {
|
|
618
|
-
|
|
619
|
-
// restore attachments
|
|
620
|
-
|
|
621
|
-
for ( let i = 0; i < textures.length; i ++ ) {
|
|
622
|
-
|
|
623
|
-
const { textureGPU } = this.get( textures[ i ] );
|
|
624
|
-
|
|
625
|
-
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
626
|
-
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
|
|
627
|
-
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
633
|
-
|
|
634
|
-
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
635
|
-
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
} else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
|
|
639
|
-
|
|
640
|
-
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
641
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
642
|
-
gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
|
|
643
|
-
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
}
|
|
547
|
+
this._resolveRenderTarget( renderContext );
|
|
647
548
|
|
|
648
549
|
if ( previousContext !== null ) {
|
|
649
550
|
|
|
@@ -655,14 +556,14 @@ class WebGLBackend extends Backend {
|
|
|
655
556
|
|
|
656
557
|
} else {
|
|
657
558
|
|
|
658
|
-
const { width, height } = this.getDrawingBufferSize(
|
|
559
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
659
560
|
state.viewport( 0, 0, width, height );
|
|
660
561
|
|
|
661
562
|
}
|
|
662
563
|
|
|
663
564
|
}
|
|
664
565
|
|
|
665
|
-
this.prepareTimestampBuffer( renderContext );
|
|
566
|
+
this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
666
567
|
|
|
667
568
|
}
|
|
668
569
|
|
|
@@ -802,9 +703,11 @@ class WebGLBackend extends Backend {
|
|
|
802
703
|
* @param {boolean} depth - Whether the depth buffer should be cleared or not.
|
|
803
704
|
* @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
|
|
804
705
|
* @param {?Object} [descriptor=null] - The render context of the current set render target.
|
|
805
|
-
* @param {boolean} [setFrameBuffer=true] -
|
|
706
|
+
* @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
|
|
707
|
+
* @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
|
|
708
|
+
* or not. Only relevant for explicit clears.
|
|
806
709
|
*/
|
|
807
|
-
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
|
|
710
|
+
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
|
|
808
711
|
|
|
809
712
|
const { gl, renderer } = this;
|
|
810
713
|
|
|
@@ -887,6 +790,8 @@ class WebGLBackend extends Backend {
|
|
|
887
790
|
|
|
888
791
|
}
|
|
889
792
|
|
|
793
|
+
if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
|
|
794
|
+
|
|
890
795
|
}
|
|
891
796
|
|
|
892
797
|
}
|
|
@@ -902,9 +807,16 @@ class WebGLBackend extends Backend {
|
|
|
902
807
|
beginCompute( computeGroup ) {
|
|
903
808
|
|
|
904
809
|
const { state, gl } = this;
|
|
810
|
+
const computeGroupData = this.get( computeGroup );
|
|
811
|
+
|
|
812
|
+
//
|
|
813
|
+
|
|
814
|
+
computeGroupData.frameCalls = this.renderer.info.compute.frameCalls;
|
|
815
|
+
|
|
816
|
+
//
|
|
905
817
|
|
|
906
818
|
state.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
907
|
-
this.initTimestampQuery( computeGroup );
|
|
819
|
+
this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
908
820
|
|
|
909
821
|
}
|
|
910
822
|
|
|
@@ -915,8 +827,9 @@ class WebGLBackend extends Backend {
|
|
|
915
827
|
* @param {Node} computeNode - The compute node.
|
|
916
828
|
* @param {Array<BindGroup>} bindings - The bindings.
|
|
917
829
|
* @param {ComputePipeline} pipeline - The compute pipeline.
|
|
830
|
+
* @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
|
|
918
831
|
*/
|
|
919
|
-
compute( computeGroup, computeNode, bindings, pipeline ) {
|
|
832
|
+
compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
|
|
920
833
|
|
|
921
834
|
const { state, gl } = this;
|
|
922
835
|
|
|
@@ -953,13 +866,23 @@ class WebGLBackend extends Backend {
|
|
|
953
866
|
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
954
867
|
gl.beginTransformFeedback( gl.POINTS );
|
|
955
868
|
|
|
869
|
+
count = ( count !== null ) ? count : computeNode.count;
|
|
870
|
+
|
|
871
|
+
if ( Array.isArray( count ) ) {
|
|
872
|
+
|
|
873
|
+
warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
|
|
874
|
+
|
|
875
|
+
count = count[ 0 ];
|
|
876
|
+
|
|
877
|
+
}
|
|
878
|
+
|
|
956
879
|
if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
|
|
957
880
|
|
|
958
|
-
gl.drawArraysInstanced( gl.POINTS, 0, 1,
|
|
881
|
+
gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
|
|
959
882
|
|
|
960
883
|
} else {
|
|
961
884
|
|
|
962
|
-
gl.drawArrays( gl.POINTS, 0,
|
|
885
|
+
gl.drawArrays( gl.POINTS, 0, count );
|
|
963
886
|
|
|
964
887
|
}
|
|
965
888
|
|
|
@@ -999,7 +922,7 @@ class WebGLBackend extends Backend {
|
|
|
999
922
|
|
|
1000
923
|
gl.disable( gl.RASTERIZER_DISCARD );
|
|
1001
924
|
|
|
1002
|
-
this.prepareTimestampBuffer( computeGroup );
|
|
925
|
+
this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
1003
926
|
|
|
1004
927
|
if ( this._currentContext ) {
|
|
1005
928
|
|
|
@@ -1238,7 +1161,7 @@ class WebGLBackend extends Backend {
|
|
|
1238
1161
|
this._currentContext.activeCubeFace = i;
|
|
1239
1162
|
|
|
1240
1163
|
this._setFramebuffer( this._currentContext );
|
|
1241
|
-
this.clear( false, true, stencilBuffer, this._currentContext, false );
|
|
1164
|
+
this.clear( false, true, stencilBuffer, this._currentContext, false, false );
|
|
1242
1165
|
|
|
1243
1166
|
}
|
|
1244
1167
|
|
|
@@ -1574,7 +1497,9 @@ class WebGLBackend extends Backend {
|
|
|
1574
1497
|
_getShaderErrors( gl, shader, type ) {
|
|
1575
1498
|
|
|
1576
1499
|
const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
|
|
1577
|
-
|
|
1500
|
+
|
|
1501
|
+
const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
|
|
1502
|
+
const errors = shaderInfoLog.trim();
|
|
1578
1503
|
|
|
1579
1504
|
if ( status && errors === '' ) return '';
|
|
1580
1505
|
|
|
@@ -1606,11 +1531,11 @@ class WebGLBackend extends Backend {
|
|
|
1606
1531
|
|
|
1607
1532
|
const gl = this.gl;
|
|
1608
1533
|
|
|
1609
|
-
const
|
|
1534
|
+
const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
|
|
1535
|
+
const programLog = programInfoLog.trim();
|
|
1610
1536
|
|
|
1611
1537
|
if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
|
|
1612
1538
|
|
|
1613
|
-
|
|
1614
1539
|
if ( typeof this.renderer.debug.onShaderError === 'function' ) {
|
|
1615
1540
|
|
|
1616
1541
|
this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
|
|
@@ -1835,28 +1760,46 @@ class WebGLBackend extends Backend {
|
|
|
1835
1760
|
|
|
1836
1761
|
for ( const binding of bindGroup.bindings ) {
|
|
1837
1762
|
|
|
1763
|
+
const map = this.get( binding );
|
|
1764
|
+
|
|
1838
1765
|
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
1839
1766
|
|
|
1840
1767
|
const data = binding.buffer;
|
|
1841
|
-
|
|
1768
|
+
let { bufferGPU } = this.get( data );
|
|
1842
1769
|
|
|
1843
|
-
|
|
1844
|
-
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
|
|
1770
|
+
if ( bufferGPU === undefined ) {
|
|
1845
1771
|
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
bufferGPU
|
|
1849
|
-
|
|
1772
|
+
// create
|
|
1773
|
+
|
|
1774
|
+
bufferGPU = gl.createBuffer();
|
|
1775
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1776
|
+
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
|
|
1777
|
+
|
|
1778
|
+
this.set( data, { bufferGPU } );
|
|
1779
|
+
|
|
1780
|
+
} else {
|
|
1781
|
+
|
|
1782
|
+
// update
|
|
1783
|
+
|
|
1784
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1785
|
+
gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
|
|
1786
|
+
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
map.index = i ++;
|
|
1790
|
+
map.bufferGPU = bufferGPU;
|
|
1791
|
+
|
|
1792
|
+
this.set( binding, map );
|
|
1850
1793
|
|
|
1851
1794
|
} else if ( binding.isSampledTexture ) {
|
|
1852
1795
|
|
|
1853
1796
|
const { textureGPU, glTextureType } = this.get( binding.texture );
|
|
1854
1797
|
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1798
|
+
map.index = t ++;
|
|
1799
|
+
map.textureGPU = textureGPU;
|
|
1800
|
+
map.glTextureType = glTextureType;
|
|
1801
|
+
|
|
1802
|
+
this.set( binding, map );
|
|
1860
1803
|
|
|
1861
1804
|
}
|
|
1862
1805
|
|
|
@@ -2082,8 +2025,9 @@ class WebGLBackend extends Backend {
|
|
|
2082
2025
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
2083
2026
|
|
|
2084
2027
|
const cubeFace = this.renderer._activeCubeFace;
|
|
2028
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2085
2029
|
|
|
2086
|
-
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU,
|
|
2030
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
|
|
2087
2031
|
|
|
2088
2032
|
} else {
|
|
2089
2033
|
|
|
@@ -2105,8 +2049,9 @@ class WebGLBackend extends Backend {
|
|
|
2105
2049
|
} else if ( isRenderTarget3D || isRenderTargetArray ) {
|
|
2106
2050
|
|
|
2107
2051
|
const layer = this.renderer._activeCubeFace;
|
|
2052
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2108
2053
|
|
|
2109
|
-
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU,
|
|
2054
|
+
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
|
|
2110
2055
|
|
|
2111
2056
|
} else {
|
|
2112
2057
|
|
|
@@ -2116,7 +2061,9 @@ class WebGLBackend extends Backend {
|
|
|
2116
2061
|
|
|
2117
2062
|
} else {
|
|
2118
2063
|
|
|
2119
|
-
|
|
2064
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2065
|
+
|
|
2066
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
|
|
2120
2067
|
|
|
2121
2068
|
}
|
|
2122
2069
|
|
|
@@ -2533,6 +2480,120 @@ class WebGLBackend extends Backend {
|
|
|
2533
2480
|
|
|
2534
2481
|
}
|
|
2535
2482
|
|
|
2483
|
+
/**
|
|
2484
|
+
* The method ensures multisampled render targets are resolved.
|
|
2485
|
+
*
|
|
2486
|
+
* @private
|
|
2487
|
+
* @param {RenderContext} renderContext - The render context.
|
|
2488
|
+
*/
|
|
2489
|
+
_resolveRenderTarget( renderContext ) {
|
|
2490
|
+
|
|
2491
|
+
const { gl, state } = this;
|
|
2492
|
+
|
|
2493
|
+
const renderTarget = renderContext.renderTarget;
|
|
2494
|
+
|
|
2495
|
+
if ( renderContext.textures !== null && renderTarget ) {
|
|
2496
|
+
|
|
2497
|
+
const renderTargetContextData = this.get( renderTarget );
|
|
2498
|
+
|
|
2499
|
+
if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
|
|
2500
|
+
|
|
2501
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2502
|
+
|
|
2503
|
+
let mask = gl.COLOR_BUFFER_BIT;
|
|
2504
|
+
|
|
2505
|
+
if ( renderTarget.resolveDepthBuffer ) {
|
|
2506
|
+
|
|
2507
|
+
if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
|
|
2508
|
+
if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
|
|
2509
|
+
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
2513
|
+
const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
|
|
2514
|
+
|
|
2515
|
+
const textures = renderContext.textures;
|
|
2516
|
+
const isMRT = textures.length > 1;
|
|
2517
|
+
|
|
2518
|
+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
2519
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2520
|
+
|
|
2521
|
+
if ( isMRT ) {
|
|
2522
|
+
|
|
2523
|
+
// blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
|
|
2524
|
+
// the engine temporarily removes all attachments and then configures each attachment for the resolve.
|
|
2525
|
+
|
|
2526
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2527
|
+
|
|
2528
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
|
|
2529
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
|
|
2530
|
+
|
|
2531
|
+
}
|
|
2532
|
+
|
|
2533
|
+
}
|
|
2534
|
+
|
|
2535
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2536
|
+
|
|
2537
|
+
if ( isMRT ) {
|
|
2538
|
+
|
|
2539
|
+
// configure attachment for resolve
|
|
2540
|
+
|
|
2541
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2542
|
+
|
|
2543
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2544
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2545
|
+
|
|
2546
|
+
}
|
|
2547
|
+
|
|
2548
|
+
if ( renderContext.scissor ) {
|
|
2549
|
+
|
|
2550
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
2551
|
+
|
|
2552
|
+
const viewY = renderContext.height - height - y;
|
|
2553
|
+
|
|
2554
|
+
gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
|
|
2555
|
+
|
|
2556
|
+
} else {
|
|
2557
|
+
|
|
2558
|
+
gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
|
|
2559
|
+
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
}
|
|
2563
|
+
|
|
2564
|
+
if ( isMRT ) {
|
|
2565
|
+
|
|
2566
|
+
// restore attachments
|
|
2567
|
+
|
|
2568
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2569
|
+
|
|
2570
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2571
|
+
|
|
2572
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2573
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2574
|
+
|
|
2575
|
+
}
|
|
2576
|
+
|
|
2577
|
+
}
|
|
2578
|
+
|
|
2579
|
+
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
2580
|
+
|
|
2581
|
+
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
2582
|
+
|
|
2583
|
+
}
|
|
2584
|
+
|
|
2585
|
+
} else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
|
|
2586
|
+
|
|
2587
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2588
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2589
|
+
gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
|
|
2590
|
+
|
|
2591
|
+
}
|
|
2592
|
+
|
|
2593
|
+
}
|
|
2594
|
+
|
|
2595
|
+
}
|
|
2596
|
+
|
|
2536
2597
|
/**
|
|
2537
2598
|
* Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
|
|
2538
2599
|
* should be used when MSAA is enabled.
|