@babylonjs/core 7.32.5 → 7.33.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.
@@ -13,56 +13,56 @@ interface IblShadowsSettings {
13
13
  * shadows but are more expensive to compute and require more memory.
14
14
  * The resolution is calculated as 2 to the power of this number.
15
15
  */
16
- resolutionExp: number;
16
+ resolutionExp?: number;
17
17
  /**
18
18
  * The number of different directions to sample during the voxel tracing pass. Higher
19
19
  * values will result in better quality, more stable shadows but are more expensive to compute.
20
20
  */
21
- sampleDirections: number;
21
+ sampleDirections?: number;
22
22
  /**
23
23
  * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.
24
24
  */
25
- shadowOpacity: number;
25
+ shadowOpacity?: number;
26
26
  /**
27
27
  * How long the shadows remain in the scene. 0.0 is no persistence, 1.0 is full persistence.
28
28
  */
29
- shadowRemenance: number;
29
+ shadowRemenance?: number;
30
30
  /**
31
31
  * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer
32
32
  * bits of missing geometry.
33
33
  */
34
- triPlanarVoxelization: boolean;
34
+ triPlanarVoxelization?: boolean;
35
35
  /**
36
36
  * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows
37
37
  * to increase performance. Should be a value between 0 and 1.
38
38
  */
39
- shadowRenderSizeFactor: number;
39
+ shadowRenderSizeFactor?: number;
40
40
  /**
41
41
  * Separate control for the opacity of the voxel shadows.
42
42
  */
43
- voxelShadowOpacity: number;
43
+ voxelShadowOpacity?: number;
44
44
  /**
45
45
  * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details
46
46
  * but only applies close to a shadow-casting object.
47
47
  */
48
- ssShadowsEnabled: boolean;
48
+ ssShadowsEnabled?: boolean;
49
49
  /**
50
50
  * The number of samples used in the screen space shadow pass.
51
51
  */
52
- ssShadowSampleCount: number;
52
+ ssShadowSampleCount?: number;
53
53
  /**
54
54
  * The stride of the screen-space shadow pass. This controls the distance between samples.
55
55
  */
56
- ssShadowStride: number;
56
+ ssShadowStride?: number;
57
57
  /**
58
58
  * The maximum distance a shadow can be cast in screen space. This should usually be kept small
59
59
  * as screenspace shadows are mostly useful for small details.
60
60
  */
61
- ssShadowDistanceScale: number;
61
+ ssShadowDistanceScale?: number;
62
62
  /**
63
63
  * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.
64
64
  */
65
- ssShadowThicknessScale: number;
65
+ ssShadowThicknessScale?: number;
66
66
  }
