super-three 0.154.1 → 0.156.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 +360 -160
- package/build/three.js +360 -160
- package/build/three.min.js +1 -1
- package/build/three.module.js +355 -161
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +155 -25
- package/examples/jsm/csm/CSMShader.js +35 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +1 -0
- package/examples/jsm/interactive/SelectionHelper.js +7 -0
- package/examples/jsm/libs/tween.module.js +790 -735
- package/examples/jsm/libs/utif.module.js +1644 -1558
- package/examples/jsm/loaders/DDSLoader.js +46 -3
- package/examples/jsm/loaders/EXRLoader.js +4 -4
- package/examples/jsm/loaders/FBXLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +25 -10
- package/examples/jsm/loaders/KTX2Loader.js +128 -79
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LogLuvLoader.js +2 -2
- package/examples/jsm/loaders/MMDLoader.js +10 -7
- package/examples/jsm/loaders/NRRDLoader.js +3 -3
- package/examples/jsm/loaders/PLYLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +48 -66
- package/examples/jsm/loaders/STLLoader.js +7 -0
- package/examples/jsm/loaders/TGALoader.js +10 -10
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
- package/examples/jsm/misc/Volume.js +4 -6
- package/examples/jsm/nodes/Nodes.js +8 -6
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
- package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
- package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
- package/examples/jsm/nodes/core/AttributeNode.js +2 -2
- package/examples/jsm/nodes/core/LightingModel.js +7 -9
- package/examples/jsm/nodes/core/Node.js +28 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
- package/examples/jsm/nodes/core/NodeUniform.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -0
- package/examples/jsm/nodes/core/StackNode.js +4 -4
- package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +19 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
- package/examples/jsm/nodes/lighting/AONode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
- package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
- package/examples/jsm/nodes/materials/Materials.js +2 -0
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/math/HashNode.js +35 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
- package/examples/jsm/nodes/utils/SplitNode.js +1 -1
- package/examples/jsm/objects/Reflector.js +1 -9
- package/examples/jsm/objects/Refractor.js +0 -8
- package/examples/jsm/offscreen/scene.js +0 -1
- package/examples/jsm/postprocessing/FilmPass.js +3 -5
- package/examples/jsm/postprocessing/MaskPass.js +4 -1
- package/examples/jsm/postprocessing/OutputPass.js +33 -14
- 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/postprocessing/UnrealBloomPass.js +21 -17
- package/examples/jsm/renderers/common/Backend.js +11 -8
- package/examples/jsm/renderers/common/Background.js +22 -20
- package/examples/jsm/renderers/common/Binding.js +14 -0
- package/examples/jsm/renderers/common/Bindings.js +7 -10
- package/examples/jsm/renderers/common/Geometries.js +1 -1
- package/examples/jsm/renderers/common/Pipelines.js +96 -47
- package/examples/jsm/renderers/common/RenderContext.js +1 -0
- package/examples/jsm/renderers/common/RenderContexts.js +41 -5
- package/examples/jsm/renderers/common/RenderList.js +12 -4
- package/examples/jsm/renderers/common/RenderObject.js +26 -6
- package/examples/jsm/renderers/common/RenderObjects.js +10 -7
- package/examples/jsm/renderers/common/Renderer.js +82 -42
- package/examples/jsm/renderers/common/SampledTexture.js +2 -1
- package/examples/jsm/renderers/common/Sampler.js +1 -1
- package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +172 -20
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
- package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
- 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 +199 -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 +1 -1
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
- package/examples/jsm/shaders/FilmShader.js +11 -54
- package/examples/jsm/shaders/OutputShader.js +19 -2
- package/examples/jsm/shaders/SAOShader.js +0 -13
- package/examples/jsm/shaders/SSAOShader.js +33 -26
- package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
- package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
- package/package.json +2 -2
- package/src/Three.js +3 -0
- package/src/animation/PropertyBinding.js +1 -1
- package/src/audio/Audio.js +6 -0
- package/src/cameras/CubeCamera.js +1 -4
- package/src/constants.js +4 -1
- package/src/core/BufferAttribute.js +20 -0
- package/src/core/Object3D.js +2 -15
- package/src/core/RenderTarget.js +122 -0
- package/src/core/UniformsGroup.js +2 -2
- package/src/geometries/CapsuleGeometry.js +1 -1
- package/src/loaders/DataTextureLoader.js +19 -2
- package/src/materials/Material.js +2 -2
- 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/renderers/WebGLMultipleRenderTargets.js +0 -2
- package/src/renderers/WebGLRenderTarget.js +3 -110
- package/src/renderers/WebGLRenderer.js +83 -57
- package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
- package/src/renderers/webgl/WebGLBackground.js +5 -14
- package/src/renderers/webgl/WebGLGeometries.js +5 -1
- package/src/renderers/webgl/WebGLMaterials.js +1 -1
- package/src/renderers/webgl/WebGLProgram.js +2 -0
- package/src/renderers/webgl/WebGLPrograms.js +19 -3
- package/src/renderers/webgl/WebGLTextures.js +101 -16
- package/src/renderers/webgl/WebGLUtils.js +27 -20
- package/src/textures/CompressedCubeTexture.js +19 -0
- package/src/textures/Texture.js +2 -2
- package/src/utils.js +9 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
- package/examples/jsm/renderers/common/RenderTarget.js +0 -15
- package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
|
@@ -37,6 +37,10 @@ const shaderNodeHandler = {
|
|
|
37
37
|
|
|
38
38
|
return ( ...params ) => nodeElement( nodeObj, ...params );
|
|
39
39
|
|
|
40
|
+
} else if ( prop === 'self' ) {
|
|
41
|
+
|
|
42
|
+
return node;
|
|
43
|
+
|
|
40
44
|
} else if ( prop.endsWith( 'Assign' ) && NodeElements.has( prop.slice( 0, prop.length - 'Assign'.length ) ) ) {
|
|
41
45
|
|
|
42
46
|
const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) );
|
|
@@ -261,7 +265,7 @@ const safeGetNodeType = ( node ) => {
|
|
|
261
265
|
|
|
262
266
|
return node.getNodeType();
|
|
263
267
|
|
|
264
|
-
} catch {
|
|
268
|
+
} catch ( _ ) {
|
|
265
269
|
|
|
266
270
|
return undefined;
|
|
267
271
|
|
|
@@ -322,7 +326,7 @@ export const nodeImmutable = ( ...params ) => new ShaderNodeImmutable( ...params
|
|
|
322
326
|
|
|
323
327
|
export const shader = ( jsFunc ) => { // @deprecated, r154
|
|
324
328
|
|
|
325
|
-
console.warn( 'TSL: shader() is deprecated. Use
|
|
329
|
+
console.warn( 'TSL: shader() is deprecated. Use tslFn() instead.' );
|
|
326
330
|
|
|
327
331
|
return new ShaderNode( jsFunc );
|
|
328
332
|
|
|
@@ -59,7 +59,7 @@ class SplitNode extends Node {
|
|
|
59
59
|
|
|
60
60
|
if ( this.components.length === nodeTypeLength && this.components === stringVectorComponents.slice( 0, this.components.length ) ) {
|
|
61
61
|
|
|
62
|
-
//
|
|
62
|
+
// unnecessary swizzle
|
|
63
63
|
|
|
64
64
|
snippet = builder.format( nodeSnippet, type, output );
|
|
65
65
|
|
|
@@ -9,9 +9,7 @@ import {
|
|
|
9
9
|
Vector3,
|
|
10
10
|
Vector4,
|
|
11
11
|
WebGLRenderTarget,
|
|
12
|
-
HalfFloatType
|
|
13
|
-
NoToneMapping,
|
|
14
|
-
LinearSRGBColorSpace
|
|
12
|
+
HalfFloatType
|
|
15
13
|
} from 'three';
|
|
16
14
|
|
|
17
15
|
class Reflector extends Mesh {
|
|
@@ -147,13 +145,9 @@ class Reflector extends Mesh {
|
|
|
147
145
|
|
|
148
146
|
const currentXrEnabled = renderer.xr.enabled;
|
|
149
147
|
const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;
|
|
150
|
-
const currentOutputColorSpace = renderer.outputColorSpace;
|
|
151
|
-
const currentToneMapping = renderer.toneMapping;
|
|
152
148
|
|
|
153
149
|
renderer.xr.enabled = false; // Avoid camera modification
|
|
154
150
|
renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows
|
|
155
|
-
renderer.outputColorSpace = LinearSRGBColorSpace;
|
|
156
|
-
renderer.toneMapping = NoToneMapping;
|
|
157
151
|
|
|
158
152
|
renderer.setRenderTarget( renderTarget );
|
|
159
153
|
|
|
@@ -164,8 +158,6 @@ class Reflector extends Mesh {
|
|
|
164
158
|
|
|
165
159
|
renderer.xr.enabled = currentXrEnabled;
|
|
166
160
|
renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
|
|
167
|
-
renderer.outputColorSpace = currentOutputColorSpace;
|
|
168
|
-
renderer.toneMapping = currentToneMapping;
|
|
169
161
|
|
|
170
162
|
renderer.setRenderTarget( currentRenderTarget );
|
|
171
163
|
|
|
@@ -10,8 +10,6 @@ import {
|
|
|
10
10
|
Vector3,
|
|
11
11
|
Vector4,
|
|
12
12
|
WebGLRenderTarget,
|
|
13
|
-
LinearSRGBColorSpace,
|
|
14
|
-
NoToneMapping,
|
|
15
13
|
HalfFloatType
|
|
16
14
|
} from 'three';
|
|
17
15
|
|
|
@@ -194,13 +192,9 @@ class Refractor extends Mesh {
|
|
|
194
192
|
const currentRenderTarget = renderer.getRenderTarget();
|
|
195
193
|
const currentXrEnabled = renderer.xr.enabled;
|
|
196
194
|
const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;
|
|
197
|
-
const currentOutputColorSpace = renderer.outputColorSpace;
|
|
198
|
-
const currentToneMapping = renderer.toneMapping;
|
|
199
195
|
|
|
200
196
|
renderer.xr.enabled = false; // avoid camera modification
|
|
201
197
|
renderer.shadowMap.autoUpdate = false; // avoid re-computing shadows
|
|
202
|
-
renderer.outputColorSpace = LinearSRGBColorSpace;
|
|
203
|
-
renderer.toneMapping = NoToneMapping;
|
|
204
198
|
|
|
205
199
|
renderer.setRenderTarget( renderTarget );
|
|
206
200
|
if ( renderer.autoClear === false ) renderer.clear();
|
|
@@ -208,8 +202,6 @@ class Refractor extends Mesh {
|
|
|
208
202
|
|
|
209
203
|
renderer.xr.enabled = currentXrEnabled;
|
|
210
204
|
renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
|
|
211
|
-
renderer.outputColorSpace = currentOutputColorSpace;
|
|
212
|
-
renderer.toneMapping = currentToneMapping;
|
|
213
205
|
renderer.setRenderTarget( currentRenderTarget );
|
|
214
206
|
|
|
215
207
|
// restore viewport
|
|
@@ -45,7 +45,6 @@ function init( canvas, width, height, pixelRatio, path ) {
|
|
|
45
45
|
renderer = new THREE.WebGLRenderer( { antialias: true, canvas: canvas } );
|
|
46
46
|
renderer.setPixelRatio( pixelRatio );
|
|
47
47
|
renderer.setSize( width, height, false );
|
|
48
|
-
renderer.useLegacyLights = false;
|
|
49
48
|
|
|
50
49
|
animate();
|
|
51
50
|
|
|
@@ -7,7 +7,7 @@ import { FilmShader } from '../shaders/FilmShader.js';
|
|
|
7
7
|
|
|
8
8
|
class FilmPass extends Pass {
|
|
9
9
|
|
|
10
|
-
constructor(
|
|
10
|
+
constructor( intensity = 0.5, grayscale = false ) {
|
|
11
11
|
|
|
12
12
|
super();
|
|
13
13
|
|
|
@@ -24,10 +24,8 @@ class FilmPass extends Pass {
|
|
|
24
24
|
|
|
25
25
|
} );
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;
|
|
30
|
-
if ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;
|
|
27
|
+
this.uniforms.intensity.value = intensity; // (0 = no effect, 1 = full effect)
|
|
28
|
+
this.uniforms.grayscale.value = grayscale;
|
|
31
29
|
|
|
32
30
|
this.fsQuad = new FullScreenQuad( this.material );
|
|
33
31
|
|
|
@@ -63,11 +63,14 @@ class MaskPass extends Pass {
|
|
|
63
63
|
if ( this.clear ) renderer.clear();
|
|
64
64
|
renderer.render( this.scene, this.camera );
|
|
65
65
|
|
|
66
|
-
// unlock color and depth buffer for subsequent rendering
|
|
66
|
+
// unlock color and depth buffer and make them writable for subsequent rendering/clearing
|
|
67
67
|
|
|
68
68
|
state.buffers.color.setLocked( false );
|
|
69
69
|
state.buffers.depth.setLocked( false );
|
|
70
70
|
|
|
71
|
+
state.buffers.color.setMask( true );
|
|
72
|
+
state.buffers.depth.setMask( true );
|
|
73
|
+
|
|
71
74
|
// only render where stencil is set to 1
|
|
72
75
|
|
|
73
76
|
state.buffers.stencil.setLocked( false );
|
|
@@ -1,49 +1,68 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
RawShaderMaterial,
|
|
3
3
|
UniformsUtils,
|
|
4
|
-
NoToneMapping,
|
|
5
4
|
LinearToneMapping,
|
|
6
5
|
ReinhardToneMapping,
|
|
7
6
|
CineonToneMapping,
|
|
8
|
-
ACESFilmicToneMapping
|
|
7
|
+
ACESFilmicToneMapping,
|
|
8
|
+
SRGBColorSpace
|
|
9
9
|
} from 'three';
|
|
10
10
|
import { Pass, FullScreenQuad } from './Pass.js';
|
|
11
11
|
import { OutputShader } from '../shaders/OutputShader.js';
|
|
12
12
|
|
|
13
13
|
class OutputPass extends Pass {
|
|
14
14
|
|
|
15
|
-
constructor(
|
|
15
|
+
constructor() {
|
|
16
16
|
|
|
17
17
|
super();
|
|
18
18
|
|
|
19
|
-
this.toneMapping = toneMapping;
|
|
20
|
-
this.toneMappingExposure = toneMappingExposure;
|
|
21
|
-
|
|
22
19
|
//
|
|
23
20
|
|
|
24
21
|
const shader = OutputShader;
|
|
25
22
|
|
|
26
23
|
this.uniforms = UniformsUtils.clone( shader.uniforms );
|
|
27
24
|
|
|
28
|
-
this.material = new
|
|
25
|
+
this.material = new RawShaderMaterial( {
|
|
29
26
|
uniforms: this.uniforms,
|
|
30
27
|
vertexShader: shader.vertexShader,
|
|
31
28
|
fragmentShader: shader.fragmentShader
|
|
32
29
|
} );
|
|
33
30
|
|
|
34
|
-
if ( toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';
|
|
35
|
-
else if ( toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
|
|
36
|
-
else if ( toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
|
|
37
|
-
else if ( toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
|
|
38
|
-
|
|
39
31
|
this.fsQuad = new FullScreenQuad( this.material );
|
|
40
32
|
|
|
33
|
+
// internal cache
|
|
34
|
+
|
|
35
|
+
this._outputColorSpace = null;
|
|
36
|
+
this._toneMapping = null;
|
|
37
|
+
|
|
41
38
|
}
|
|
42
39
|
|
|
43
40
|
render( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {
|
|
44
41
|
|
|
45
42
|
this.uniforms[ 'tDiffuse' ].value = readBuffer.texture;
|
|
46
|
-
this.uniforms[ 'toneMappingExposure' ].value =
|
|
43
|
+
this.uniforms[ 'toneMappingExposure' ].value = renderer.toneMappingExposure;
|
|
44
|
+
|
|
45
|
+
// rebuild defines if required
|
|
46
|
+
|
|
47
|
+
if ( this._outputColorSpace !== renderer.outputColorSpace || this._toneMapping !== renderer.toneMapping ) {
|
|
48
|
+
|
|
49
|
+
this._outputColorSpace = renderer.outputColorSpace;
|
|
50
|
+
this._toneMapping = renderer.toneMapping;
|
|
51
|
+
|
|
52
|
+
this.material.defines = {};
|
|
53
|
+
|
|
54
|
+
if ( this._outputColorSpace == SRGBColorSpace ) this.material.defines.SRGB_COLOR_SPACE = '';
|
|
55
|
+
|
|
56
|
+
if ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';
|
|
57
|
+
else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
|
|
58
|
+
else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
|
|
59
|
+
else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
|
|
60
|
+
|
|
61
|
+
this.material.needsUpdate = true;
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//
|
|
47
66
|
|
|
48
67
|
if ( this.renderToScreen === true ) {
|
|
49
68
|
|
|
@@ -5,7 +5,7 @@ import { Pass } from './Pass.js';
|
|
|
5
5
|
|
|
6
6
|
class RenderPass extends Pass {
|
|
7
7
|
|
|
8
|
-
constructor( scene, camera, overrideMaterial, clearColor, clearAlpha ) {
|
|
8
|
+
constructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {
|
|
9
9
|
|
|
10
10
|
super();
|
|
11
11
|
|
|
@@ -15,7 +15,7 @@ class RenderPass extends Pass {
|
|
|
15
15
|
this.overrideMaterial = overrideMaterial;
|
|
16
16
|
|
|
17
17
|
this.clearColor = clearColor;
|
|
18
|
-
this.clearAlpha =
|
|
18
|
+
this.clearAlpha = clearAlpha;
|
|
19
19
|
|
|
20
20
|
this.clear = true;
|
|
21
21
|
this.clearDepth = false;
|
|
@@ -31,7 +31,7 @@ class RenderPass extends Pass {
|
|
|
31
31
|
|
|
32
32
|
let oldClearAlpha, oldOverrideMaterial;
|
|
33
33
|
|
|
34
|
-
if ( this.overrideMaterial !==
|
|
34
|
+
if ( this.overrideMaterial !== null ) {
|
|
35
35
|
|
|
36
36
|
oldOverrideMaterial = this.scene.overrideMaterial;
|
|
37
37
|
|
|
@@ -39,16 +39,21 @@ class RenderPass extends Pass {
|
|
|
39
39
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
if ( this.clearColor ) {
|
|
42
|
+
if ( this.clearColor !== null ) {
|
|
43
43
|
|
|
44
44
|
renderer.getClearColor( this._oldClearColor );
|
|
45
|
-
|
|
45
|
+
renderer.setClearColor( this.clearColor );
|
|
46
|
+
|
|
47
|
+
}
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
if ( this.clearAlpha !== null ) {
|
|
50
|
+
|
|
51
|
+
oldClearAlpha = renderer.getClearAlpha();
|
|
52
|
+
renderer.setClearAlpha( this.clearAlpha );
|
|
48
53
|
|
|
49
54
|
}
|
|
50
55
|
|
|
51
|
-
if ( this.clearDepth ) {
|
|
56
|
+
if ( this.clearDepth == true ) {
|
|
52
57
|
|
|
53
58
|
renderer.clearDepth();
|
|
54
59
|
|
|
@@ -56,17 +61,30 @@ class RenderPass extends Pass {
|
|
|
56
61
|
|
|
57
62
|
renderer.setRenderTarget( this.renderToScreen ? null : readBuffer );
|
|
58
63
|
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
if ( this.clear === true ) {
|
|
65
|
+
|
|
66
|
+
// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600
|
|
67
|
+
renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
61
71
|
renderer.render( this.scene, this.camera );
|
|
62
72
|
|
|
63
|
-
|
|
73
|
+
// restore
|
|
74
|
+
|
|
75
|
+
if ( this.clearColor !== null ) {
|
|
76
|
+
|
|
77
|
+
renderer.setClearColor( this._oldClearColor );
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if ( this.clearAlpha !== null ) {
|
|
64
82
|
|
|
65
|
-
renderer.
|
|
83
|
+
renderer.setClearAlpha( oldClearAlpha );
|
|
66
84
|
|
|
67
85
|
}
|
|
68
86
|
|
|
69
|
-
if ( this.overrideMaterial !==
|
|
87
|
+
if ( this.overrideMaterial !== null ) {
|
|
70
88
|
|
|
71
89
|
this.scene.overrideMaterial = oldOverrideMaterial;
|
|
72
90
|
|
|
@@ -6,14 +6,13 @@ import {
|
|
|
6
6
|
DstAlphaFactor,
|
|
7
7
|
DstColorFactor,
|
|
8
8
|
HalfFloatType,
|
|
9
|
-
MeshDepthMaterial,
|
|
10
9
|
MeshNormalMaterial,
|
|
11
10
|
NearestFilter,
|
|
12
11
|
NoBlending,
|
|
13
|
-
RGBADepthPacking,
|
|
14
12
|
ShaderMaterial,
|
|
15
13
|
UniformsUtils,
|
|
16
|
-
|
|
14
|
+
DepthStencilFormat,
|
|
15
|
+
UnsignedInt248Type,
|
|
17
16
|
Vector2,
|
|
18
17
|
WebGLRenderTarget,
|
|
19
18
|
ZeroFactor
|
|
@@ -23,7 +22,6 @@ import { SAOShader } from '../shaders/SAOShader.js';
|
|
|
23
22
|
import { DepthLimitedBlurShader } from '../shaders/DepthLimitedBlurShader.js';
|
|
24
23
|
import { BlurShaderUtils } from '../shaders/DepthLimitedBlurShader.js';
|
|
25
24
|
import { CopyShader } from '../shaders/CopyShader.js';
|
|
26
|
-
import { UnpackDepthRGBAShader } from '../shaders/UnpackDepthRGBAShader.js';
|
|
27
25
|
|
|
28
26
|
/**
|
|
29
27
|
* SAO implementation inspired from bhouston previous SAO work
|
|
@@ -31,7 +29,7 @@ import { UnpackDepthRGBAShader } from '../shaders/UnpackDepthRGBAShader.js';
|
|
|
31
29
|
|
|
32
30
|
class SAOPass extends Pass {
|
|
33
31
|
|
|
34
|
-
constructor( scene, camera,
|
|
32
|
+
constructor( scene, camera, resolution = new Vector2( 256, 256 ) ) {
|
|
35
33
|
|
|
36
34
|
super();
|
|
37
35
|
|
|
@@ -41,9 +39,6 @@ class SAOPass extends Pass {
|
|
|
41
39
|
this.clear = true;
|
|
42
40
|
this.needsSwap = false;
|
|
43
41
|
|
|
44
|
-
this.supportsDepthTextureExtension = useDepthTexture;
|
|
45
|
-
this.supportsNormalTexture = useNormals;
|
|
46
|
-
|
|
47
42
|
this.originalClearColor = new Color();
|
|
48
43
|
this._oldClearColor = new Color();
|
|
49
44
|
this.oldClearAlpha = 1;
|
|
@@ -65,30 +60,17 @@ class SAOPass extends Pass {
|
|
|
65
60
|
|
|
66
61
|
this.saoRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, { type: HalfFloatType } );
|
|
67
62
|
this.blurIntermediateRenderTarget = this.saoRenderTarget.clone();
|
|
68
|
-
|
|
63
|
+
|
|
64
|
+
const depthTexture = new DepthTexture();
|
|
65
|
+
depthTexture.format = DepthStencilFormat;
|
|
66
|
+
depthTexture.type = UnsignedInt248Type;
|
|
69
67
|
|
|
70
68
|
this.normalRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, {
|
|
71
69
|
minFilter: NearestFilter,
|
|
72
70
|
magFilter: NearestFilter,
|
|
73
|
-
type: HalfFloatType
|
|
71
|
+
type: HalfFloatType,
|
|
72
|
+
depthTexture: depthTexture
|
|
74
73
|
} );
|
|
75
|
-
this.depthRenderTarget = this.normalRenderTarget.clone();
|
|
76
|
-
|
|
77
|
-
let depthTexture;
|
|
78
|
-
|
|
79
|
-
if ( this.supportsDepthTextureExtension ) {
|
|
80
|
-
|
|
81
|
-
depthTexture = new DepthTexture();
|
|
82
|
-
depthTexture.type = UnsignedShortType;
|
|
83
|
-
|
|
84
|
-
this.beautyRenderTarget.depthTexture = depthTexture;
|
|
85
|
-
this.beautyRenderTarget.depthBuffer = true;
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
this.depthMaterial = new MeshDepthMaterial();
|
|
90
|
-
this.depthMaterial.depthPacking = RGBADepthPacking;
|
|
91
|
-
this.depthMaterial.blending = NoBlending;
|
|
92
74
|
|
|
93
75
|
this.normalMaterial = new MeshNormalMaterial();
|
|
94
76
|
this.normalMaterial.blending = NoBlending;
|
|
@@ -100,10 +82,8 @@ class SAOPass extends Pass {
|
|
|
100
82
|
uniforms: UniformsUtils.clone( SAOShader.uniforms )
|
|
101
83
|
} );
|
|
102
84
|
this.saoMaterial.extensions.derivatives = true;
|
|
103
|
-
this.saoMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;
|
|
104
|
-
this.saoMaterial.defines[ 'NORMAL_TEXTURE' ] = this.supportsNormalTexture ? 1 : 0;
|
|
105
85
|
this.saoMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
|
|
106
|
-
this.saoMaterial.uniforms[ 'tDepth' ].value =
|
|
86
|
+
this.saoMaterial.uniforms[ 'tDepth' ].value = depthTexture;
|
|
107
87
|
this.saoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;
|
|
108
88
|
this.saoMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
|
|
109
89
|
this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );
|
|
@@ -116,10 +96,10 @@ class SAOPass extends Pass {
|
|
|
116
96
|
vertexShader: DepthLimitedBlurShader.vertexShader,
|
|
117
97
|
fragmentShader: DepthLimitedBlurShader.fragmentShader
|
|
118
98
|
} );
|
|
119
|
-
this.vBlurMaterial.defines[ 'DEPTH_PACKING' ] =
|
|
99
|
+
this.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;
|
|
120
100
|
this.vBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
|
|
121
101
|
this.vBlurMaterial.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;
|
|
122
|
-
this.vBlurMaterial.uniforms[ 'tDepth' ].value =
|
|
102
|
+
this.vBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;
|
|
123
103
|
this.vBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
|
|
124
104
|
this.vBlurMaterial.blending = NoBlending;
|
|
125
105
|
|
|
@@ -129,10 +109,10 @@ class SAOPass extends Pass {
|
|
|
129
109
|
vertexShader: DepthLimitedBlurShader.vertexShader,
|
|
130
110
|
fragmentShader: DepthLimitedBlurShader.fragmentShader
|
|
131
111
|
} );
|
|
132
|
-
this.hBlurMaterial.defines[ 'DEPTH_PACKING' ] =
|
|
112
|
+
this.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;
|
|
133
113
|
this.hBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
|
|
134
114
|
this.hBlurMaterial.uniforms[ 'tDiffuse' ].value = this.blurIntermediateRenderTarget.texture;
|
|
135
|
-
this.hBlurMaterial.uniforms[ 'tDepth' ].value =
|
|
115
|
+
this.hBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;
|
|
136
116
|
this.hBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
|
|
137
117
|
this.hBlurMaterial.blending = NoBlending;
|
|
138
118
|
|
|
@@ -153,13 +133,6 @@ class SAOPass extends Pass {
|
|
|
153
133
|
this.materialCopy.blendDstAlpha = ZeroFactor;
|
|
154
134
|
this.materialCopy.blendEquationAlpha = AddEquation;
|
|
155
135
|
|
|
156
|
-
this.depthCopy = new ShaderMaterial( {
|
|
157
|
-
uniforms: UniformsUtils.clone( UnpackDepthRGBAShader.uniforms ),
|
|
158
|
-
vertexShader: UnpackDepthRGBAShader.vertexShader,
|
|
159
|
-
fragmentShader: UnpackDepthRGBAShader.fragmentShader,
|
|
160
|
-
blending: NoBlending
|
|
161
|
-
} );
|
|
162
|
-
|
|
163
136
|
this.fsQuad = new FullScreenQuad( null );
|
|
164
137
|
|
|
165
138
|
}
|
|
@@ -176,20 +149,11 @@ class SAOPass extends Pass {
|
|
|
176
149
|
|
|
177
150
|
}
|
|
178
151
|
|
|
179
|
-
if ( this.params.output === 1 ) {
|
|
180
|
-
|
|
181
|
-
return;
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
|
|
185
152
|
renderer.getClearColor( this._oldClearColor );
|
|
186
153
|
this.oldClearAlpha = renderer.getClearAlpha();
|
|
187
154
|
const oldAutoClear = renderer.autoClear;
|
|
188
155
|
renderer.autoClear = false;
|
|
189
156
|
|
|
190
|
-
renderer.setRenderTarget( this.depthRenderTarget );
|
|
191
|
-
renderer.clear();
|
|
192
|
-
|
|
193
157
|
this.saoMaterial.uniforms[ 'bias' ].value = this.params.saoBias;
|
|
194
158
|
this.saoMaterial.uniforms[ 'intensity' ].value = this.params.saoIntensity;
|
|
195
159
|
this.saoMaterial.uniforms[ 'scale' ].value = this.params.saoScale;
|
|
@@ -218,26 +182,8 @@ class SAOPass extends Pass {
|
|
|
218
182
|
|
|
219
183
|
}
|
|
220
184
|
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
renderer.setRenderTarget( this.beautyRenderTarget );
|
|
224
|
-
renderer.clear();
|
|
225
|
-
renderer.render( this.scene, this.camera );
|
|
226
|
-
|
|
227
|
-
// Re-render scene if depth texture extension is not supported
|
|
228
|
-
if ( ! this.supportsDepthTextureExtension ) {
|
|
229
|
-
|
|
230
|
-
// Clear rule : far clipping plane in both RGBA and Basic encoding
|
|
231
|
-
this.renderOverride( renderer, this.depthMaterial, this.depthRenderTarget, 0x000000, 1.0 );
|
|
232
|
-
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
if ( this.supportsNormalTexture ) {
|
|
236
|
-
|
|
237
|
-
// Clear rule : default normal is facing the camera
|
|
238
|
-
this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );
|
|
239
|
-
|
|
240
|
-
}
|
|
185
|
+
// render normal and depth
|
|
186
|
+
this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );
|
|
241
187
|
|
|
242
188
|
// Rendering SAO texture
|
|
243
189
|
this.renderPass( renderer, this.saoMaterial, this.saoRenderTarget, 0xffffff, 1.0 );
|
|
@@ -250,24 +196,10 @@ class SAOPass extends Pass {
|
|
|
250
196
|
|
|
251
197
|
}
|
|
252
198
|
|
|
253
|
-
|
|
254
|
-
// Setting up SAO rendering
|
|
255
|
-
if ( this.params.output === 3 ) {
|
|
256
|
-
|
|
257
|
-
if ( this.supportsDepthTextureExtension ) {
|
|
258
|
-
|
|
259
|
-
this.materialCopy.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.depthTexture;
|
|
260
|
-
this.materialCopy.needsUpdate = true;
|
|
199
|
+
const outputMaterial = this.materialCopy;
|
|
261
200
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
this.depthCopy.uniforms[ 'tDiffuse' ].value = this.depthRenderTarget.texture;
|
|
265
|
-
this.depthCopy.needsUpdate = true;
|
|
266
|
-
outputMaterial = this.depthCopy;
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
} else if ( this.params.output === 4 ) {
|
|
201
|
+
// Setting up SAO rendering
|
|
202
|
+
if ( this.params.output === SAOPass.OUTPUT.Normal ) {
|
|
271
203
|
|
|
272
204
|
this.materialCopy.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;
|
|
273
205
|
this.materialCopy.needsUpdate = true;
|
|
@@ -279,8 +211,8 @@ class SAOPass extends Pass {
|
|
|
279
211
|
|
|
280
212
|
}
|
|
281
213
|
|
|
282
|
-
// Blending depends on output
|
|
283
|
-
if ( this.params.output ===
|
|
214
|
+
// Blending depends on output
|
|
215
|
+
if ( this.params.output === SAOPass.OUTPUT.Default ) {
|
|
284
216
|
|
|
285
217
|
outputMaterial.blending = CustomBlending;
|
|
286
218
|
|
|
@@ -359,11 +291,9 @@ class SAOPass extends Pass {
|
|
|
359
291
|
|
|
360
292
|
setSize( width, height ) {
|
|
361
293
|
|
|
362
|
-
this.beautyRenderTarget.setSize( width, height );
|
|
363
294
|
this.saoRenderTarget.setSize( width, height );
|
|
364
295
|
this.blurIntermediateRenderTarget.setSize( width, height );
|
|
365
296
|
this.normalRenderTarget.setSize( width, height );
|
|
366
|
-
this.depthRenderTarget.setSize( width, height );
|
|
367
297
|
|
|
368
298
|
this.saoMaterial.uniforms[ 'size' ].value.set( width, height );
|
|
369
299
|
this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );
|
|
@@ -382,9 +312,7 @@ class SAOPass extends Pass {
|
|
|
382
312
|
|
|
383
313
|
this.saoRenderTarget.dispose();
|
|
384
314
|
this.blurIntermediateRenderTarget.dispose();
|
|
385
|
-
this.beautyRenderTarget.dispose();
|
|
386
315
|
this.normalRenderTarget.dispose();
|
|
387
|
-
this.depthRenderTarget.dispose();
|
|
388
316
|
|
|
389
317
|
this.depthMaterial.dispose();
|
|
390
318
|
this.normalMaterial.dispose();
|
|
@@ -392,7 +320,6 @@ class SAOPass extends Pass {
|
|
|
392
320
|
this.vBlurMaterial.dispose();
|
|
393
321
|
this.hBlurMaterial.dispose();
|
|
394
322
|
this.materialCopy.dispose();
|
|
395
|
-
this.depthCopy.dispose();
|
|
396
323
|
|
|
397
324
|
this.fsQuad.dispose();
|
|
398
325
|
|
|
@@ -401,11 +328,9 @@ class SAOPass extends Pass {
|
|
|
401
328
|
}
|
|
402
329
|
|
|
403
330
|
SAOPass.OUTPUT = {
|
|
404
|
-
'Beauty': 1,
|
|
405
331
|
'Default': 0,
|
|
406
|
-
'SAO':
|
|
407
|
-
'
|
|
408
|
-
'Normal': 4
|
|
332
|
+
'SAO': 1,
|
|
333
|
+
'Normal': 2
|
|
409
334
|
};
|
|
410
335
|
|
|
411
336
|
export { SAOPass };
|