@babylonjs/core 7.23.0 → 7.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.d.ts +4 -0
- package/Animations/animatable.js +21 -13
- package/Animations/animatable.js.map +1 -1
- package/Audio/sound.js +2 -1
- package/Audio/sound.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +41 -0
- package/Collisions/gpuPicker.js +181 -71
- package/Collisions/gpuPicker.js.map +1 -1
- package/Culling/ray.d.ts +6 -2
- package/Culling/ray.js +8 -2
- package/Culling/ray.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +1 -1
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.d.ts +1 -1
- package/Engines/Extensions/engine.renderTarget.js +29 -36
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.d.ts +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +11 -6
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.d.ts +3 -3
- package/Engines/renderTargetWrapper.js +3 -3
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -1
- package/Engines/thinEngine.js +39 -9
- package/Engines/thinEngine.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +20 -9
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +6 -1
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +6 -1
- package/Layers/highlightLayer.js.map +1 -1
- package/Loading/sceneLoader.d.ts +22 -27
- package/Loading/sceneLoader.js +102 -74
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +4 -0
- package/Materials/Node/nodeMaterial.js +9 -2
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -2
- package/Materials/Node/nodeMaterialBuildStateSharedData.js +12 -5
- package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
- package/Materials/uniformBuffer.d.ts +6 -0
- package/Materials/uniformBuffer.js +8 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +9 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +20 -3
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.d.ts +2 -1
- package/Meshes/meshUVSpaceRenderer.js +16 -3
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Physics/physicsRaycastResult.d.ts +2 -0
- package/Physics/physicsRaycastResult.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +1 -1
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +8 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +2 -3
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +29 -20
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -2
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderer.d.ts +7 -9
- package/Rendering/fluidRenderer/fluidRenderer.js +16 -13
- package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +9 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +29 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +3 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +12 -2
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +3 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +3 -2
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +9 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +22 -5
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.d.ts +8 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.js +42 -5
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/fluidRenderer/index.d.ts +18 -0
- package/Rendering/fluidRenderer/index.js +18 -0
- package/Rendering/fluidRenderer/index.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +12 -10
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +13 -11
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.js +13 -0
- package/ShadersWGSL/fluidRenderingBilateralBlur.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.js +29 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +22 -0
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.js +12 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +14 -0
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.js +12 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +14 -0
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.js +101 -0
- package/ShadersWGSL/fluidRenderingRender.fragment.js.map +1 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.d.ts +5 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.js +13 -0
- package/ShadersWGSL/fluidRenderingStandardBlur.fragment.js.map +1 -0
- package/Sprites/spriteRenderer.d.ts +1 -0
- package/Sprites/spriteRenderer.js +7 -2
- package/Sprites/spriteRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +11 -11
- package/scene.js +5 -5
- package/scene.js.map +1 -1
|
@@ -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 type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport { 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 type { PrePassEffectConfiguration } from \"../prePassEffectConfiguration\";\r\nimport { PrePassRenderer } from \"../prePassRenderer\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport \"../../Shaders/postprocess.vertex\";\r\nimport \"../../Shaders/iblShadowGBufferDebug.fragment\";\r\nimport \"../../Shaders/iblShadowsCombine.fragment\";\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 { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport { FreeCamera } from \"../../Cameras/freeCamera\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport type { Camera } from \"core/Cameras/camera\";\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 * 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 ssShadowMaxDist: 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 ssShadowThickness: number;\r\n}\r\n\r\nclass IblShadowsPrepassConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * Is this effect enabled\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = \"iblShadows\";\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [\r\n Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE,\r\n // Constants.PREPASS_NORMAL_TEXTURE_TYPE, // TODO - don't need this for IBL shadows\r\n Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE,\r\n // Local positions used for shadow accumulation pass\r\n Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n Constants.PREPASS_LOCAL_POSITION_TEXTURE_TYPE,\r\n ];\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 _voxelizationDirty: boolean = true;\r\n private _boundsNeedUpdate: boolean = true;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: PostProcess[] = [];\r\n\r\n private _shadowCompositePP: PostProcess;\r\n private _prePassEffectConfiguration: IblShadowsPrepassConfiguration;\r\n\r\n private _excludedMeshes: number[] = [];\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 private _shadowOpacity: number = 1.0;\r\n private _enabled: boolean = true;\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 /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\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 /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\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 /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\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 /**\r\n * The number of samples used in the screen space shadow pass.\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 /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\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 /**\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 public get ssShadowMaxDist(): number {\r\n return this._voxelTracingPass?.sssMaxDist;\r\n }\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 public set ssShadowMaxDist(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public get ssShadowThickness(): number {\r\n return this._voxelTracingPass?.sssThickness;\r\n }\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public set ssShadowThickness(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssThickness = value;\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 */\r\n public getVoxelGridTexture(): Texture {\r\n return this._voxelRenderer?.getVoxelGrid();\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 */\r\n public getIcdfyTexture(): Texture {\r\n return this._importanceSamplingRenderer!.getIcdfyTexture();\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 */\r\n public getIcdfxTexture(): Texture {\r\n return this._importanceSamplingRenderer!.getIcdfxTexture();\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 in the exclusion list to prevent it to be handled by the IBL shadow pipeline\r\n * @param mesh The mesh to exclude from the IBL shadow pipeline\r\n */\r\n public addExcludedMesh(mesh: AbstractMesh): void {\r\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n this._excludedMeshes.push(mesh.uniqueId);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list of the IBL shadow pipeline\r\n * @param mesh The mesh to remove\r\n */\r\n public removeExcludedMesh(mesh: AbstractMesh): void {\r\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\r\n if (index !== -1) {\r\n this._excludedMeshes.splice(index, 1);\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.updateVoxelization();\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 }\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 this._createDebugPasses();\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 // We need a depth texture for opaque\r\n if (!scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"IBL Shadows Render Pipeline could not enable PrePass, aborting.\");\r\n return;\r\n }\r\n this.shadowOpacity = options.shadowOpacity || 1.0;\r\n this._prePassEffectConfiguration = new IblShadowsPrepassConfiguration();\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.sampleDirections = options.sampleDirections || 2;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowMaxDist = options.ssShadowMaxDist || 0.05;\r\n this.ssShadowSamples = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThickness = options.ssShadowThickness || 0.01;\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene);\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 // Create post process that applies the shadows to the scene\r\n this._createShadowCombinePostProcess();\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._createEffectPasses(cameras);\r\n\r\n this.scene.onNewMeshAddedObservable.add(this.updateSceneBounds.bind(this));\r\n this.scene.onMeshRemovedObservable.add(this.updateSceneBounds.bind(this));\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 // Only turn on the pipeline if the importance sampling RT's are ready\r\n this._importanceSamplingRenderer.onReadyObservable.add(() => {\r\n if (this._voxelRenderer.isReady()) {\r\n this.toggleShadow(this._enabled);\r\n } else {\r\n this._voxelRenderer.onReadyObservable.addOnce(() => {\r\n this.toggleShadow(this._enabled);\r\n });\r\n }\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 if (enabled) {\r\n this._enableEffect(\"IBLShadowVoxelTracingPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowSpatialBlurPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowAccumulationBlurPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowCompositePass\", this.cameras);\r\n } else {\r\n this._disableEffect(\"IBLShadowVoxelTracingPass\", null);\r\n this._disableEffect(\"IBLShadowSpatialBlurPass\", null);\r\n this._disableEffect(\"IBLShadowAccumulationBlurPass\", null);\r\n this._disableEffect(\"IBLShadowCompositePass\", null);\r\n }\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._accumulationPass?.resize();\r\n }\r\n\r\n private _createShadowCombinePostProcess() {\r\n const compositeOptions: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n uniforms: [\"shadowOpacity\"],\r\n samplers: [\"sceneTexture\"],\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n reusable: false,\r\n };\r\n this._shadowCompositePP = new PostProcess(\"iblShadowsCombine\", \"iblShadowsCombine\", compositeOptions);\r\n this._shadowCompositePP.autoClear = false;\r\n this._shadowCompositePP.onApplyObservable.add((effect) => {\r\n // Setting the input of the tracing pass because this is the scene RT that we want to apply the shadows to.\r\n effect.setTextureFromPostProcess(\"sceneTexture\", this._voxelTracingPass.getPassPP());\r\n effect.setFloat(\"shadowOpacity\", this._shadowOpacity);\r\n if (\r\n this._importanceSamplingRenderer?.isReady() &&\r\n this._voxelRenderer?.isReady() &&\r\n this._voxelTracingPass?.isReady() &&\r\n this._spatialBlurPass?.isReady() &&\r\n this._accumulationPass?.isReady()\r\n ) {\r\n this.update();\r\n }\r\n });\r\n this._shadowCompositePP._prePassEffectConfiguration = this._prePassEffectConfiguration;\r\n setTimeout(() => {\r\n this._voxelizationDirty = true;\r\n }, 500);\r\n }\r\n\r\n private _createEffectPasses(cameras: Camera[] | undefined) {\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowVoxelTracingPass\",\r\n () => {\r\n return this._voxelTracingPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowSpatialBlurPass\",\r\n () => {\r\n return this._spatialBlurPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowAccumulationBlurPass\",\r\n () => {\r\n return this._accumulationPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowCompositePass\",\r\n () => {\r\n return this._shadowCompositePP;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (cameras) {\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n }\r\n\r\n this.toggleShadow(false);\r\n this._enabled = true;\r\n\r\n if (this.allowDebugPasses) {\r\n this._createDebugPasses();\r\n }\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const textureNames: string[] = this._prePassEffectConfiguration.texturesRequired.map((type) => PrePassRenderer.TextureFormats[type].name.toString());\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 };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n this._prePassEffectConfiguration.texturesRequired.forEach((type) => {\r\n const prePassRenderer = this.scene.prePassRenderer;\r\n if (!prePassRenderer) {\r\n Logger.Error(\"Can't enable G-Buffer debug rendering since prepassRenderer doesn't exist.\");\r\n return;\r\n }\r\n const index = prePassRenderer.getIndex(type);\r\n if (index >= 0) effect.setTexture(PrePassRenderer.TextureFormats[type].name, prePassRenderer.getRenderTarget().textures[index]);\r\n });\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 this._importanceSamplingRenderer?.getDebugPassPP(),\r\n this._voxelRenderer?.getDebugPassPP(),\r\n this._voxelTracingPass?.getDebugPassPP(),\r\n this._spatialBlurPass?.getDebugPassPP(),\r\n this._accumulationPass?.getDebugPassPP(),\r\n this._getGBufferDebugPass(),\r\n ];\r\n for (let i = 0; i < this._debugPasses.length; i++) {\r\n if (!this._debugPasses[i]) continue;\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n this._debugPasses[i].name,\r\n () => {\r\n return this._debugPasses[i];\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]) continue;\r\n this._disableEffect(this._debugPasses[i].name, this.cameras);\r\n }\r\n }\r\n\r\n private _disposeEffectPasses() {\r\n this.scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this.name, this.cameras);\r\n this._disableEffect(\"IBLShadowVoxelTracingPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowSpatialBlurPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowAccumulationBlurPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowCompositePass\", 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].name, this.cameras);\r\n this._debugPasses[i].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 const prePassRenderer = this.scene!.prePassRenderer;\r\n if (!prePassRenderer) {\r\n Logger.Error(\"Can't enable G-Buffer debug rendering since prepassRenderer doesn't exist.\");\r\n return;\r\n }\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 this._voxelizationDirty = true;\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 this._voxelizationDirty = true;\r\n this._boundsNeedUpdate = true;\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 if (this.scene.activeCamera instanceof ArcRotateCamera) {\r\n this.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n let isMoving: boolean = false;\r\n if (camera instanceof ArcRotateCamera) {\r\n isMoving =\r\n camera.inertialAlphaOffset !== 0 ||\r\n camera.inertialBetaOffset !== 0 ||\r\n camera.inertialRadiusOffset !== 0 ||\r\n camera.inertialPanningX !== 0 ||\r\n camera.inertialPanningY !== 0;\r\n } else if (camera instanceof FreeCamera) {\r\n isMoving =\r\n camera.cameraDirection.x !== 0 ||\r\n camera.cameraDirection.y !== 0 ||\r\n camera.cameraDirection.z !== 0 ||\r\n camera.cameraRotation.x !== 0 ||\r\n camera.cameraRotation.y !== 0;\r\n }\r\n if (this._accumulationPass) {\r\n if (isMoving) {\r\n // this._accumulationPass.reset = true;\r\n // this._accumulationPass.remenance = 1.0;\r\n } else {\r\n // this._accumulationPass.reset = false;\r\n // this._accumulationPass.remenance = 0.9;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Links to the prepass renderer\r\n * @param prePassRenderer The scene PrePassRenderer\r\n * @returns true if the pre pass is setup\r\n */\r\n public override setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n return !!prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\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 * Renders accumulated shadows for IBL\r\n */\r\n public update() {\r\n // This is called for every MRT in the customRenderTargets structure during voxelization. That doesn't make\r\n // sense. We only want this to run after voxelization so we should put in some state logic here to return\r\n // if voxelization is happening.\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n return;\r\n }\r\n\r\n if (this._boundsNeedUpdate) {\r\n const bounds = this.scene.getWorldExtends((mesh) => {\r\n return mesh instanceof Mesh && this._excludedMeshes.indexOf(mesh.uniqueId) === -1;\r\n });\r\n const size = bounds.max.subtract(bounds.min);\r\n const halfSize = Math.max(size.x, Math.max(size.y, size.z)) * 0.5;\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._boundsNeedUpdate = false;\r\n Logger.Log(\"IBL Shadows: Scene size: \" + size);\r\n Logger.Log(\"Half size: \" + halfSize);\r\n Logger.Log(\"Centre translation: \" + centre);\r\n }\r\n\r\n // If update is needed, render voxels\r\n if (this._voxelizationDirty) {\r\n this._voxelRenderer.updateVoxelGrid(this._excludedMeshes);\r\n this._voxelizationDirty = false;\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 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 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 type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Matrix, Vector3, Vector4, Quaternion } from \"../../Maths/math.vector\";\r\nimport { 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 type { PrePassEffectConfiguration } from \"../prePassEffectConfiguration\";\r\nimport { PrePassRenderer } from \"../prePassRenderer\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { _IblShadowsVoxelRenderer } from \"./iblShadowsVoxelRenderer\";\r\nimport { _IblShadowsVoxelTracingPass } from \"./iblShadowsVoxelTracingPass\";\r\n\r\nimport \"../../Shaders/postprocess.vertex\";\r\nimport \"../../Shaders/iblShadowGBufferDebug.fragment\";\r\nimport \"../../Shaders/iblShadowsCombine.fragment\";\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 { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport { FreeCamera } from \"../../Cameras/freeCamera\";\r\nimport { PostProcessRenderPipeline } from \"../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"core/PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport type { Camera } from \"core/Cameras/camera\";\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 * 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 ssShadowMaxDist: 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 ssShadowThickness: number;\r\n}\r\n\r\nclass IblShadowsPrepassConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * Is this effect enabled\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = \"iblShadows\";\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [\r\n Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE,\r\n // Constants.PREPASS_NORMAL_TEXTURE_TYPE, // TODO - don't need this for IBL shadows\r\n Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE,\r\n // Local positions used for shadow accumulation pass\r\n Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n Constants.PREPASS_LOCAL_POSITION_TEXTURE_TYPE,\r\n ];\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 _voxelizationDirty: boolean = true;\r\n private _boundsNeedUpdate: boolean = true;\r\n\r\n private _allowDebugPasses: boolean = false;\r\n private _debugPasses: { pass: PostProcess; enabled: boolean }[] = [];\r\n\r\n private _shadowCompositePP: PostProcess;\r\n private _prePassEffectConfiguration: IblShadowsPrepassConfiguration;\r\n\r\n private _excludedMeshes: number[] = [];\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 private _shadowOpacity: number = 1.0;\r\n private _enabled: boolean = true;\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 /**\r\n * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.\r\n */\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = value;\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 /**\r\n * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.\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 /**\r\n * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.\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 /**\r\n * The number of samples used in the screen space shadow pass.\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 /**\r\n * The stride of the screen-space shadow pass. This controls the distance between samples.\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 /**\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 public get ssShadowMaxDist(): number {\r\n return this._voxelTracingPass?.sssMaxDist;\r\n }\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 public set ssShadowMaxDist(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public get ssShadowThickness(): number {\r\n return this._voxelTracingPass?.sssThickness;\r\n }\r\n\r\n /**\r\n * Screen-space shadow thickness. This value controls the perceived thickness of the SS shadows.\r\n */\r\n public set ssShadowThickness(value: number) {\r\n if (!this._voxelTracingPass) return;\r\n this._voxelTracingPass.sssThickness = value;\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 */\r\n public getVoxelGridTexture(): Texture {\r\n return this._voxelRenderer?.getVoxelGrid();\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 */\r\n public getIcdfyTexture(): Texture {\r\n return this._importanceSamplingRenderer!.getIcdfyTexture();\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 */\r\n public getIcdfxTexture(): Texture {\r\n return this._importanceSamplingRenderer!.getIcdfxTexture();\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 in the exclusion list to prevent it to be handled by the IBL shadow pipeline\r\n * @param mesh The mesh to exclude from the IBL shadow pipeline\r\n */\r\n public addExcludedMesh(mesh: AbstractMesh): void {\r\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n this._excludedMeshes.push(mesh.uniqueId);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list of the IBL shadow pipeline\r\n * @param mesh The mesh to remove\r\n */\r\n public removeExcludedMesh(mesh: AbstractMesh): void {\r\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\r\n if (index !== -1) {\r\n this._excludedMeshes.splice(index, 1);\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.updateVoxelization();\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 }\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 // We need a depth texture for opaque\r\n if (!scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"IBL Shadows Render Pipeline could not enable PrePass, aborting.\");\r\n return;\r\n }\r\n this.shadowOpacity = options.shadowOpacity || 1.0;\r\n this._prePassEffectConfiguration = new IblShadowsPrepassConfiguration();\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.sampleDirections = options.sampleDirections || 2;\r\n this.ssShadowOpacity = options.ssShadowsEnabled === undefined || options.ssShadowsEnabled ? 1.0 : 0.0;\r\n this.ssShadowMaxDist = options.ssShadowMaxDist || 0.05;\r\n this.ssShadowSamples = options.ssShadowSampleCount || 16;\r\n this.ssShadowStride = options.ssShadowStride || 8;\r\n this.ssShadowThickness = options.ssShadowThickness || 0.01;\r\n this._spatialBlurPass = new _IblShadowsSpatialBlurPass(this.scene);\r\n this._accumulationPass = new _IblShadowsAccumulationPass(this.scene);\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 // Create post process that applies the shadows to the scene\r\n this._createShadowCombinePostProcess();\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._createEffectPasses(cameras);\r\n\r\n this.scene.onNewMeshAddedObservable.add(this.updateSceneBounds.bind(this));\r\n this.scene.onMeshRemovedObservable.add(this.updateSceneBounds.bind(this));\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 // Only turn on the pipeline if the importance sampling RT's are ready\r\n this._importanceSamplingRenderer.onReadyObservable.add(() => {\r\n if (this._voxelRenderer.isReady()) {\r\n this.toggleShadow(this._enabled);\r\n } else {\r\n this._voxelRenderer.onReadyObservable.addOnce(() => {\r\n this.toggleShadow(this._enabled);\r\n });\r\n }\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 if (enabled) {\r\n this._enableEffect(\"IBLShadowVoxelTracingPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowSpatialBlurPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowAccumulationBlurPass\", this.cameras);\r\n this._enableEffect(\"IBLShadowCompositePass\", this.cameras);\r\n } else {\r\n this._disableEffect(\"IBLShadowVoxelTracingPass\", null);\r\n this._disableEffect(\"IBLShadowSpatialBlurPass\", null);\r\n this._disableEffect(\"IBLShadowAccumulationBlurPass\", null);\r\n this._disableEffect(\"IBLShadowCompositePass\", null);\r\n }\r\n }\r\n\r\n private _handleResize() {\r\n this._voxelRenderer.resize();\r\n this._accumulationPass?.resize();\r\n }\r\n\r\n private _createShadowCombinePostProcess() {\r\n const compositeOptions: PostProcessOptions = {\r\n width: this.scene.getEngine().getRenderWidth(),\r\n height: this.scene.getEngine().getRenderHeight(),\r\n uniforms: [\"shadowOpacity\"],\r\n samplers: [\"sceneTexture\"],\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this.scene.getEngine(),\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n reusable: false,\r\n };\r\n this._shadowCompositePP = new PostProcess(\"iblShadowsCombine\", \"iblShadowsCombine\", compositeOptions);\r\n this._shadowCompositePP.autoClear = false;\r\n this._shadowCompositePP.onApplyObservable.add((effect) => {\r\n // Setting the input of the tracing pass because this is the scene RT that we want to apply the shadows to.\r\n effect.setTextureFromPostProcess(\"sceneTexture\", this._voxelTracingPass.getPassPP());\r\n effect.setFloat(\"shadowOpacity\", this._shadowOpacity);\r\n if (\r\n this._importanceSamplingRenderer?.isReady() &&\r\n this._voxelRenderer?.isReady() &&\r\n this._voxelTracingPass?.isReady() &&\r\n this._spatialBlurPass?.isReady() &&\r\n this._accumulationPass?.isReady()\r\n ) {\r\n this.update();\r\n }\r\n });\r\n this._shadowCompositePP._prePassEffectConfiguration = this._prePassEffectConfiguration;\r\n setTimeout(() => {\r\n this._voxelizationDirty = true;\r\n }, 500);\r\n }\r\n\r\n private _createEffectPasses(cameras: Camera[] | undefined) {\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowVoxelTracingPass\",\r\n () => {\r\n return this._voxelTracingPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowSpatialBlurPass\",\r\n () => {\r\n return this._spatialBlurPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowAccumulationBlurPass\",\r\n () => {\r\n return this._accumulationPass.getPassPP();\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n this.scene.getEngine(),\r\n \"IBLShadowCompositePass\",\r\n () => {\r\n return this._shadowCompositePP;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (cameras) {\r\n this.scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this.name, cameras);\r\n }\r\n\r\n this.toggleShadow(false);\r\n this._enabled = true;\r\n }\r\n\r\n private _getGBufferDebugPass(): PostProcess {\r\n if (this._gbufferDebugPass) {\r\n return this._gbufferDebugPass;\r\n }\r\n const textureNames: string[] = this._prePassEffectConfiguration.texturesRequired.map((type) => PrePassRenderer.TextureFormats[type].name.toString());\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 };\r\n this._gbufferDebugPass = new PostProcess(\"iblShadowGBufferDebug\", \"iblShadowGBufferDebug\", options);\r\n this._gbufferDebugPass.autoClear = false;\r\n this._gbufferDebugPass.onApplyObservable.add((effect) => {\r\n this._prePassEffectConfiguration.texturesRequired.forEach((type) => {\r\n const prePassRenderer = this.scene.prePassRenderer;\r\n if (!prePassRenderer) {\r\n Logger.Error(\"Can't enable G-Buffer debug rendering since prepassRenderer doesn't exist.\");\r\n return;\r\n }\r\n const index = prePassRenderer.getIndex(type);\r\n if (index >= 0) effect.setTexture(PrePassRenderer.TextureFormats[type].name, prePassRenderer.getRenderTarget().textures[index]);\r\n });\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._disableEffect(\"IBLShadowVoxelTracingPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowSpatialBlurPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowAccumulationBlurPass\", this.cameras);\r\n this._disableEffect(\"IBLShadowCompositePass\", 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 const prePassRenderer = this.scene!.prePassRenderer;\r\n if (!prePassRenderer) {\r\n Logger.Error(\"Can't enable G-Buffer debug rendering since prepassRenderer doesn't exist.\");\r\n return;\r\n }\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 this._voxelizationDirty = true;\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 this._voxelizationDirty = true;\r\n this._boundsNeedUpdate = true;\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 if (this.scene.activeCamera instanceof ArcRotateCamera) {\r\n this.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n let isMoving: boolean = false;\r\n if (camera instanceof ArcRotateCamera) {\r\n isMoving =\r\n camera.inertialAlphaOffset !== 0 ||\r\n camera.inertialBetaOffset !== 0 ||\r\n camera.inertialRadiusOffset !== 0 ||\r\n camera.inertialPanningX !== 0 ||\r\n camera.inertialPanningY !== 0;\r\n } else if (camera instanceof FreeCamera) {\r\n isMoving =\r\n camera.cameraDirection.x !== 0 ||\r\n camera.cameraDirection.y !== 0 ||\r\n camera.cameraDirection.z !== 0 ||\r\n camera.cameraRotation.x !== 0 ||\r\n camera.cameraRotation.y !== 0;\r\n }\r\n if (this._accumulationPass) {\r\n if (isMoving) {\r\n // this._accumulationPass.reset = true;\r\n // this._accumulationPass.remenance = 1.0;\r\n } else {\r\n // this._accumulationPass.reset = false;\r\n // this._accumulationPass.remenance = 0.9;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Links to the prepass renderer\r\n * @param prePassRenderer The scene PrePassRenderer\r\n * @returns true if the pre pass is setup\r\n */\r\n public override setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n return !!prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\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 * Renders accumulated shadows for IBL\r\n */\r\n public update() {\r\n // This is called for every MRT in the customRenderTargets structure during voxelization. That doesn't make\r\n // sense. We only want this to run after voxelization so we should put in some state logic here to return\r\n // if voxelization is happening.\r\n if (this._voxelRenderer.isVoxelizationInProgress()) {\r\n return;\r\n }\r\n\r\n if (this._boundsNeedUpdate) {\r\n const bounds = this.scene.getWorldExtends((mesh) => {\r\n return mesh instanceof Mesh && this._excludedMeshes.indexOf(mesh.uniqueId) === -1;\r\n });\r\n const size = bounds.max.subtract(bounds.min);\r\n const halfSize = Math.max(size.x, Math.max(size.y, size.z)) * 0.5;\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._boundsNeedUpdate = false;\r\n // Logger.Log(\"IBL Shadows: Scene size: \" + size);\r\n // Logger.Log(\"Half size: \" + halfSize);\r\n // Logger.Log(\"Centre translation: \" + centre);\r\n }\r\n\r\n // If update is needed, render voxels\r\n if (this._voxelizationDirty) {\r\n this._voxelRenderer.updateVoxelGrid(this._excludedMeshes);\r\n this._voxelizationDirty = false;\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 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 super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -190,7 +190,7 @@ export class _IblShadowsVoxelTracingPass {
|
|
|
190
190
|
this.debugEnabled = false;
|
|
191
191
|
this._debugPassName = "Voxel Tracing Debug Pass";
|
|
192
192
|
/** The default rotation of the environment map will align the shadows with the default lighting orientation */
|
|
193
|
-
this._envRotation =
|
|
193
|
+
this._envRotation = 0.0;
|
|
194
194
|
this._downscale = 1.0;
|
|
195
195
|
this._debugVoxelMarchEnabled = false;
|
|
196
196
|
this._debugSizeParams = new Vector4(0.0, 0.0, 0.0, 0.0);
|
|
@@ -232,7 +232,8 @@ export class _IblShadowsVoxelTracingPass {
|
|
|
232
232
|
effect.setMatrix("wsNormalizationMtx", this._invWorldScaleMatrix);
|
|
233
233
|
this._frameId++;
|
|
234
234
|
const downscaleSquared = this._downscale * this._downscale;
|
|
235
|
-
|
|
235
|
+
let rotation = this._scene.useRightHandedSystem ? -this._envRotation - 0.5 * Math.PI : -this._envRotation - Math.PI;
|
|
236
|
+
rotation = rotation % (2.0 * Math.PI);
|
|
236
237
|
effect.setVector4("shadowParameters", new Vector4(this._sampleDirections, this._frameId / downscaleSquared, this._downscale, rotation));
|
|
237
238
|
const offset = new Vector2(0.0, 0.0);
|
|
238
239
|
const voxelGrid = this._renderPipeline.getVoxelGridTexture();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsVoxelTracingPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelTracingPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector2, Vector4 } from \"../../Maths/math.vector\";\r\nimport \"../../Shaders/iblShadowVoxelTracing.fragment\";\r\nimport \"../../Shaders/iblShadowDebug.fragment\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\n\r\n/**\r\n * Build cdf maps for IBL importance sampling during IBL shadow computation.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsVoxelTracingPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _voxelShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public get voxelShadowOpacity(): number {\r\n return this._voxelShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public set voxelShadowOpacity(value: number) {\r\n this._voxelShadowOpacity = value;\r\n }\r\n private _sssSamples: number = 16;\r\n private _sssStride: number = 8;\r\n private _sssMaxDist: number = 0.05;\r\n private _sssThickness: number = 0.01;\r\n\r\n private _ssShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._ssShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public set ssShadowOpacity(value: number) {\r\n this._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 sssSamples(): number {\r\n return this._sssSamples;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public set sssSamples(value: number) {\r\n this._sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public get sssStride(): number {\r\n return this._sssStride;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public set sssStride(value: number) {\r\n this._sssStride = value;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public get sssMaxDist(): number {\r\n return this._sssMaxDist;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public set sssMaxDist(value: number) {\r\n this._sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public get sssThickness(): number {\r\n return this._sssThickness;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public set sssThickness(value: number) {\r\n this._sssThickness = value;\r\n }\r\n\r\n private _outputPP: PostProcess;\r\n private _cameraInvView: Matrix = Matrix.Identity();\r\n private _cameraInvProj: Matrix = Matrix.Identity();\r\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\r\n private _frameId: number = 0;\r\n private _sampleDirections: number = 4;\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public get sampleDirections(): number {\r\n return this._sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public set sampleDirections(value: number) {\r\n this._sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public get envRotation(): number {\r\n return this._envRotation;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public set envRotation(value: number) {\r\n this._envRotation = value;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Gets the pass post process\r\n * @returns The post process\r\n */\r\n public getPassPP(): PostProcess {\r\n return this._outputPP;\r\n }\r\n\r\n /**\r\n * Gets the debug pass post process. This will create the resources for the pass\r\n * if they don't already exist.\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Voxel Tracing Debug Pass\";\r\n\r\n /**\r\n * The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /** The default rotation of the environment map will align the shadows with the default lighting orientation */\r\n private _envRotation: number = -Math.PI / 2.0;\r\n private _downscale: number = 1.0;\r\n\r\n /**\r\n * Set the matrix to use for scaling the world space to voxel space\r\n * @param matrix The matrix to use for scaling the world space to voxel space\r\n */\r\n public setWorldScaleMatrix(matrix: Matrix) {\r\n this._invWorldScaleMatrix = matrix;\r\n }\r\n\r\n private _debugVoxelMarchEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTextureFromPostProcessOutput(\"debugSampler\", this._outputPP);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the shadow voxel-tracing pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The shadow voxel-tracing pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n let defines = \"\";\r\n if (this._debugVoxelMarchEnabled) {\r\n defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n const ppOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"viewMtx\", \"projMtx\", \"invProjMtx\", \"invViewMtx\", \"wsNormalizationMtx\", \"shadowParameters\", \"offsetDataParameters\", \"sssParameters\", \"shadowOpacity\"],\r\n samplers: [\"voxelGridSampler\", \"icdfySampler\", \"icdfxSampler\", \"blueNoiseSampler\", \"worldNormalSampler\", \"linearDepthSampler\", \"depthSampler\", \"worldPositionSampler\"],\r\n defines: defines,\r\n engine: this._engine,\r\n reusable: false,\r\n };\r\n this._outputPP = new PostProcess(\"voxelTracingPass\", \"iblShadowVoxelTracing\", ppOptions);\r\n this._outputPP.autoClear = false;\r\n this._outputPP.onApplyObservable.add((effect) => {\r\n this._updatePostProcess(effect, this._scene.activeCamera!);\r\n });\r\n }\r\n\r\n private _updatePostProcess(effect: Effect, camera: Camera) {\r\n effect.setMatrix(\"viewMtx\", camera.getViewMatrix());\r\n effect.setMatrix(\"projMtx\", camera.getProjectionMatrix());\r\n camera.getProjectionMatrix().invertToRef(this._cameraInvProj);\r\n camera.getViewMatrix().invertToRef(this._cameraInvView);\r\n effect.setMatrix(\"invProjMtx\", this._cameraInvProj);\r\n effect.setMatrix(\"invViewMtx\", this._cameraInvView);\r\n effect.setMatrix(\"wsNormalizationMtx\", this._invWorldScaleMatrix);\r\n\r\n this._frameId++;\r\n\r\n const downscaleSquared = this._downscale * this._downscale;\r\n const rotation = this._scene.useRightHandedSystem ? this._envRotation : (this._envRotation + Math.PI) % (2.0 * Math.PI);\r\n effect.setVector4(\"shadowParameters\", new Vector4(this._sampleDirections, this._frameId / downscaleSquared, this._downscale, rotation));\r\n const offset = new Vector2(0.0, 0.0);\r\n const voxelGrid = this._renderPipeline!.getVoxelGridTexture();\r\n const highestMip = Math.floor(Math.log2(voxelGrid!.getSize().width));\r\n effect.setVector4(\"offsetDataParameters\", new Vector4(offset.x, offset.y, highestMip, 0.0));\r\n\r\n // SSS Options.\r\n const worldScale = (1.0 / this._invWorldScaleMatrix.m[0]) * 2.0;\r\n const maxDist = this._sssMaxDist * worldScale;\r\n const thickness = this._sssThickness * worldScale;\r\n effect.setVector4(\"sssParameters\", new Vector4(this._sssSamples, this._sssStride, maxDist, thickness));\r\n effect.setVector4(\"shadowOpacity\", new Vector4(this._voxelShadowOpacity, this._ssShadowOpacity, 0.0, 0.0));\r\n effect.setTexture(\"voxelGridSampler\", voxelGrid);\r\n effect.setTexture(\"blueNoiseSampler\", (this._renderPipeline as any)._noiseTexture);\r\n effect.setTexture(\"icdfySampler\", this._renderPipeline!.getIcdfyTexture());\r\n effect.setTexture(\"icdfxSampler\", this._renderPipeline!.getIcdfxTexture());\r\n if (this._debugVoxelMarchEnabled) {\r\n effect.defines = \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (prePassRenderer) {\r\n const wnormalIndex = prePassRenderer.getIndex(Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE);\r\n const depthIndex = prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n const clipDepthIndex = prePassRenderer.getIndex(Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE);\r\n const wPositionIndex = prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n if (wnormalIndex >= 0) effect.setTexture(\"worldNormalSampler\", prePassRenderer.getRenderTarget().textures[wnormalIndex]);\r\n if (depthIndex >= 0) effect.setTexture(\"linearDepthSampler\", prePassRenderer.getRenderTarget().textures[depthIndex]);\r\n if (clipDepthIndex >= 0) effect.setTexture(\"depthSampler\", prePassRenderer.getRenderTarget().textures[clipDepthIndex]);\r\n if (wPositionIndex >= 0) effect.setTexture(\"worldPositionSampler\", prePassRenderer.getRenderTarget().textures[wPositionIndex]);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._outputPP.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady()) &&\r\n this._renderPipeline!.getIcdfyTexture().isReady() &&\r\n this._renderPipeline!.getIcdfxTexture().isReady() &&\r\n this._renderPipeline!.getVoxelGridTexture().isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputPP.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelTracingPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelTracingPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector2, Vector4 } from \"../../Maths/math.vector\";\r\nimport \"../../Shaders/iblShadowVoxelTracing.fragment\";\r\nimport \"../../Shaders/iblShadowDebug.fragment\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\n\r\n/**\r\n * Build cdf maps for IBL importance sampling during IBL shadow computation.\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsVoxelTracingPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _voxelShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public get voxelShadowOpacity(): number {\r\n return this._voxelShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the shadow cast from the voxel grid\r\n */\r\n public set voxelShadowOpacity(value: number) {\r\n this._voxelShadowOpacity = value;\r\n }\r\n private _sssSamples: number = 16;\r\n private _sssStride: number = 8;\r\n private _sssMaxDist: number = 0.05;\r\n private _sssThickness: number = 0.01;\r\n\r\n private _ssShadowOpacity: number = 1.0;\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public get ssShadowOpacity(): number {\r\n return this._ssShadowOpacity;\r\n }\r\n /**\r\n * The opacity of the screen-space shadow\r\n */\r\n public set ssShadowOpacity(value: number) {\r\n this._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 sssSamples(): number {\r\n return this._sssSamples;\r\n }\r\n\r\n /**\r\n * The number of samples used in the screen space shadow pass.\r\n */\r\n public set sssSamples(value: number) {\r\n this._sssSamples = value;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public get sssStride(): number {\r\n return this._sssStride;\r\n }\r\n\r\n /**\r\n * The stride used in the screen space shadow pass. This controls the distance between samples.\r\n */\r\n public set sssStride(value: number) {\r\n this._sssStride = value;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public get sssMaxDist(): number {\r\n return this._sssMaxDist;\r\n }\r\n\r\n /**\r\n * The maximum distance that the screen-space shadow will be able to occlude.\r\n */\r\n public set sssMaxDist(value: number) {\r\n this._sssMaxDist = value;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public get sssThickness(): number {\r\n return this._sssThickness;\r\n }\r\n\r\n /**\r\n * The thickness of the screen-space shadow\r\n */\r\n public set sssThickness(value: number) {\r\n this._sssThickness = value;\r\n }\r\n\r\n private _outputPP: PostProcess;\r\n private _cameraInvView: Matrix = Matrix.Identity();\r\n private _cameraInvProj: Matrix = Matrix.Identity();\r\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\r\n private _frameId: number = 0;\r\n private _sampleDirections: number = 4;\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public get sampleDirections(): number {\r\n return this._sampleDirections;\r\n }\r\n\r\n /**\r\n * The number of directions to sample for the voxel tracing.\r\n */\r\n public set sampleDirections(value: number) {\r\n this._sampleDirections = value;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public get envRotation(): number {\r\n return this._envRotation;\r\n }\r\n\r\n /**\r\n * The current rotation of the environment map, in radians.\r\n */\r\n public set envRotation(value: number) {\r\n this._envRotation = value;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Gets the pass post process\r\n * @returns The post process\r\n */\r\n public getPassPP(): PostProcess {\r\n return this._outputPP;\r\n }\r\n\r\n /**\r\n * Gets the debug pass post process. This will create the resources for the pass\r\n * if they don't already exist.\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Voxel Tracing Debug Pass\";\r\n\r\n /**\r\n * The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /** The default rotation of the environment map will align the shadows with the default lighting orientation */\r\n private _envRotation: number = 0.0;\r\n private _downscale: number = 1.0;\r\n\r\n /**\r\n * Set the matrix to use for scaling the world space to voxel space\r\n * @param matrix The matrix to use for scaling the world space to voxel space\r\n */\r\n public setWorldScaleMatrix(matrix: Matrix) {\r\n this._invWorldScaleMatrix = matrix;\r\n }\r\n\r\n private _debugVoxelMarchEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTextureFromPostProcessOutput(\"debugSampler\", this._outputPP);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the shadow voxel-tracing pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The shadow voxel-tracing pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n let defines = \"\";\r\n if (this._debugVoxelMarchEnabled) {\r\n defines += \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n const ppOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"viewMtx\", \"projMtx\", \"invProjMtx\", \"invViewMtx\", \"wsNormalizationMtx\", \"shadowParameters\", \"offsetDataParameters\", \"sssParameters\", \"shadowOpacity\"],\r\n samplers: [\"voxelGridSampler\", \"icdfySampler\", \"icdfxSampler\", \"blueNoiseSampler\", \"worldNormalSampler\", \"linearDepthSampler\", \"depthSampler\", \"worldPositionSampler\"],\r\n defines: defines,\r\n engine: this._engine,\r\n reusable: false,\r\n };\r\n this._outputPP = new PostProcess(\"voxelTracingPass\", \"iblShadowVoxelTracing\", ppOptions);\r\n this._outputPP.autoClear = false;\r\n this._outputPP.onApplyObservable.add((effect) => {\r\n this._updatePostProcess(effect, this._scene.activeCamera!);\r\n });\r\n }\r\n\r\n private _updatePostProcess(effect: Effect, camera: Camera) {\r\n effect.setMatrix(\"viewMtx\", camera.getViewMatrix());\r\n effect.setMatrix(\"projMtx\", camera.getProjectionMatrix());\r\n camera.getProjectionMatrix().invertToRef(this._cameraInvProj);\r\n camera.getViewMatrix().invertToRef(this._cameraInvView);\r\n effect.setMatrix(\"invProjMtx\", this._cameraInvProj);\r\n effect.setMatrix(\"invViewMtx\", this._cameraInvView);\r\n effect.setMatrix(\"wsNormalizationMtx\", this._invWorldScaleMatrix);\r\n\r\n this._frameId++;\r\n\r\n const downscaleSquared = this._downscale * this._downscale;\r\n let rotation = this._scene.useRightHandedSystem ? -this._envRotation - 0.5 * Math.PI : -this._envRotation - Math.PI;\r\n rotation = rotation % (2.0 * Math.PI);\r\n effect.setVector4(\"shadowParameters\", new Vector4(this._sampleDirections, this._frameId / downscaleSquared, this._downscale, rotation));\r\n const offset = new Vector2(0.0, 0.0);\r\n const voxelGrid = this._renderPipeline!.getVoxelGridTexture();\r\n const highestMip = Math.floor(Math.log2(voxelGrid!.getSize().width));\r\n effect.setVector4(\"offsetDataParameters\", new Vector4(offset.x, offset.y, highestMip, 0.0));\r\n\r\n // SSS Options.\r\n const worldScale = (1.0 / this._invWorldScaleMatrix.m[0]) * 2.0;\r\n const maxDist = this._sssMaxDist * worldScale;\r\n const thickness = this._sssThickness * worldScale;\r\n effect.setVector4(\"sssParameters\", new Vector4(this._sssSamples, this._sssStride, maxDist, thickness));\r\n effect.setVector4(\"shadowOpacity\", new Vector4(this._voxelShadowOpacity, this._ssShadowOpacity, 0.0, 0.0));\r\n effect.setTexture(\"voxelGridSampler\", voxelGrid);\r\n effect.setTexture(\"blueNoiseSampler\", (this._renderPipeline as any)._noiseTexture);\r\n effect.setTexture(\"icdfySampler\", this._renderPipeline!.getIcdfyTexture());\r\n effect.setTexture(\"icdfxSampler\", this._renderPipeline!.getIcdfxTexture());\r\n if (this._debugVoxelMarchEnabled) {\r\n effect.defines = \"#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\\n\";\r\n }\r\n\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (prePassRenderer) {\r\n const wnormalIndex = prePassRenderer.getIndex(Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE);\r\n const depthIndex = prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n const clipDepthIndex = prePassRenderer.getIndex(Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE);\r\n const wPositionIndex = prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n if (wnormalIndex >= 0) effect.setTexture(\"worldNormalSampler\", prePassRenderer.getRenderTarget().textures[wnormalIndex]);\r\n if (depthIndex >= 0) effect.setTexture(\"linearDepthSampler\", prePassRenderer.getRenderTarget().textures[depthIndex]);\r\n if (clipDepthIndex >= 0) effect.setTexture(\"depthSampler\", prePassRenderer.getRenderTarget().textures[clipDepthIndex]);\r\n if (wPositionIndex >= 0) effect.setTexture(\"worldPositionSampler\", prePassRenderer.getRenderTarget().textures[wPositionIndex]);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._outputPP.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady()) &&\r\n this._renderPipeline!.getIcdfyTexture().isReady() &&\r\n this._renderPipeline!.getIcdfxTexture().isReady() &&\r\n this._renderPipeline!.getVoxelGridTexture().isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputPP.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -5,15 +5,7 @@ import type { IParticleSystem } from "../../Particles/IParticleSystem.js";
|
|
|
5
5
|
import type { ISceneComponent } from "../../sceneComponent.js";
|
|
6
6
|
import type { FluidRenderingObject } from "./fluidRenderingObject";
|
|
7
7
|
import { FluidRenderingTargetRenderer } from "./fluidRenderingTargetRenderer";
|
|
8
|
-
import "../../
|
|
9
|
-
import "../../Shaders/fluidRenderingParticleDepth.fragment";
|
|
10
|
-
import "../../Shaders/fluidRenderingParticleThickness.vertex";
|
|
11
|
-
import "../../Shaders/fluidRenderingParticleThickness.fragment";
|
|
12
|
-
import "../../Shaders/fluidRenderingParticleDiffuse.vertex";
|
|
13
|
-
import "../../Shaders/fluidRenderingParticleDiffuse.fragment";
|
|
14
|
-
import "../../Shaders/fluidRenderingBilateralBlur.fragment";
|
|
15
|
-
import "../../Shaders/fluidRenderingStandardBlur.fragment";
|
|
16
|
-
import "../../Shaders/fluidRenderingRender.fragment";
|
|
8
|
+
import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
17
9
|
declare module "../../abstractScene" {
|
|
18
10
|
interface AbstractScene {
|
|
19
11
|
/** @internal (Backing field) */
|
|
@@ -91,6 +83,12 @@ export declare class FluidRenderer {
|
|
|
91
83
|
readonly renderObjects: Array<IFluidRenderingRenderObject>;
|
|
92
84
|
/** Retrieves all the render target renderers managed by the class */
|
|
93
85
|
readonly targetRenderers: FluidRenderingTargetRenderer[];
|
|
86
|
+
/** Shader language used by the renderer */
|
|
87
|
+
protected _shaderLanguage: ShaderLanguage;
|
|
88
|
+
/**
|
|
89
|
+
* Gets the shader language used in this renderer
|
|
90
|
+
*/
|
|
91
|
+
get shaderLanguage(): ShaderLanguage;
|
|
94
92
|
/**
|
|
95
93
|
* Initializes the class
|
|
96
94
|
* @param scene Scene in which the objects are part of
|
|
@@ -5,15 +5,6 @@ import { FluidRenderingObjectParticleSystem } from "./fluidRenderingObjectPartic
|
|
|
5
5
|
import { FluidRenderingTargetRenderer } from "./fluidRenderingTargetRenderer.js";
|
|
6
6
|
import { FluidRenderingObjectCustomParticles } from "./fluidRenderingObjectCustomParticles.js";
|
|
7
7
|
import { FluidRenderingDepthTextureCopy } from "./fluidRenderingDepthTextureCopy.js";
|
|
8
|
-
import "../../Shaders/fluidRenderingParticleDepth.vertex.js";
|
|
9
|
-
import "../../Shaders/fluidRenderingParticleDepth.fragment.js";
|
|
10
|
-
import "../../Shaders/fluidRenderingParticleThickness.vertex.js";
|
|
11
|
-
import "../../Shaders/fluidRenderingParticleThickness.fragment.js";
|
|
12
|
-
import "../../Shaders/fluidRenderingParticleDiffuse.vertex.js";
|
|
13
|
-
import "../../Shaders/fluidRenderingParticleDiffuse.fragment.js";
|
|
14
|
-
import "../../Shaders/fluidRenderingBilateralBlur.fragment.js";
|
|
15
|
-
import "../../Shaders/fluidRenderingStandardBlur.fragment.js";
|
|
16
|
-
import "../../Shaders/fluidRenderingRender.fragment.js";
|
|
17
8
|
Object.defineProperty(Scene.prototype, "fluidRenderer", {
|
|
18
9
|
get: function () {
|
|
19
10
|
return this._fluidRenderer;
|
|
@@ -112,11 +103,19 @@ export class FluidRenderer {
|
|
|
112
103
|
scene._addComponent(component);
|
|
113
104
|
}
|
|
114
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Gets the shader language used in this renderer
|
|
108
|
+
*/
|
|
109
|
+
get shaderLanguage() {
|
|
110
|
+
return this._shaderLanguage;
|
|
111
|
+
}
|
|
115
112
|
/**
|
|
116
113
|
* Initializes the class
|
|
117
114
|
* @param scene Scene in which the objects are part of
|
|
118
115
|
*/
|
|
119
116
|
constructor(scene) {
|
|
117
|
+
/** Shader language used by the renderer */
|
|
118
|
+
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
120
119
|
this._scene = scene;
|
|
121
120
|
this._engine = scene.getEngine();
|
|
122
121
|
this._onEngineResizeObserver = null;
|
|
@@ -127,6 +126,10 @@ export class FluidRenderer {
|
|
|
127
126
|
this._onEngineResizeObserver = this._engine.onResizeObservable.add(() => {
|
|
128
127
|
this._initialize();
|
|
129
128
|
});
|
|
129
|
+
const engine = this._engine;
|
|
130
|
+
if (engine.isWebGPU) {
|
|
131
|
+
this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
|
132
|
+
}
|
|
130
133
|
}
|
|
131
134
|
/**
|
|
132
135
|
* Reinitializes the class
|
|
@@ -154,10 +157,10 @@ export class FluidRenderer {
|
|
|
154
157
|
* @returns the render object corresponding to the particle system
|
|
155
158
|
*/
|
|
156
159
|
addParticleSystem(ps, generateDiffuseTexture, targetRenderer, camera) {
|
|
157
|
-
const object = new FluidRenderingObjectParticleSystem(this._scene, ps);
|
|
160
|
+
const object = new FluidRenderingObjectParticleSystem(this._scene, ps, this._shaderLanguage);
|
|
158
161
|
object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());
|
|
159
162
|
if (!targetRenderer) {
|
|
160
|
-
targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera);
|
|
163
|
+
targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera, this._shaderLanguage);
|
|
161
164
|
this.targetRenderers.push(targetRenderer);
|
|
162
165
|
}
|
|
163
166
|
if (!targetRenderer._onUseVelocityChanged.hasObservers()) {
|
|
@@ -182,10 +185,10 @@ export class FluidRenderer {
|
|
|
182
185
|
* @returns the render object corresponding to the custom particle set
|
|
183
186
|
*/
|
|
184
187
|
addCustomParticles(buffers, numParticles, generateDiffuseTexture, targetRenderer, camera) {
|
|
185
|
-
const object = new FluidRenderingObjectCustomParticles(this._scene, buffers, numParticles);
|
|
188
|
+
const object = new FluidRenderingObjectCustomParticles(this._scene, buffers, numParticles, this._shaderLanguage);
|
|
186
189
|
object.onParticleSizeChanged.add(() => this._setParticleSizeForRenderTargets());
|
|
187
190
|
if (!targetRenderer) {
|
|
188
|
-
targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera);
|
|
191
|
+
targetRenderer = new FluidRenderingTargetRenderer(this._scene, camera, this._shaderLanguage);
|
|
189
192
|
this.targetRenderers.push(targetRenderer);
|
|
190
193
|
}
|
|
191
194
|
if (!targetRenderer._onUseVelocityChanged.hasObservers()) {
|