67
67
  /**
68
68
  * Voxel-based shadow rendering for IBL's.
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { _IblShadowsImportanceSamplingRenderer } from \"./iblShadowsImportanceSamplingRenderer\";\r\nimport { _IblShadowsSpatialBlurPass } from \"./iblShadowsSpatialBlurPass\";\r\nimport { _IblShadowsAccumulationPass } from \"./iblShadowsAccumulationPass\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"core/Rendering/geometryBufferRenderer\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\ninterface IblShadowsSettings {\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n resolutionExp: number;\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass. Higher\r\n * values will result in better quality, more stable shadows but are more expensive to compute.\r\n */\r\n sampleDirections: number;\r\n\r\n /**\r\n * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n shadowOpacity: number;\r\n\r\n /**\r\n * How long the shadows remain in the scene. 0.0 is no persistence, 1.0 is full persistence.\r\n */\r\n shadowRemenance: number;\r\n\r\n /**\r\n * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer\r\n * bits of missing geometry.\r\n */\r\n triPlanarVoxelization: boolean;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows\r\n * to increase performance. Should be a value between 0 and 1.\r\n */\r\n shadowRenderSizeFactor: number;\r\n\r\n /**\r\n * Separate control for the opacity of the voxel shadows.\r\n */\r\n voxelShadowOpacity: number;\r\n\r\n /**\r\n * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details\r\n * but only applies close to a shadow-casting object.\r\n */\r\n ssShadowsEnabled: boolean;\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n ssShadowSampleCount: number;\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\r\n */\r\n ssShadowStride: number;\r\n\r\n /**\r\n * The maximum distance a shadow can be cast in screen space. This should usually be kept small\r\n * as screenspace shadows are mostly useful for small details.\r\n */\r\n ssShadowDistanceScale: number;\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n ssShadowThicknessScale: number;\r\n}\r\n\r\n/**\r\n * Voxel-based shadow rendering for IBL's.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class IblShadowsRenderPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The scene that this pipeline is attached to\r\n */\r\n public scene: Scene;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: { pass: PostProcess; enabled: boolean }[] = [];\r\n\r\n private _geometryBufferRenderer: GeometryBufferRenderer;\r\n\r\n private _shadowCastingMeshes: Mesh[] = [];\r\n\r\n private _voxelRenderer: _IblShadowsVoxelRenderer;\r\n private _importanceSamplingRenderer: _IblShadowsImportanceSamplingRenderer;\r\n private _voxelTracingPass: _IblShadowsVoxelTracingPass;\r\n private _spatialBlurPass: _IblShadowsSpatialBlurPass;\r\n private _accumulationPass: _IblShadowsAccumulationPass;\r\n private _noiseTexture: Texture;\r\n /**\r\n * Raw texture to be used before final data is available.\r\n * @internal\r\n */\r\n public _dummyTexture2d: RawTexture;\r\n private _dummyTexture3d: RawTexture3D;\r\n private _shadowOpacity: number = 0.8;\r\n private _enabled: boolean = true;\r\n private _materialsWithRenderPlugin: Material[] = [];\r\n\r\n /**\r\n * Observable that triggers when the shadow renderer is ready\r\n */\r\n public onShadowTextureReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when a new IBL is set and the importance sampling is ready\r\n */\r\n public onNewIblReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * The current world-space size of that the voxel grid covers in the scene.\r\n */\r\n public voxelGridSize: number = 1.0;\r\n\r\n /**\r\n * Reset the shadow accumulation.\r\n */\r\n public resetAccumulation(): void {\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n private _renderSizeFactor: number = 1.0;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.\r\n */\r\n public get shadowRenderSizeFactor(): number {\r\n return this._renderSizeFactor;\r\n }\r\n\r\n public set shadowRenderSizeFactor(value: number) {\r\n this._renderSizeFactor = Math.max(Math.min(value, 1.0), 0.0);\r\n this._voxelTracingPass.resize(value);\r\n this._spatialBlurPass.resize(value);\r\n this._accumulationPass.resize(value);\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get voxelShadowOpacity() {\r\n return this._voxelTracingPass?.voxelShadowOpacity;\r\n }\r\n\r\n public set voxelShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.voxelShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._voxelTracingPass?.ssShadowOpacity;\r\n }\r\n\r\n public set ssShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.ssShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public get ssShadowSamples(): number {\r\n return this._voxelTracingPass?.sssSamples;\r\n }\r\n\r\n public set ssShadowSamples(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\r\n */\r\n public get ssShadowStride(): number {\r\n return this._voxelTracingPass?.sssStride;\r\n }\r\n\r\n public set ssShadowStride(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssStride = value;\r\n }\r\n\r\n private _sssMaxDistScale: number;\r\n\r\n /**\r\n * A scale for the maximum distance a shadow can be cast in screen space.\r\n * The absolute distance for SS shadows is derived from the voxel size and this scalar.\r\n */\r\n public get ssShadowDistanceScale(): number {\r\n return this._sssMaxDistScale;\r\n }\r\n\r\n public set ssShadowDistanceScale(value: number) {\r\n this._sssMaxDistScale = value;\r\n this._updateSSShadowParams();\r\n }\r\n\r\n private _sssThicknessScale: number;\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public get ssShadowThicknessScale(): number {\r\n return this._sssThicknessScale;\r\n }\r\n\r\n public set ssShadowThicknessScale(value: number) {\r\n this._sssThicknessScale = value;\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Set the IBL image to be used for shadowing. It can be either a cubemap\r\n * or a 2D equirectangular texture.\r\n * @param iblSource The texture to use for IBL shadowing\r\n */\r\n public setIblTexture(iblSource: BaseTexture) {\r\n if (!this._importanceSamplingRenderer) return;\r\n this._importanceSamplingRenderer.iblSource = iblSource;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the voxel grid data\r\n * @returns The texture containing the voxel grid data\r\n * @internal\r\n */\r\n public _getVoxelGridTexture(): Texture {\r\n const tex = this._voxelRenderer?.getVoxelGrid();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture3d;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfyTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer!.getIcdfyTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfxTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer.getIcdfxTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the noise texture.\r\n * @returns The noise texture.\r\n * @internal\r\n */\r\n public _getNoiseTexture(): Texture {\r\n const tex = this._noiseTexture;\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the voxel-tracing texture.\r\n * @returns The voxel-tracing texture.\r\n * @internal\r\n */\r\n public _getVoxelTracingTexture(): Texture {\r\n const tex = this._voxelTracingPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the spatial blur texture.\r\n * @returns The spatial blur texture.\r\n * @internal\r\n */\r\n public _getSpatialBlurTexture(): Texture {\r\n const tex = this._spatialBlurPass.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the accumulated shadow texture.\r\n * @returns The accumulated shadow texture.\r\n * @internal\r\n */\r\n public _getAccumulatedTexture(): Texture {\r\n const tex = this._accumulationPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n private _gbufferDebugPass: PostProcess;\r\n private _gbufferDebugEnabled: boolean = false;\r\n private _gBufferDebugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Is the debug view of the G-Buffer enabled?\r\n */\r\n public get gbufferDebugEnabled(): boolean {\r\n return this._gbufferDebugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the G-Buffer\r\n */\r\n public set gbufferDebugEnabled(enabled: boolean) {\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable G-Buffer debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._gbufferDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n } else {\r\n this._disableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public get importanceSamplingDebugEnabled(): boolean {\r\n return this._importanceSamplingRenderer?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public set importanceSamplingDebugEnabled(enabled: boolean) {\r\n if (!this._importanceSamplingRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable importance sampling debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._importanceSamplingRenderer.debugEnabled) return;\r\n this._importanceSamplingRenderer.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the voxel grid\r\n */\r\n public get voxelDebugEnabled(): boolean {\r\n return this._voxelRenderer?.voxelDebugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the voxel grid\r\n */\r\n public set voxelDebugEnabled(enabled: boolean) {\r\n if (!this._voxelRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Set the axis to display for the voxel grid debug view\r\n * When using tri-axis voxelization, this will display the voxel grid for the specified axis\r\n */\r\n public get voxelDebugAxis(): number {\r\n return this._voxelRenderer?.voxelDebugAxis;\r\n }\r\n\r\n /**\r\n * Set the axis to display for the voxel grid debug view\r\n * When using tri-axis voxelization, this will display the voxel grid for the specified axis\r\n */\r\n public set voxelDebugAxis(axisNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.voxelDebugAxis = axisNum;\r\n }\r\n\r\n /**\r\n * Set the mip level to display for the voxel grid debug view\r\n */\r\n public set voxelDebugDisplayMip(mipNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.setDebugMipNumber(mipNum);\r\n }\r\n\r\n /**\r\n * Display the debug view for the voxel tracing pass\r\n */\r\n public get voxelTracingDebugEnabled(): boolean {\r\n return this._voxelTracingPass?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the voxel tracing pass\r\n */\r\n public set voxelTracingDebugEnabled(enabled: boolean) {\r\n if (!this._voxelTracingPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel tracing debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._voxelTracingPass.debugEnabled) return;\r\n this._voxelTracingPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public get spatialBlurPassDebugEnabled(): boolean {\r\n return this._spatialBlurPass.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public set spatialBlurPassDebugEnabled(enabled: boolean) {\r\n if (!this._spatialBlurPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable spatial blur debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._spatialBlurPass.debugEnabled) return;\r\n this._spatialBlurPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the accumulation pass\r\n */\r\n public get accumulationPassDebugEnabled(): boolean {\r\n return this._accumulationPass?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the accumulation pass\r\n */\r\n public set accumulationPassDebugEnabled(enabled: boolean) {\r\n if (!this._accumulationPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable accumulation pass debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._accumulationPass.debugEnabled) return;\r\n this._accumulationPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to be used for shadow casting in the IBL shadow pipeline\r\n * @param mesh A mesh or list of meshes that you want to cast shadows\r\n */\r\n public addShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n if (m && this._shadowCastingMeshes.indexOf(m) === -1) {\r\n this._shadowCastingMeshes.push(m);\r\n }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the shadow-casting list.\r\n * @param mesh The mesh or list of meshes that you don't want to cast shadows.\r\n */\r\n public removeShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n const index = this._shadowCastingMeshes.indexOf(m);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n }\r\n }\r\n } else {\r\n const index = this._shadowCastingMeshes.indexOf(mesh);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public get resolutionExp() {\r\n return this._voxelRenderer.voxelResolutionExp;\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public set resolutionExp(newResolution: number) {\r\n if (newResolution === this._voxelRenderer.voxelResolutionExp) return;\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n Logger.Warn(\"Can't change the resolution of the voxel grid while voxelization is in progress.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelResolutionExp = newResolution;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public get sampleDirections() {\r\n return this._voxelTracingPass?.sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public set sampleDirections(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public get shadowRemenance(): number {\r\n return this._accumulationPass?.remenance;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public set shadowRemenance(value: number) {\r\n if (!this._accumulationPass) return;\r\n this._accumulationPass.remenance = value;\r\n }\r\n\r\n /**\r\n * The global rotation of the IBL for shadows\r\n */\r\n public get envRotation() {\r\n return this._voxelTracingPass?.envRotation;\r\n }\r\n\r\n /**\r\n * The global rotation of the IBL for shadows\r\n */\r\n public set envRotation(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.envRotation = value;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public get allowDebugPasses(): boolean {\r\n return this._allowDebugPasses;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public set allowDebugPasses(value: boolean) {\r\n if (this._allowDebugPasses === value) return;\r\n this._allowDebugPasses = value;\r\n if (value) {\r\n if (this._importanceSamplingRenderer.isReady()) {\r\n this._createDebugPasses();\r\n } else {\r\n this._importanceSamplingRenderer.onReadyObservable.addOnce(() => {\r\n this._createDebugPasses();\r\n });\r\n }\r\n } else {\r\n this._disposeDebugPasses();\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportIBLShadows;\r\n }\r\n\r\n /**\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param options Options to configure the pipeline\r\n * @param cameras Cameras to apply the pipeline to.\r\n */\r\n constructor(name: string, scene: Scene, options: Partial<IblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\r\n this._cameras = cameras || [scene.activeCamera!];\r\n // Create the dummy textures to be used when the pipeline is not ready\r\n const blackPixels = new Uint8Array([0, 0, 0, 255]);\r\n this._dummyTexture2d = new RawTexture(blackPixels, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer(undefined, Constants.TEXTUREFORMAT_DEPTH32_FLOAT, textureTypesAndFormats);\r\n if (!geometryBufferRenderer) {\r\n Logger.Error(\"Geometry buffer renderer is required for IBL shadows to work.\");\r\n return;\r\n }\r\n this._geometryBufferRenderer = geometryBufferRenderer;\r\n this._geometryBufferRenderer.enableScreenspaceDepth = true;\r\n this._geometryBufferRenderer.enableVelocityLinear = true;\r\n this._geometryBufferRenderer.enablePosition = true;\r\n this._geometryBufferRenderer.enableNormal = true;\r\n this._geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n\r\n this.shadowOpacity = options.shadowOpacity || 0.8;\r\n this._voxelRenderer = new _IblShadowsVoxelRenderer(\r\n this.scene,\r\n this,\r\n options ? options.resolutionExp : 6,\r\n options.triPlanarVoxelization !== undefined ? options.triPlanarVoxelization : true\r\n );\r\n this._importanceSamplingRenderer = new _IblShadowsImportanceSamplingRenderer(this.scene);\r\n this._voxelTracingPass = new _IblShadowsVoxelTracingPass(this.scene, this);\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene, this);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene, this);\r\n this._accumulationPass.onReadyObservable.addOnce(() => {\r\n this.onShadowTextureReadyObservable.notifyObservers();\r\n });\r\n this.sampleDirections = options.sampleDirections || 2;\r\n this.voxelShadowOpacity = options.voxelShadowOpacity ?? 1.0;\r\n this.shadowRenderSizeFactor = options.shadowRenderSizeFactor || 1.0;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowDistanceScale = options.ssShadowDistanceScale || 1.25;\r\n this.ssShadowSamples = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThicknessScale = options.ssShadowThicknessScale || 1.0;\r\n this.shadowRemenance = options.shadowRemenance ?? 0.75;\r\n this._noiseTexture = new Texture(\"https://assets.babylonjs.com/textures/blue_noise/blue_noise_rgb.png\", this.scene, false, true, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n if (this.scene.environmentTexture) {\r\n this._importanceSamplingRenderer.iblSource = this.scene.environmentTexture;\r\n }\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this.scene.onActiveCameraChanged.add(this._listenForCameraChanges.bind(this));\r\n this.scene.onBeforeRenderObservable.add(this._updateBeforeRender.bind(this));\r\n\r\n this._listenForCameraChanges();\r\n this.scene.getEngine().onResizeObservable.add(this._handleResize.bind(this));\r\n\r\n // Assigning the shadow texture to the materials needs to be done after the RT's are created.\r\n this._importanceSamplingRenderer.onReadyObservable.add(() => {\r\n this._setPluginParameters();\r\n this.onNewIblReadyObservable.notifyObservers();\r\n });\r\n }\r\n\r\n /**\r\n * Toggle the shadow tracing on or off\r\n * @param enabled Toggle the shadow tracing on or off\r\n */\r\n public toggleShadow(enabled: boolean) {\r\n this._enabled = enabled;\r\n this._voxelTracingPass.enabled = enabled;\r\n this._spatialBlurPass.enabled = enabled;\r\n this._accumulationPass.enabled = enabled;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(IBLShadowsPluginMaterial.Name) as IBLShadowsPluginMaterial;\r\n plugin.isEnabled = enabled;\r\n }\r\n });\r\n this._setPluginParameters();\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._voxelTracingPass.resize(this.shadowRenderSizeFactor);\r\n this._spatialBlurPass.resize(this.shadowRenderSizeFactor);\r\n this._accumulationPass.resize(this.shadowRenderSizeFactor);\r\n this._setPluginParameters();\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const isWebGPU = this.engine.isWebGPU;\r\n const textureNames: string[] = [\"depthSampler\", \"normalSampler\", \"positionSampler\", \"velocitySampler\"];\r\n\r\n const options: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n uniforms: [\"sizeParams\"],\r\n samplers: textureNames,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowGBufferDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowGBufferDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const normalIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[normalIndex]);\r\n const positionIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n effect.setTexture(\"positionSampler\", this._geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n const velocityIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", this._geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n effect.setVector4(\"sizeParams\", this._gBufferDebugSizeParams);\r\n if (this.scene.activeCamera) {\r\n effect.setFloat(\"maxDepth\", this.scene.activeCamera.maxZ);\r\n }\r\n });\r\n return this._gbufferDebugPass;\r\n }\r\n\r\n private _createDebugPasses() {\r\n this._debugPasses = [\r\n { pass: this._importanceSamplingRenderer.getDebugPassPP(), enabled: this.importanceSamplingDebugEnabled },\r\n { pass: this._voxelRenderer.getDebugPassPP(), enabled: this.voxelDebugEnabled },\r\n { pass: this._voxelTracingPass.getDebugPassPP(), enabled: this.voxelTracingDebugEnabled },\r\n { pass: this._spatialBlurPass.getDebugPassPP(), enabled: this.spatialBlurPassDebugEnabled },\r\n { pass: this._accumulationPass.getDebugPassPP(), enabled: this.accumulationPassDebugEnabled },\r\n { pass: this._getGBufferDebugPass(), enabled: this.gbufferDebugEnabled },\r\n ];\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) continue;\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n this._debugPasses[i].pass.name,\r\n () => {\r\n return this._debugPasses[i].pass;\r\n },\r\n true\r\n )\r\n );\r\n }\r\n const cameras = this.cameras.slice();\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) continue;\r\n if (this._debugPasses[i].enabled) {\r\n this._enableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n } else {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n }\r\n }\r\n }\r\n\r\n private _disposeEffectPasses() {\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this._disposeDebugPasses();\r\n this._reset();\r\n }\r\n\r\n private _disposeDebugPasses() {\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n this._debugPasses[i].pass.dispose();\r\n }\r\n this._debugPasses = [];\r\n }\r\n\r\n private _updateDebugPasses() {\r\n let count = 0;\r\n if (this._gbufferDebugEnabled) count++;\r\n if (this.importanceSamplingDebugEnabled) count++;\r\n if (this.voxelDebugEnabled) count++;\r\n if (this.voxelTracingDebugEnabled) count++;\r\n if (this.spatialBlurPassDebugEnabled) count++;\r\n if (this.accumulationPassDebugEnabled) count++;\r\n\r\n const rows = Math.ceil(Math.sqrt(count));\r\n const cols = Math.ceil(count / rows);\r\n const width = 1.0 / cols;\r\n const height = 1.0 / rows;\r\n let x = 0;\r\n let y = 0;\r\n if (this.gbufferDebugEnabled) {\r\n this._gBufferDebugSizeParams.set(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n\r\n if (this.importanceSamplingDebugEnabled) {\r\n this._importanceSamplingRenderer.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelDebugEnabled) {\r\n this._voxelRenderer.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n this._voxelTracingPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n this._spatialBlurPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n this._accumulationPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Trigger the scene to be re-voxelized. This is useful when the scene has changed and the voxel grid needs to be updated.\r\n */\r\n public updateVoxelization() {\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateVoxelization called with no shadow-casting meshes to voxelize.\");\r\n return;\r\n }\r\n this._voxelRenderer.updateVoxelGrid(this._shadowCastingMeshes);\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Trigger the scene bounds of shadow-casters to be updated. This is useful when the scene has changed and the bounds need\r\n * to be recalculated. This will also trigger a re-voxelization.\r\n */\r\n public updateSceneBounds() {\r\n const bounds: { min: Vector3; max: Vector3 } = {\r\n min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),\r\n max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),\r\n };\r\n this._shadowCastingMeshes.forEach((mesh) => {\r\n const localBounds = mesh.getHierarchyBoundingVectors(true);\r\n bounds.min = Vector3.Minimize(bounds.min, localBounds.min);\r\n bounds.max = Vector3.Maximize(bounds.max, localBounds.max);\r\n });\r\n\r\n const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (this._shadowCastingMeshes.length === 0 || !isFinite(this.voxelGridSize) || this.voxelGridSize === 0) {\r\n Logger.Warn(\"IBL Shadows: Scene size is invalid. Can't update bounds.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n const halfSize = this.voxelGridSize / 2.0;\r\n const centre = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);\r\n const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), new Vector3(0, 0, 0));\r\n const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centre);\r\n invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, invWorldScaleMatrix);\r\n this._voxelTracingPass.setWorldScaleMatrix(invWorldScaleMatrix);\r\n this._voxelRenderer.setWorldScaleMatrix(invWorldScaleMatrix);\r\n // Set world scale for spatial blur.\r\n this._spatialBlurPass.setWorldScale(halfSize * 2.0);\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Update the SS shadow max distance and thickness based on the voxel grid size and resolution.\r\n * The max distance should be just a little larger than the world size of a single voxel.\r\n */\r\n private _updateSSShadowParams(): void {\r\n this._voxelTracingPass.sssMaxDist = (this._sssMaxDistScale * this.voxelGridSize) / (1 << this.resolutionExp);\r\n this._voxelTracingPass.sssThickness = this._sssThicknessScale * 0.005 * this.voxelGridSize;\r\n }\r\n\r\n /**\r\n * Apply the shadows to a material or array of materials.\r\n * @param material Material that will be affected by the shadows. If not provided, all materials of the scene will be affected.\r\n */\r\n public addShadowReceivingMaterial(material?: Material | Material[]) {\r\n if (material) {\r\n if (Array.isArray(material)) {\r\n material.forEach((m) => {\r\n this._addShadowSupportToMaterial(m);\r\n });\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n this.scene.materials.forEach((mat) => {\r\n this._addShadowSupportToMaterial(mat);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Remove a material from receiving shadows\r\n * @param material The material that will no longer receive shadows\r\n */\r\n public removeShadowReceivingMaterial(material: Material | Material[]) {\r\n if (Array.isArray(material)) {\r\n material.forEach((m) => {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(m);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = m.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n });\r\n } else {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(material);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = material.pluginManager!.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n }\r\n\r\n protected _addShadowSupportToMaterial(material: Material) {\r\n if (!(material instanceof PBRBaseMaterial) && !(material instanceof StandardMaterial)) {\r\n return;\r\n }\r\n let plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n plugin = new IBLShadowsPluginMaterial(material);\r\n }\r\n if (this._materialsWithRenderPlugin.indexOf(material) !== -1) {\r\n return;\r\n }\r\n\r\n if (this._enabled) {\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n\r\n plugin.isEnabled = this._enabled;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n });\r\n }\r\n\r\n private _updateBeforeRender() {\r\n this._updateDebugPasses();\r\n }\r\n\r\n private _listenForCameraChanges() {\r\n // We want to listen for camera changes and change settings while the camera is moving.\r\n this.scene.activeCamera?.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationPass.isMoving = true;\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the IBL shadow pipeline is ready to render shadows\r\n * @returns true if the IBL shadow pipeline is ready to render the shadows\r\n */\r\n public isReady() {\r\n return (\r\n this._noiseTexture.isReady() &&\r\n this._voxelRenderer.isReady() &&\r\n this._importanceSamplingRenderer.isReady() &&\r\n (!this._voxelTracingPass || this._voxelTracingPass.isReady()) &&\r\n (!this._spatialBlurPass || this._spatialBlurPass.isReady()) &&\r\n (!this._accumulationPass || this._accumulationPass.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"IBLShadowsRenderPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"IBLShadowsRenderPipeline\";\r\n }\r\n\r\n /**\r\n * Disposes the IBL shadow pipeline and associated resources\r\n */\r\n public override dispose() {\r\n const materials = this._materialsWithRenderPlugin.splice(0);\r\n materials.forEach((mat) => {\r\n this.removeShadowReceivingMaterial(mat);\r\n });\r\n this._disposeEffectPasses();\r\n this._noiseTexture.dispose();\r\n this._voxelRenderer.dispose();\r\n this._importanceSamplingRenderer.dispose();\r\n this._voxelTracingPass.dispose();\r\n this._spatialBlurPass.dispose();\r\n this._accumulationPass.dispose();\r\n this._dummyTexture2d.dispose();\r\n this._dummyTexture3d.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblShadowsRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsRenderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { _IblShadowsImportanceSamplingRenderer } from \"./iblShadowsImportanceSamplingRenderer\";\r\nimport { _IblShadowsSpatialBlurPass } from \"./iblShadowsSpatialBlurPass\";\r\nimport { _IblShadowsAccumulationPass } from \"./iblShadowsAccumulationPass\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"core/Rendering/geometryBufferRenderer\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RawTexture3D } from \"core/Materials/Textures/rawTexture3D\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { IBLShadowsPluginMaterial } from \"./iblShadowsPluginMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\ninterface IblShadowsSettings {\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n resolutionExp?: number;\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass. Higher\r\n * values will result in better quality, more stable shadows but are more expensive to compute.\r\n */\r\n sampleDirections?: number;\r\n\r\n /**\r\n * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n shadowOpacity?: number;\r\n\r\n /**\r\n * How long the shadows remain in the scene. 0.0 is no persistence, 1.0 is full persistence.\r\n */\r\n shadowRemenance?: number;\r\n\r\n /**\r\n * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer\r\n * bits of missing geometry.\r\n */\r\n triPlanarVoxelization?: boolean;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows\r\n * to increase performance. Should be a value between 0 and 1.\r\n */\r\n shadowRenderSizeFactor?: number;\r\n\r\n /**\r\n * Separate control for the opacity of the voxel shadows.\r\n */\r\n voxelShadowOpacity?: number;\r\n\r\n /**\r\n * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details\r\n * but only applies close to a shadow-casting object.\r\n */\r\n ssShadowsEnabled?: boolean;\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n ssShadowSampleCount?: number;\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\r\n */\r\n ssShadowStride?: number;\r\n\r\n /**\r\n * The maximum distance a shadow can be cast in screen space. This should usually be kept small\r\n * as screenspace shadows are mostly useful for small details.\r\n */\r\n ssShadowDistanceScale?: number;\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n ssShadowThicknessScale?: number;\r\n}\r\n\r\n/**\r\n * Voxel-based shadow rendering for IBL's.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n */\r\nexport class IblShadowsRenderPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The scene that this pipeline is attached to\r\n */\r\n public scene: Scene;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: { pass: PostProcess; enabled: boolean }[] = [];\r\n\r\n private _geometryBufferRenderer: GeometryBufferRenderer;\r\n\r\n private _shadowCastingMeshes: Mesh[] = [];\r\n\r\n private _voxelRenderer: _IblShadowsVoxelRenderer;\r\n private _importanceSamplingRenderer: _IblShadowsImportanceSamplingRenderer;\r\n private _voxelTracingPass: _IblShadowsVoxelTracingPass;\r\n private _spatialBlurPass: _IblShadowsSpatialBlurPass;\r\n private _accumulationPass: _IblShadowsAccumulationPass;\r\n private _noiseTexture: Texture;\r\n /**\r\n * Raw texture to be used before final data is available.\r\n * @internal\r\n */\r\n public _dummyTexture2d: RawTexture;\r\n private _dummyTexture3d: RawTexture3D;\r\n private _shadowOpacity: number = 0.8;\r\n private _enabled: boolean = true;\r\n private _materialsWithRenderPlugin: Material[] = [];\r\n\r\n /**\r\n * Observable that triggers when the shadow renderer is ready\r\n */\r\n public onShadowTextureReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when a new IBL is set and the importance sampling is ready\r\n */\r\n public onNewIblReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * The current world-space size of that the voxel grid covers in the scene.\r\n */\r\n public voxelGridSize: number = 1.0;\r\n\r\n /**\r\n * Reset the shadow accumulation.\r\n */\r\n public resetAccumulation(): void {\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\r\n this._setPluginParameters();\r\n }\r\n\r\n private _renderSizeFactor: number = 1.0;\r\n\r\n /**\r\n * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.\r\n */\r\n public get shadowRenderSizeFactor(): number {\r\n return this._renderSizeFactor;\r\n }\r\n\r\n public set shadowRenderSizeFactor(value: number) {\r\n this._renderSizeFactor = Math.max(Math.min(value, 1.0), 0.0);\r\n this._voxelTracingPass.resize(value);\r\n this._spatialBlurPass.resize(value);\r\n this._accumulationPass.resize(value);\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get voxelShadowOpacity() {\r\n return this._voxelTracingPass?.voxelShadowOpacity;\r\n }\r\n\r\n public set voxelShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.voxelShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._voxelTracingPass?.ssShadowOpacity;\r\n }\r\n\r\n public set ssShadowOpacity(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.ssShadowOpacity = value;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public get ssShadowSamples(): number {\r\n return this._voxelTracingPass?.sssSamples;\r\n }\r\n\r\n public set ssShadowSamples(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\r\n */\r\n public get ssShadowStride(): number {\r\n return this._voxelTracingPass?.sssStride;\r\n }\r\n\r\n public set ssShadowStride(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssStride = value;\r\n }\r\n\r\n private _sssMaxDistScale: number;\r\n\r\n /**\r\n * A scale for the maximum distance a shadow can be cast in screen space.\r\n * The absolute distance for SS shadows is derived from the voxel size and this scalar.\r\n */\r\n public get ssShadowDistanceScale(): number {\r\n return this._sssMaxDistScale;\r\n }\r\n\r\n public set ssShadowDistanceScale(value: number) {\r\n this._sssMaxDistScale = value;\r\n this._updateSSShadowParams();\r\n }\r\n\r\n private _sssThicknessScale: number;\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public get ssShadowThicknessScale(): number {\r\n return this._sssThicknessScale;\r\n }\r\n\r\n public set ssShadowThicknessScale(value: number) {\r\n this._sssThicknessScale = value;\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Set the IBL image to be used for shadowing. It can be either a cubemap\r\n * or a 2D equirectangular texture.\r\n * @param iblSource The texture to use for IBL shadowing\r\n */\r\n public setIblTexture(iblSource: BaseTexture) {\r\n if (!this._importanceSamplingRenderer) return;\r\n this._importanceSamplingRenderer.iblSource = iblSource;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the voxel grid data\r\n * @returns The texture containing the voxel grid data\r\n * @internal\r\n */\r\n public _getVoxelGridTexture(): Texture {\r\n const tex = this._voxelRenderer?.getVoxelGrid();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture3d;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfyTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer!.getIcdfyTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @returns The texture containing the importance sampling CDF data for the IBL shadow pipeline\r\n * @internal\r\n */\r\n public _getIcdfxTexture(): Texture {\r\n const tex = this._importanceSamplingRenderer.getIcdfxTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the noise texture.\r\n * @returns The noise texture.\r\n * @internal\r\n */\r\n public _getNoiseTexture(): Texture {\r\n const tex = this._noiseTexture;\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the voxel-tracing texture.\r\n * @returns The voxel-tracing texture.\r\n * @internal\r\n */\r\n public _getVoxelTracingTexture(): Texture {\r\n const tex = this._voxelTracingPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the spatial blur texture.\r\n * @returns The spatial blur texture.\r\n * @internal\r\n */\r\n public _getSpatialBlurTexture(): Texture {\r\n const tex = this._spatialBlurPass.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n /**\r\n * Returns the accumulated shadow texture.\r\n * @returns The accumulated shadow texture.\r\n * @internal\r\n */\r\n public _getAccumulatedTexture(): Texture {\r\n const tex = this._accumulationPass?.getOutputTexture();\r\n if (tex && tex.isReady()) {\r\n return tex;\r\n }\r\n return this._dummyTexture2d;\r\n }\r\n\r\n private _gbufferDebugPass: PostProcess;\r\n private _gbufferDebugEnabled: boolean = false;\r\n private _gBufferDebugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Is the debug view of the G-Buffer enabled?\r\n */\r\n public get gbufferDebugEnabled(): boolean {\r\n return this._gbufferDebugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the G-Buffer\r\n */\r\n public set gbufferDebugEnabled(enabled: boolean) {\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable G-Buffer debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._gbufferDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n } else {\r\n this._disableEffect(this._getGBufferDebugPass().name, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public get importanceSamplingDebugEnabled(): boolean {\r\n return this._importanceSamplingRenderer?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the CDF importance sampling data\r\n */\r\n public set importanceSamplingDebugEnabled(enabled: boolean) {\r\n if (!this._importanceSamplingRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable importance sampling debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._importanceSamplingRenderer.debugEnabled) return;\r\n this._importanceSamplingRenderer.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._importanceSamplingRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the voxel grid\r\n */\r\n public get voxelDebugEnabled(): boolean {\r\n return this._voxelRenderer?.voxelDebugEnabled;\r\n }\r\n\r\n /**\r\n * Turn on or off the debug view of the voxel grid\r\n */\r\n public set voxelDebugEnabled(enabled: boolean) {\r\n if (!this._voxelRenderer) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelDebugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelRenderer.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Set the axis to display for the voxel grid debug view\r\n * When using tri-axis voxelization, this will display the voxel grid for the specified axis\r\n */\r\n public get voxelDebugAxis(): number {\r\n return this._voxelRenderer?.voxelDebugAxis;\r\n }\r\n\r\n /**\r\n * Set the axis to display for the voxel grid debug view\r\n * When using tri-axis voxelization, this will display the voxel grid for the specified axis\r\n */\r\n public set voxelDebugAxis(axisNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.voxelDebugAxis = axisNum;\r\n }\r\n\r\n /**\r\n * Set the mip level to display for the voxel grid debug view\r\n */\r\n public set voxelDebugDisplayMip(mipNum: number) {\r\n if (!this._voxelRenderer) return;\r\n this._voxelRenderer.setDebugMipNumber(mipNum);\r\n }\r\n\r\n /**\r\n * Display the debug view for the voxel tracing pass\r\n */\r\n public get voxelTracingDebugEnabled(): boolean {\r\n return this._voxelTracingPass?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the voxel tracing pass\r\n */\r\n public set voxelTracingDebugEnabled(enabled: boolean) {\r\n if (!this._voxelTracingPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable voxel tracing debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._voxelTracingPass.debugEnabled) return;\r\n this._voxelTracingPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._voxelTracingPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public get spatialBlurPassDebugEnabled(): boolean {\r\n return this._spatialBlurPass.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the spatial blur pass\r\n */\r\n public set spatialBlurPassDebugEnabled(enabled: boolean) {\r\n if (!this._spatialBlurPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable spatial blur debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._spatialBlurPass.debugEnabled) return;\r\n this._spatialBlurPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._spatialBlurPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Display the debug view for the accumulation pass\r\n */\r\n public get accumulationPassDebugEnabled(): boolean {\r\n return this._accumulationPass?.debugEnabled;\r\n }\r\n\r\n /**\r\n * Display the debug view for the accumulation pass\r\n */\r\n public set accumulationPassDebugEnabled(enabled: boolean) {\r\n if (!this._accumulationPass) return;\r\n if (enabled && !this.allowDebugPasses) {\r\n Logger.Warn(\"Can't enable accumulation pass debug view without setting allowDebugPasses to true.\");\r\n return;\r\n }\r\n if (enabled === this._accumulationPass.debugEnabled) return;\r\n this._accumulationPass.debugEnabled = enabled;\r\n if (enabled) {\r\n this._enableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n } else {\r\n this._disableEffect(this._accumulationPass.debugPassName, this.cameras);\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to be used for shadow casting in the IBL shadow pipeline\r\n * @param mesh A mesh or list of meshes that you want to cast shadows\r\n */\r\n public addShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n if (m && this._shadowCastingMeshes.indexOf(m) === -1) {\r\n this._shadowCastingMeshes.push(m);\r\n }\r\n }\r\n } else {\r\n if (mesh && this._shadowCastingMeshes.indexOf(mesh) === -1) {\r\n this._shadowCastingMeshes.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the shadow-casting list.\r\n * @param mesh The mesh or list of meshes that you don't want to cast shadows.\r\n */\r\n public removeShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n const index = this._shadowCastingMeshes.indexOf(m);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n }\r\n }\r\n } else {\r\n const index = this._shadowCastingMeshes.indexOf(mesh);\r\n if (index !== -1) {\r\n this._shadowCastingMeshes.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public get resolutionExp() {\r\n return this._voxelRenderer.voxelResolutionExp;\r\n }\r\n\r\n /**\r\n * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper\r\n * shadows but are more expensive to compute and require more memory.\r\n * The resolution is calculated as 2 to the power of this number.\r\n */\r\n public set resolutionExp(newResolution: number) {\r\n if (newResolution === this._voxelRenderer.voxelResolutionExp) return;\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n Logger.Warn(\"Can't change the resolution of the voxel grid while voxelization is in progress.\");\r\n return;\r\n }\r\n this._voxelRenderer.voxelResolutionExp = newResolution;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public get sampleDirections() {\r\n return this._voxelTracingPass?.sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of different directions to sample during the voxel tracing pass\r\n */\r\n public set sampleDirections(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public get shadowRemenance(): number {\r\n return this._accumulationPass?.remenance;\r\n }\r\n\r\n /**\r\n * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.\r\n **/\r\n public set shadowRemenance(value: number) {\r\n if (!this._accumulationPass) return;\r\n this._accumulationPass.remenance = value;\r\n }\r\n\r\n /**\r\n * The global rotation of the IBL for shadows\r\n */\r\n public get envRotation() {\r\n return this._voxelTracingPass?.envRotation;\r\n }\r\n\r\n /**\r\n * The global rotation of the IBL for shadows\r\n */\r\n public set envRotation(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.envRotation = value;\r\n this._accumulationPass.reset = true;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public get allowDebugPasses(): boolean {\r\n return this._allowDebugPasses;\r\n }\r\n\r\n /**\r\n * Allow debug passes to be enabled. Default is false.\r\n */\r\n public set allowDebugPasses(value: boolean) {\r\n if (this._allowDebugPasses === value) return;\r\n this._allowDebugPasses = value;\r\n if (value) {\r\n if (this._importanceSamplingRenderer.isReady()) {\r\n this._createDebugPasses();\r\n } else {\r\n this._importanceSamplingRenderer.onReadyObservable.addOnce(() => {\r\n this._createDebugPasses();\r\n });\r\n }\r\n } else {\r\n this._disposeDebugPasses();\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportIBLShadows;\r\n }\r\n\r\n /**\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param options Options to configure the pipeline\r\n * @param cameras Cameras to apply the pipeline to.\r\n */\r\n constructor(name: string, scene: Scene, options: Partial<IblShadowsSettings> = {}, cameras?: Camera[]) {\r\n super(scene.getEngine(), name);\r\n this.scene = scene;\r\n this._cameras = cameras || [scene.activeCamera!];\r\n // Create the dummy textures to be used when the pipeline is not ready\r\n const blackPixels = new Uint8Array([0, 0, 0, 255]);\r\n this._dummyTexture2d = new RawTexture(blackPixels, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n this._dummyTexture3d = new RawTexture3D(blackPixels, 1, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false);\r\n\r\n // Setup the geometry buffer target formats\r\n const textureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {};\r\n textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.POSITION_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n textureTypesAndFormats[GeometryBufferRenderer.NORMAL_TEXTURE_TYPE] = {\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n };\r\n const geometryBufferRenderer = scene.enableGeometryBufferRenderer(undefined, Constants.TEXTUREFORMAT_DEPTH32_FLOAT, textureTypesAndFormats);\r\n if (!geometryBufferRenderer) {\r\n Logger.Error(\"Geometry buffer renderer is required for IBL shadows to work.\");\r\n return;\r\n }\r\n this._geometryBufferRenderer = geometryBufferRenderer;\r\n this._geometryBufferRenderer.enableScreenspaceDepth = true;\r\n this._geometryBufferRenderer.enableVelocityLinear = true;\r\n this._geometryBufferRenderer.enablePosition = true;\r\n this._geometryBufferRenderer.enableNormal = true;\r\n this._geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n\r\n this.shadowOpacity = options.shadowOpacity || 0.8;\r\n this._voxelRenderer = new _IblShadowsVoxelRenderer(\r\n this.scene,\r\n this,\r\n options ? options.resolutionExp : 6,\r\n options.triPlanarVoxelization !== undefined ? options.triPlanarVoxelization : true\r\n );\r\n this._importanceSamplingRenderer = new _IblShadowsImportanceSamplingRenderer(this.scene);\r\n this._voxelTracingPass = new _IblShadowsVoxelTracingPass(this.scene, this);\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene, this);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene, this);\r\n this._accumulationPass.onReadyObservable.addOnce(() => {\r\n this.onShadowTextureReadyObservable.notifyObservers();\r\n });\r\n this.sampleDirections = options.sampleDirections || 2;\r\n this.voxelShadowOpacity = options.voxelShadowOpacity ?? 1.0;\r\n this.shadowRenderSizeFactor = options.shadowRenderSizeFactor || 1.0;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowDistanceScale = options.ssShadowDistanceScale || 1.25;\r\n this.ssShadowSamples = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThicknessScale = options.ssShadowThicknessScale || 1.0;\r\n this.shadowRemenance = options.shadowRemenance ?? 0.75;\r\n this._noiseTexture = new Texture(\"https://assets.babylonjs.com/textures/blue_noise/blue_noise_rgb.png\", this.scene, false, true, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n if (this.scene.environmentTexture) {\r\n this._importanceSamplingRenderer.iblSource = this.scene.environmentTexture;\r\n }\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this.scene.onActiveCameraChanged.add(this._listenForCameraChanges.bind(this));\r\n this.scene.onBeforeRenderObservable.add(this._updateBeforeRender.bind(this));\r\n\r\n this._listenForCameraChanges();\r\n this.scene.getEngine().onResizeObservable.add(this._handleResize.bind(this));\r\n\r\n // Assigning the shadow texture to the materials needs to be done after the RT's are created.\r\n this._importanceSamplingRenderer.onReadyObservable.add(() => {\r\n this._setPluginParameters();\r\n this.onNewIblReadyObservable.notifyObservers();\r\n });\r\n }\r\n\r\n /**\r\n * Toggle the shadow tracing on or off\r\n * @param enabled Toggle the shadow tracing on or off\r\n */\r\n public toggleShadow(enabled: boolean) {\r\n this._enabled = enabled;\r\n this._voxelTracingPass.enabled = enabled;\r\n this._spatialBlurPass.enabled = enabled;\r\n this._accumulationPass.enabled = enabled;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(IBLShadowsPluginMaterial.Name) as IBLShadowsPluginMaterial;\r\n plugin.isEnabled = enabled;\r\n }\r\n });\r\n this._setPluginParameters();\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._voxelTracingPass.resize(this.shadowRenderSizeFactor);\r\n this._spatialBlurPass.resize(this.shadowRenderSizeFactor);\r\n this._accumulationPass.resize(this.shadowRenderSizeFactor);\r\n this._setPluginParameters();\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const isWebGPU = this.engine.isWebGPU;\r\n const textureNames: string[] = [\"depthSampler\", \"normalSampler\", \"positionSampler\", \"velocitySampler\"];\r\n\r\n const options: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n uniforms: [\"sizeParams\"],\r\n samplers: textureNames,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowGBufferDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowGBufferDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const normalIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[normalIndex]);\r\n const positionIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n effect.setTexture(\"positionSampler\", this._geometryBufferRenderer.getGBuffer().textures[positionIndex]);\r\n const velocityIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", this._geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n effect.setVector4(\"sizeParams\", this._gBufferDebugSizeParams);\r\n if (this.scene.activeCamera) {\r\n effect.setFloat(\"maxDepth\", this.scene.activeCamera.maxZ);\r\n }\r\n });\r\n return this._gbufferDebugPass;\r\n }\r\n\r\n private _createDebugPasses() {\r\n this._debugPasses = [\r\n { pass: this._importanceSamplingRenderer.getDebugPassPP(), enabled: this.importanceSamplingDebugEnabled },\r\n { pass: this._voxelRenderer.getDebugPassPP(), enabled: this.voxelDebugEnabled },\r\n { pass: this._voxelTracingPass.getDebugPassPP(), enabled: this.voxelTracingDebugEnabled },\r\n { pass: this._spatialBlurPass.getDebugPassPP(), enabled: this.spatialBlurPassDebugEnabled },\r\n { pass: this._accumulationPass.getDebugPassPP(), enabled: this.accumulationPassDebugEnabled },\r\n { pass: this._getGBufferDebugPass(), enabled: this.gbufferDebugEnabled },\r\n ];\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) continue;\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n this._debugPasses[i].pass.name,\r\n () => {\r\n return this._debugPasses[i].pass;\r\n },\r\n true\r\n )\r\n );\r\n }\r\n const cameras = this.cameras.slice();\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i].pass) continue;\r\n if (this._debugPasses[i].enabled) {\r\n this._enableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n } else {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n }\r\n }\r\n }\r\n\r\n private _disposeEffectPasses() {\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this._disposeDebugPasses();\r\n this._reset();\r\n }\r\n\r\n private _disposeDebugPasses() {\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n this._disableEffect(this._debugPasses[i].pass.name, this.cameras);\r\n this._debugPasses[i].pass.dispose();\r\n }\r\n this._debugPasses = [];\r\n }\r\n\r\n private _updateDebugPasses() {\r\n let count = 0;\r\n if (this._gbufferDebugEnabled) count++;\r\n if (this.importanceSamplingDebugEnabled) count++;\r\n if (this.voxelDebugEnabled) count++;\r\n if (this.voxelTracingDebugEnabled) count++;\r\n if (this.spatialBlurPassDebugEnabled) count++;\r\n if (this.accumulationPassDebugEnabled) count++;\r\n\r\n const rows = Math.ceil(Math.sqrt(count));\r\n const cols = Math.ceil(count / rows);\r\n const width = 1.0 / cols;\r\n const height = 1.0 / rows;\r\n let x = 0;\r\n let y = 0;\r\n if (this.gbufferDebugEnabled) {\r\n this._gBufferDebugSizeParams.set(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n\r\n if (this.importanceSamplingDebugEnabled) {\r\n this._importanceSamplingRenderer.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelDebugEnabled) {\r\n this._voxelRenderer.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.voxelTracingDebugEnabled) {\r\n this._voxelTracingPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.spatialBlurPassDebugEnabled) {\r\n this._spatialBlurPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n if (this.accumulationPassDebugEnabled) {\r\n this._accumulationPass.setDebugDisplayParams(x, y, cols, rows);\r\n x -= width;\r\n if (x <= -1) {\r\n x = 0;\r\n y -= height;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Trigger the scene to be re-voxelized. This is useful when the scene has changed and the voxel grid needs to be updated.\r\n */\r\n public updateVoxelization() {\r\n if (this._shadowCastingMeshes.length === 0) {\r\n Logger.Warn(\"IBL Shadows: updateVoxelization called with no shadow-casting meshes to voxelize.\");\r\n return;\r\n }\r\n this._voxelRenderer.updateVoxelGrid(this._shadowCastingMeshes);\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Trigger the scene bounds of shadow-casters to be updated. This is useful when the scene has changed and the bounds need\r\n * to be recalculated. This will also trigger a re-voxelization.\r\n */\r\n public updateSceneBounds() {\r\n const bounds: { min: Vector3; max: Vector3 } = {\r\n min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),\r\n max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),\r\n };\r\n this._shadowCastingMeshes.forEach((mesh) => {\r\n const localBounds = mesh.getHierarchyBoundingVectors(true);\r\n bounds.min = Vector3.Minimize(bounds.min, localBounds.min);\r\n bounds.max = Vector3.Maximize(bounds.max, localBounds.max);\r\n });\r\n\r\n const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n if (this._shadowCastingMeshes.length === 0 || !isFinite(this.voxelGridSize) || this.voxelGridSize === 0) {\r\n Logger.Warn(\"IBL Shadows: Scene size is invalid. Can't update bounds.\");\r\n this.voxelGridSize = 1.0;\r\n return;\r\n }\r\n const halfSize = this.voxelGridSize / 2.0;\r\n const centre = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);\r\n const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), new Vector3(0, 0, 0));\r\n const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centre);\r\n invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, invWorldScaleMatrix);\r\n this._voxelTracingPass.setWorldScaleMatrix(invWorldScaleMatrix);\r\n this._voxelRenderer.setWorldScaleMatrix(invWorldScaleMatrix);\r\n // Set world scale for spatial blur.\r\n this._spatialBlurPass.setWorldScale(halfSize * 2.0);\r\n this._updateSSShadowParams();\r\n }\r\n\r\n /**\r\n * Update the SS shadow max distance and thickness based on the voxel grid size and resolution.\r\n * The max distance should be just a little larger than the world size of a single voxel.\r\n */\r\n private _updateSSShadowParams(): void {\r\n this._voxelTracingPass.sssMaxDist = (this._sssMaxDistScale * this.voxelGridSize) / (1 << this.resolutionExp);\r\n this._voxelTracingPass.sssThickness = this._sssThicknessScale * 0.005 * this.voxelGridSize;\r\n }\r\n\r\n /**\r\n * Apply the shadows to a material or array of materials.\r\n * @param material Material that will be affected by the shadows. If not provided, all materials of the scene will be affected.\r\n */\r\n public addShadowReceivingMaterial(material?: Material | Material[]) {\r\n if (material) {\r\n if (Array.isArray(material)) {\r\n material.forEach((m) => {\r\n this._addShadowSupportToMaterial(m);\r\n });\r\n } else {\r\n this._addShadowSupportToMaterial(material);\r\n }\r\n } else {\r\n this.scene.materials.forEach((mat) => {\r\n this._addShadowSupportToMaterial(mat);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Remove a material from receiving shadows\r\n * @param material The material that will no longer receive shadows\r\n */\r\n public removeShadowReceivingMaterial(material: Material | Material[]) {\r\n if (Array.isArray(material)) {\r\n material.forEach((m) => {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(m);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = m.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n });\r\n } else {\r\n const matIndex = this._materialsWithRenderPlugin.indexOf(material);\r\n if (matIndex !== -1) {\r\n this._materialsWithRenderPlugin.splice(matIndex, 1);\r\n const plugin = material.pluginManager!.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n }\r\n\r\n protected _addShadowSupportToMaterial(material: Material) {\r\n if (!(material instanceof PBRBaseMaterial) && !(material instanceof StandardMaterial)) {\r\n return;\r\n }\r\n let plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n plugin = new IBLShadowsPluginMaterial(material);\r\n }\r\n if (this._materialsWithRenderPlugin.indexOf(material) !== -1) {\r\n return;\r\n }\r\n\r\n if (this._enabled) {\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n\r\n plugin.isEnabled = this._enabled;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name)!;\r\n plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture()!;\r\n plugin.shadowOpacity = this.shadowOpacity;\r\n }\r\n });\r\n }\r\n\r\n private _updateBeforeRender() {\r\n this._updateDebugPasses();\r\n }\r\n\r\n private _listenForCameraChanges() {\r\n // We want to listen for camera changes and change settings while the camera is moving.\r\n this.scene.activeCamera?.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationPass.isMoving = true;\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the IBL shadow pipeline is ready to render shadows\r\n * @returns true if the IBL shadow pipeline is ready to render the shadows\r\n */\r\n public isReady() {\r\n return (\r\n this._noiseTexture.isReady() &&\r\n this._voxelRenderer.isReady() &&\r\n this._importanceSamplingRenderer.isReady() &&\r\n (!this._voxelTracingPass || this._voxelTracingPass.isReady()) &&\r\n (!this._spatialBlurPass || this._spatialBlurPass.isReady()) &&\r\n (!this._accumulationPass || this._accumulationPass.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"IBLShadowsRenderPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"IBLShadowsRenderPipeline\";\r\n }\r\n\r\n /**\r\n * Disposes the IBL shadow pipeline and associated resources\r\n */\r\n public override dispose() {\r\n const materials = this._materialsWithRenderPlugin.splice(0);\r\n materials.forEach((mat) => {\r\n this.removeShadowReceivingMaterial(mat);\r\n });\r\n this._disposeEffectPasses();\r\n this._noiseTexture.dispose();\r\n this._voxelRenderer.dispose();\r\n this._importanceSamplingRenderer.dispose();\r\n this._voxelTracingPass.dispose();\r\n this._spatialBlurPass.dispose();\r\n this._accumulationPass.dispose();\r\n this._dummyTexture2d.dispose();\r\n this._dummyTexture3d.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
@@ -7,11 +7,12 @@ precision mediump float;
7
7
  varying vec2 vUV;uniform vec4 accumulationParameters;
8
8
  #define remanence accumulationParameters.x
9
9
  #define resetb accumulationParameters.y
10
+ #define sceneSize accumulationParameters.z
10
11
  uniform sampler2D motionSampler;uniform sampler2D positionSampler;uniform sampler2D spatialBlurSampler;uniform sampler2D oldAccumulationSampler;uniform sampler2D prevPositionSampler;vec2 max2(vec2 v,vec2 w) { return vec2(max(v.x,w.x),max(v.y,w.y)); }
11
12
  void main(void) {bool reset=bool(resetb);vec2 gbufferRes=vec2(textureSize(motionSampler,0));ivec2 gbufferPixelCoord=ivec2(vUV*gbufferRes);vec2 shadowRes=vec2(textureSize(spatialBlurSampler,0));ivec2 shadowPixelCoord=ivec2(vUV*shadowRes);vec4 LP=texelFetch(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {gl_FragColor=vec4(1.0,0.0,0.0,1.0);return;}
12
13
  vec2 velocityColor=texelFetch(motionSampler,gbufferPixelCoord,0).xy;vec2 prevCoord=vUV+velocityColor;vec3 PrevLP=texture(prevPositionSampler,prevCoord).xyz;vec3 PrevShadows=texture(oldAccumulationSampler,prevCoord).xyz;vec2 newShadows=texelFetch(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z =
13
14
  !reset && all(lessThan(abs(prevCoord-vec2(0.5)),vec2(0.5))) &&
14
- distance(LP.xyz,PrevLP)<5e-2
15
+ distance(LP.xyz,PrevLP)<5e-2*sceneSize
15
16
  ? max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence)
16
17
  : 1.0;PrevShadows=max(vec3(0.0),PrevShadows);gl_FragColor =
17
18
  vec4(mix(PrevShadows.x,newShadows.x,PrevShadows.z),
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowAccumulation.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/iblShadowAccumulation.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAChD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;mEAcoD,CAAC;AACpE,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"iblShadowAccumulationPixelShader\";\nconst shader = `#ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec2 vUV;uniform vec4 accumulationParameters;\n#define remanence accumulationParameters.x\n#define resetb accumulationParameters.y\nuniform sampler2D motionSampler;uniform sampler2D positionSampler;uniform sampler2D spatialBlurSampler;uniform sampler2D oldAccumulationSampler;uniform sampler2D prevPositionSampler;vec2 max2(vec2 v,vec2 w) { return vec2(max(v.x,w.x),max(v.y,w.y)); }\nvoid main(void) {bool reset=bool(resetb);vec2 gbufferRes=vec2(textureSize(motionSampler,0));ivec2 gbufferPixelCoord=ivec2(vUV*gbufferRes);vec2 shadowRes=vec2(textureSize(spatialBlurSampler,0));ivec2 shadowPixelCoord=ivec2(vUV*shadowRes);vec4 LP=texelFetch(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {gl_FragColor=vec4(1.0,0.0,0.0,1.0);return;}\nvec2 velocityColor=texelFetch(motionSampler,gbufferPixelCoord,0).xy;vec2 prevCoord=vUV+velocityColor;vec3 PrevLP=texture(prevPositionSampler,prevCoord).xyz;vec3 PrevShadows=texture(oldAccumulationSampler,prevCoord).xyz;vec2 newShadows=texelFetch(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z =\n!reset && all(lessThan(abs(prevCoord-vec2(0.5)),vec2(0.5))) &&\ndistance(LP.xyz,PrevLP)<5e-2\n? max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence)\n: 1.0;PrevShadows=max(vec3(0.0),PrevShadows);gl_FragColor =\nvec4(mix(PrevShadows.x,newShadows.x,PrevShadows.z),\nmix(PrevShadows.y,newShadows.y,PrevShadows.z),PrevShadows.z,1.0);}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const iblShadowAccumulationPixelShader = { name, shader };\n"]}
1
+ {"version":3,"file":"iblShadowAccumulation.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/iblShadowAccumulation.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAChD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;mEAeoD,CAAC;AACpE,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"iblShadowAccumulationPixelShader\";\nconst shader = `#ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec2 vUV;uniform vec4 accumulationParameters;\n#define remanence accumulationParameters.x\n#define resetb accumulationParameters.y\n#define sceneSize accumulationParameters.z\nuniform sampler2D motionSampler;uniform sampler2D positionSampler;uniform sampler2D spatialBlurSampler;uniform sampler2D oldAccumulationSampler;uniform sampler2D prevPositionSampler;vec2 max2(vec2 v,vec2 w) { return vec2(max(v.x,w.x),max(v.y,w.y)); }\nvoid main(void) {bool reset=bool(resetb);vec2 gbufferRes=vec2(textureSize(motionSampler,0));ivec2 gbufferPixelCoord=ivec2(vUV*gbufferRes);vec2 shadowRes=vec2(textureSize(spatialBlurSampler,0));ivec2 shadowPixelCoord=ivec2(vUV*shadowRes);vec4 LP=texelFetch(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {gl_FragColor=vec4(1.0,0.0,0.0,1.0);return;}\nvec2 velocityColor=texelFetch(motionSampler,gbufferPixelCoord,0).xy;vec2 prevCoord=vUV+velocityColor;vec3 PrevLP=texture(prevPositionSampler,prevCoord).xyz;vec3 PrevShadows=texture(oldAccumulationSampler,prevCoord).xyz;vec2 newShadows=texelFetch(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z =\n!reset && all(lessThan(abs(prevCoord-vec2(0.5)),vec2(0.5))) &&\ndistance(LP.xyz,PrevLP)<5e-2*sceneSize\n? max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence)\n: 1.0;PrevShadows=max(vec3(0.0),PrevShadows);gl_FragColor =\nvec4(mix(PrevShadows.x,newShadows.x,PrevShadows.z),\nmix(PrevShadows.y,newShadows.y,PrevShadows.z),PrevShadows.z,1.0);}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const iblShadowAccumulationPixelShader = { name, shader };\n"]}
@@ -4,13 +4,14 @@ const name = "iblShadowAccumulationPixelShader";
4
4
  const shader = `varying vUV: vec2f;uniform accumulationParameters: vec4f;
5
5
  #define remanence uniforms.accumulationParameters.x
6
6
  #define resetb uniforms.accumulationParameters.y
7
+ #define sceneSize uniforms.accumulationParameters.z
7
8
  var motionSampler: texture_2d<f32>;var positionSampler: texture_2d<f32>;var spatialBlurSampler : texture_2d<f32>;var oldAccumulationSamplerSampler: sampler;var oldAccumulationSampler: texture_2d<f32>;var prevPositionSamplerSampler: sampler;var prevPositionSampler: texture_2d<f32>;fn max2(v: vec2f,w: vec2f)->vec2f {
8
9
  return vec2f(max(v.x,w.x),max(v.y,w.y)); }
9
10
  fn lessThan(x: vec2f,y: vec2f)->vec2<bool> {return x<y;}
10
11
  @fragment
11
12
  fn main(input: FragmentInputs)->FragmentOutputs {var reset: bool= bool(resetb);var gbufferRes : vec2f=vec2f(textureDimensions(positionSampler,0));var gbufferPixelCoord: vec2i= vec2i(input.vUV*gbufferRes);var shadowRes : vec2f=vec2f(textureDimensions(spatialBlurSampler,0));var shadowPixelCoord: vec2i= vec2i(input.vUV*shadowRes);var LP: vec4f=textureLoad(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {fragmentOutputs.color=vec4f(1.0,0.0,0.0,1.0);return fragmentOutputs;}
12
13
  var velocityColor: vec2f=textureLoad(motionSampler,gbufferPixelCoord,0).xy;var prevCoord: vec2f=input.vUV+velocityColor;var PrevLP: vec3f=textureSampleLevel(prevPositionSampler,prevPositionSamplerSampler,prevCoord,0.0).xyz;var PrevShadows: vec3f=textureSampleLevel(oldAccumulationSampler,oldAccumulationSamplerSampler,prevCoord,0.0).xyz;var newShadows : vec2f=textureLoad(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z=select(1.0,max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence),!reset && all(lessThan(abs(prevCoord- vec2f(0.5)), vec2f(0.5))) &&
13
- distance(LP.xyz,PrevLP)<5e-2);PrevShadows=max( vec3f(0.0),PrevShadows);fragmentOutputs.color= vec4f(mix(PrevShadows.x,newShadows.x,PrevShadows.z),
14
+ distance(LP.xyz,PrevLP)<5e-2*sceneSize);PrevShadows=max( vec3f(0.0),PrevShadows);fragmentOutputs.color= vec4f(mix(PrevShadows.x,newShadows.x,PrevShadows.z),
14
15
  mix(PrevShadows.y,newShadows.y,PrevShadows.z),PrevShadows.z,1.0);}`;
15
16
  // Sideeffect
16
17
  ShaderStore.ShadersStoreWGSL[name] = shader;
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowAccumulation.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/iblShadowAccumulation.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAChD,MAAM,MAAM,GAAG;;;;;;;;;;mEAUoD,CAAC;AACpE,aAAa;AACb,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,gBAAgB;AAChB,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"iblShadowAccumulationPixelShader\";\nconst shader = `varying vUV: vec2f;uniform accumulationParameters: vec4f;\n#define remanence uniforms.accumulationParameters.x\n#define resetb uniforms.accumulationParameters.y\nvar motionSampler: texture_2d<f32>;var positionSampler: texture_2d<f32>;var spatialBlurSampler : texture_2d<f32>;var oldAccumulationSamplerSampler: sampler;var oldAccumulationSampler: texture_2d<f32>;var prevPositionSamplerSampler: sampler;var prevPositionSampler: texture_2d<f32>;fn max2(v: vec2f,w: vec2f)->vec2f { \nreturn vec2f(max(v.x,w.x),max(v.y,w.y)); }\nfn lessThan(x: vec2f,y: vec2f)->vec2<bool> {return x<y;}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {var reset: bool= bool(resetb);var gbufferRes : vec2f=vec2f(textureDimensions(positionSampler,0));var gbufferPixelCoord: vec2i= vec2i(input.vUV*gbufferRes);var shadowRes : vec2f=vec2f(textureDimensions(spatialBlurSampler,0));var shadowPixelCoord: vec2i= vec2i(input.vUV*shadowRes);var LP: vec4f=textureLoad(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {fragmentOutputs.color=vec4f(1.0,0.0,0.0,1.0);return fragmentOutputs;}\nvar velocityColor: vec2f=textureLoad(motionSampler,gbufferPixelCoord,0).xy;var prevCoord: vec2f=input.vUV+velocityColor;var PrevLP: vec3f=textureSampleLevel(prevPositionSampler,prevPositionSamplerSampler,prevCoord,0.0).xyz;var PrevShadows: vec3f=textureSampleLevel(oldAccumulationSampler,oldAccumulationSamplerSampler,prevCoord,0.0).xyz;var newShadows : vec2f=textureLoad(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z=select(1.0,max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence),!reset && all(lessThan(abs(prevCoord- vec2f(0.5)), vec2f(0.5))) &&\ndistance(LP.xyz,PrevLP)<5e-2);PrevShadows=max( vec3f(0.0),PrevShadows);fragmentOutputs.color= vec4f(mix(PrevShadows.x,newShadows.x,PrevShadows.z),\nmix(PrevShadows.y,newShadows.y,PrevShadows.z),PrevShadows.z,1.0);}`;\n// Sideeffect\nShaderStore.ShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const iblShadowAccumulationPixelShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"iblShadowAccumulation.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/iblShadowAccumulation.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAChD,MAAM,MAAM,GAAG;;;;;;;;;;;mEAWoD,CAAC;AACpE,aAAa;AACb,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,gBAAgB;AAChB,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"iblShadowAccumulationPixelShader\";\nconst shader = `varying vUV: vec2f;uniform accumulationParameters: vec4f;\n#define remanence uniforms.accumulationParameters.x\n#define resetb uniforms.accumulationParameters.y\n#define sceneSize uniforms.accumulationParameters.z\nvar motionSampler: texture_2d<f32>;var positionSampler: texture_2d<f32>;var spatialBlurSampler : texture_2d<f32>;var oldAccumulationSamplerSampler: sampler;var oldAccumulationSampler: texture_2d<f32>;var prevPositionSamplerSampler: sampler;var prevPositionSampler: texture_2d<f32>;fn max2(v: vec2f,w: vec2f)->vec2f { \nreturn vec2f(max(v.x,w.x),max(v.y,w.y)); }\nfn lessThan(x: vec2f,y: vec2f)->vec2<bool> {return x<y;}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {var reset: bool= bool(resetb);var gbufferRes : vec2f=vec2f(textureDimensions(positionSampler,0));var gbufferPixelCoord: vec2i= vec2i(input.vUV*gbufferRes);var shadowRes : vec2f=vec2f(textureDimensions(spatialBlurSampler,0));var shadowPixelCoord: vec2i= vec2i(input.vUV*shadowRes);var LP: vec4f=textureLoad(positionSampler,gbufferPixelCoord,0);if (0.0==LP.w) {fragmentOutputs.color=vec4f(1.0,0.0,0.0,1.0);return fragmentOutputs;}\nvar velocityColor: vec2f=textureLoad(motionSampler,gbufferPixelCoord,0).xy;var prevCoord: vec2f=input.vUV+velocityColor;var PrevLP: vec3f=textureSampleLevel(prevPositionSampler,prevPositionSamplerSampler,prevCoord,0.0).xyz;var PrevShadows: vec3f=textureSampleLevel(oldAccumulationSampler,oldAccumulationSamplerSampler,prevCoord,0.0).xyz;var newShadows : vec2f=textureLoad(spatialBlurSampler,shadowPixelCoord,0).xy;PrevShadows.z=select(1.0,max(PrevShadows.z/(1.0+PrevShadows.z),1.0-remanence),!reset && all(lessThan(abs(prevCoord- vec2f(0.5)), vec2f(0.5))) &&\ndistance(LP.xyz,PrevLP)<5e-2*sceneSize);PrevShadows=max( vec3f(0.0),PrevShadows);fragmentOutputs.color= vec4f(mix(PrevShadows.x,newShadows.x,PrevShadows.z),\nmix(PrevShadows.y,newShadows.y,PrevShadows.z),PrevShadows.z,1.0);}`;\n// Sideeffect\nShaderStore.ShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const iblShadowAccumulationPixelShaderWGSL = { name, shader };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/core",
3
- "version": "7.32.5",
3
+ "version": "7.33.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",