@babylonjs/core 7.22.3 → 7.22.5
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/animationGroup.js +1 -1
- package/Animations/animationGroup.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +21 -1
- package/Engines/constants.js +21 -1
- package/Engines/constants.js.map +1 -1
- package/Engines/engineFeatures.d.ts +2 -0
- package/Engines/engineFeatures.js.map +1 -1
- package/Engines/nativeEngine.js +1 -0
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +1 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -0
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +12 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +51 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/prePassTextureBlock.d.ts +27 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js +69 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +12 -0
- package/Materials/Node/nodeMaterial.js +24 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +8 -0
- package/Materials/PBR/pbrBaseMaterial.js +8 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.d.ts +4 -0
- package/Materials/Textures/Procedurals/proceduralTexture.js +19 -5
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/effectRenderer.d.ts +4 -0
- package/Materials/effectRenderer.js +10 -10
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/materialHelper.functions.js +20 -0
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/prePassConfiguration.js +2 -1
- package/Materials/prePassConfiguration.js.map +1 -1
- package/Materials/standardMaterial.d.ts +8 -0
- package/Materials/standardMaterial.js +8 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Misc/fileTools.js +1 -1
- package/Misc/fileTools.js.map +1 -1
- package/PostProcesses/postProcessManager.d.ts +2 -0
- package/PostProcesses/postProcessManager.js +3 -0
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +79 -8
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +88 -0
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +240 -0
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts +88 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +231 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +340 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +884 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +67 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +139 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +168 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +597 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +151 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +291 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -0
- package/Rendering/depthRenderer.js +44 -23
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/index.d.ts +1 -0
- package/Rendering/index.js +1 -0
- package/Rendering/index.js.map +1 -1
- package/Rendering/outlineRenderer.js +3 -3
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js +25 -1
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/instancesDeclaration.js +4 -2
- package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/instancesVertex.js +8 -4
- package/Shaders/ShadersInclude/instancesVertex.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js +4 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/prePassVertex.js +5 -1
- package/Shaders/ShadersInclude/prePassVertex.js.map +1 -1
- package/Shaders/ShadersInclude/prePassVertexDeclaration.js +4 -1
- package/Shaders/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/Shaders/combineVoxelGrids.fragment.d.ts +5 -0
- package/Shaders/combineVoxelGrids.fragment.js +9 -0
- package/Shaders/combineVoxelGrids.fragment.js.map +1 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.d.ts +5 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.js +10 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.js.map +1 -0
- package/Shaders/default.fragment.js +31 -6
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/default.vertex.js +6 -2
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/generateVoxelMip.fragment.d.ts +5 -0
- package/Shaders/generateVoxelMip.fragment.js +25 -0
- package/Shaders/generateVoxelMip.fragment.js.map +1 -0
- package/Shaders/geometry.fragment.js +1 -1
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/iblShadowAccumulation.fragment.d.ts +5 -0
- package/Shaders/iblShadowAccumulation.fragment.js +27 -0
- package/Shaders/iblShadowAccumulation.fragment.js.map +1 -0
- package/Shaders/iblShadowDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowDebug.fragment.js +18 -0
- package/Shaders/iblShadowDebug.fragment.js.map +1 -0
- package/Shaders/iblShadowGBufferDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowGBufferDebug.fragment.js +19 -0
- package/Shaders/iblShadowGBufferDebug.fragment.js.map +1 -0
- package/Shaders/iblShadowSpatialBlur.fragment.d.ts +5 -0
- package/Shaders/iblShadowSpatialBlur.fragment.js +21 -0
- package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -0
- package/Shaders/iblShadowVoxelTracing.fragment.d.ts +5 -0
- package/Shaders/iblShadowVoxelTracing.fragment.js +152 -0
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -0
- package/Shaders/iblShadowsCdfx.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCdfx.fragment.js +12 -0
- package/Shaders/iblShadowsCdfx.fragment.js.map +1 -0
- package/Shaders/iblShadowsCdfy.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCdfy.fragment.js +33 -0
- package/Shaders/iblShadowsCdfy.fragment.js.map +1 -0
- package/Shaders/iblShadowsCombine.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCombine.fragment.js +10 -0
- package/Shaders/iblShadowsCombine.fragment.js.map +1 -0
- package/Shaders/iblShadowsIcdfx.fragment.d.ts +5 -0
- package/Shaders/iblShadowsIcdfx.fragment.js +19 -0
- package/Shaders/iblShadowsIcdfx.fragment.js.map +1 -0
- package/Shaders/iblShadowsIcdfy.fragment.d.ts +5 -0
- package/Shaders/iblShadowsIcdfy.fragment.js +19 -0
- package/Shaders/iblShadowsIcdfy.fragment.js.map +1 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js +48 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +1 -0
- package/Shaders/pbr.fragment.js +32 -7
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +3 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/voxelGrid.fragment.d.ts +5 -0
- package/Shaders/voxelGrid.fragment.js +14 -0
- package/Shaders/voxelGrid.fragment.js.map +1 -0
- package/Shaders/voxelGrid.vertex.d.ts +5 -0
- package/Shaders/voxelGrid.vertex.js +9 -0
- package/Shaders/voxelGrid.vertex.js.map +1 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.d.ts +5 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.js +9 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.js.map +1 -0
- package/Shaders/voxelGrid3dDebug.fragment.d.ts +5 -0
- package/Shaders/voxelGrid3dDebug.fragment.js +22 -0
- package/Shaders/voxelGrid3dDebug.fragment.js.map +1 -0
- package/Shaders/voxelSlabDebug.fragment.d.ts +5 -0
- package/Shaders/voxelSlabDebug.fragment.js +11 -0
- package/Shaders/voxelSlabDebug.fragment.js.map +1 -0
- package/Shaders/voxelSlabDebug.vertex.d.ts +5 -0
- package/Shaders/voxelSlabDebug.vertex.js +9 -0
- package/Shaders/voxelSlabDebug.vertex.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +4 -2
- package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/instancesVertex.js +9 -4
- package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +4 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js +5 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +4 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +42 -16
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +5 -2
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +1 -1
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +37 -20
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +1 -1
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/package.json +1 -1
- package/sceneComponent.d.ts +1 -0
- package/sceneComponent.js +1 -0
- package/sceneComponent.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { WebGPUEngine } from \"../../Engines/webgpuEngine\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../../Maths/math.color\";\r\nimport { Matrix, Vector3, Vector4 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport \"../../Shaders/voxelGrid.fragment\";\r\nimport \"../../Shaders/voxelGrid.vertex\";\r\nimport \"../../Shaders/voxelGrid2dArrayDebug.fragment\";\r\nimport \"../../Shaders/voxelGrid3dDebug.fragment\";\r\nimport \"../../Shaders/voxelSlabDebug.vertex\";\r\nimport \"../../Shaders/voxelSlabDebug.fragment\";\r\nimport \"../../Shaders/combineVoxelGrids.fragment\";\r\nimport \"../../Shaders/generateVoxelMip.fragment\";\r\nimport \"../../Shaders/copyTexture3DLayerToTexture.fragment\";\r\n\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { ProceduralTexture } from \"../../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport type { RenderTargetWrapper } from \"core/Engines\";\r\nimport { Observable } from \"../../Misc/observable\";\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 * @internal\r\n */\r\nexport class _IblShadowsVoxelRenderer {\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _voxelGridRT: ProceduralTexture;\r\n private _voxelGridXaxis: RenderTargetTexture;\r\n private _voxelGridYaxis: RenderTargetTexture;\r\n private _voxelGridZaxis: RenderTargetTexture;\r\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\r\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\r\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\r\n private _isVoxelGrid3D: boolean = true;\r\n\r\n /**\r\n * Return the voxel grid texture.\r\n * @returns The voxel grid texture.\r\n */\r\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\r\n if (this._triPlanarVoxelization) {\r\n return this._voxelGridRT;\r\n } else {\r\n return this._voxelGridZaxis;\r\n }\r\n }\r\n\r\n /**\r\n * The debug pass post process\r\n * @returns The debug pass post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._voxelDebugPass) {\r\n this._createDebugPass();\r\n }\r\n return this._voxelDebugPass;\r\n }\r\n\r\n private _maxDrawBuffers: number;\r\n private _renderTargets: RenderTargetTexture[] = [];\r\n\r\n private _triPlanarVoxelization: boolean = true;\r\n\r\n /**\r\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\r\n */\r\n public get triPlanarVoxelization(): boolean {\r\n return this._triPlanarVoxelization;\r\n }\r\n\r\n /**\r\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\r\n */\r\n public set triPlanarVoxelization(enabled: boolean) {\r\n if (this._triPlanarVoxelization === enabled) {\r\n return;\r\n }\r\n this._triPlanarVoxelization = enabled;\r\n this._disposeVoxelTextures();\r\n this._createTextures();\r\n this._renderPipeline.updateVoxelization();\r\n }\r\n\r\n private _voxelizationInProgress: boolean = false;\r\n private _invWorldScaleMatrix: Matrix;\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 * @returns Whether voxelization is currently happening.\r\n */\r\n public isVoxelizationInProgress(): boolean {\r\n return this._voxelizationInProgress;\r\n }\r\n\r\n private _voxelResolution: number = 64;\r\n private _voxelResolutionExp: number = 6;\r\n\r\n /**\r\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\r\n */\r\n public get voxelResolutionExp(): number {\r\n return this._voxelResolutionExp;\r\n }\r\n\r\n /**\r\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\r\n */\r\n public set voxelResolutionExp(resolutionExp: number) {\r\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\r\n return;\r\n }\r\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\r\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\r\n this._disposeVoxelTextures();\r\n this._createTextures();\r\n }\r\n\r\n /**\r\n * Observable that will be triggered when the voxel grid is ready to be used\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n private _copyMipEffectRenderer: EffectRenderer;\r\n private _copyMipEffectWrapper: EffectWrapper;\r\n private _mipArray: ProceduralTexture[] = [];\r\n\r\n private _voxelSlabDebugRT: RenderTargetTexture;\r\n private _voxelDebugPass: PostProcess;\r\n private _voxelDebugEnabled: boolean = false;\r\n\r\n /**\r\n * Shows only the voxels that were rendered along a particular axis (while using triPlanarVoxelization).\r\n * If not set, the combined voxel grid will be shown.\r\n * Note: This only works when the debugMipNumber is set to 0 because we don't generate mips for each axis.\r\n * @param axis The axis to show (0 = x, 1 = y, 2 = z)\r\n */\r\n public set voxelDebugAxis(axis: number) {\r\n this._voxelDebugAxis = axis;\r\n }\r\n\r\n public get voxelDebugAxis(): number {\r\n return this._voxelDebugAxis;\r\n }\r\n private _voxelDebugAxis: number = -1;\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 private _debugMipNumber: number = 0;\r\n /**\r\n * The mip level to show in the debug display\r\n * @param mipNum The mip level to show in the debug display\r\n */\r\n public setDebugMipNumber(mipNum: number) {\r\n this._debugMipNumber = mipNum;\r\n }\r\n private _debugPassName: string = \"Voxelization Debug Pass\";\r\n /**\r\n * Sets 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 /**\r\n * Enable or disable the debug view for this pass\r\n */\r\n public get voxelDebugEnabled(): boolean {\r\n return this._voxelDebugEnabled;\r\n }\r\n\r\n public set voxelDebugEnabled(enabled: boolean) {\r\n if (this._voxelDebugEnabled === enabled) {\r\n return;\r\n }\r\n this._voxelDebugEnabled = enabled;\r\n if (enabled) {\r\n this._voxelSlabDebugRT = new RenderTargetTexture(\"voxelSlabDebug\", { ratio: 1 }, this._scene, {\r\n generateDepthBuffer: true,\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_R,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n });\r\n this._voxelSlabDebugRT.noPrePassRenderer = true;\r\n } else {\r\n if (this._voxelSlabDebugRT) {\r\n this._removeVoxelRTs([this._voxelSlabDebugRT]);\r\n }\r\n }\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._voxelDebugPass) {\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\", \"mipNumber\"],\r\n samplers: [\"voxelTexture\", \"voxelSlabTexture\"],\r\n engine: this._engine,\r\n reusable: false,\r\n };\r\n this._voxelDebugPass = new PostProcess(this.debugPassName, this._isVoxelGrid3D ? \"voxelGrid3dDebug\" : \"voxelGrid2dArrayDebug\", debugOptions);\r\n this._voxelDebugPass.onApplyObservable.add((effect) => {\r\n if (this._voxelDebugAxis === 0) {\r\n effect.setTexture(\"voxelTexture\", this._voxelGridXaxis);\r\n } else if (this._voxelDebugAxis === 1) {\r\n effect.setTexture(\"voxelTexture\", this._voxelGridYaxis);\r\n } else if (this._voxelDebugAxis === 2) {\r\n effect.setTexture(\"voxelTexture\", this._voxelGridZaxis);\r\n } else {\r\n effect.setTexture(\"voxelTexture\", this.getVoxelGrid());\r\n }\r\n effect.setTexture(\"voxelSlabTexture\", this._voxelSlabDebugRT);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n effect.setFloat(\"mipNumber\", this._debugMipNumber);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the voxel renderer\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\r\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\r\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\r\n * @returns The voxel renderer\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine() as Engine;\r\n this._triPlanarVoxelization = triPlanarVoxelization;\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n if (!this._engine.getCaps().drawBuffersExtension) {\r\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\r\n }\r\n\r\n if (this._engine instanceof WebGPUEngine) {\r\n this._maxDrawBuffers = 8; // TODO - get this from the WebGPU engine?\r\n } else {\r\n this._maxDrawBuffers = (this._engine as Engine)._gl.getParameter((this._engine as Engine)._gl.MAX_DRAW_BUFFERS);\r\n }\r\n\r\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\r\n this._copyMipEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n fragmentShader: \"copyTexture3DLayerToTexture\",\r\n useShaderStore: true,\r\n uniformNames: [\"layerNum\"],\r\n samplerNames: [\"textureSampler\"],\r\n });\r\n\r\n this.voxelResolutionExp = resolutionExp;\r\n }\r\n\r\n private _generateMipMaps() {\r\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\r\n for (let i = 1; i < iterations + 1; i++) {\r\n this._generateMipMap(i);\r\n }\r\n }\r\n\r\n private _generateMipMap(lodLevel: number) {\r\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\r\n const mipTarget = this._mipArray[lodLevel - 1];\r\n if (!mipTarget) {\r\n return;\r\n }\r\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\r\n mipTarget.render();\r\n }\r\n\r\n private _copyMipMaps() {\r\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\r\n for (let i = 1; i < iterations + 1; i++) {\r\n this._copyMipMap(i);\r\n }\r\n }\r\n\r\n private _copyMipMap(lodLevel: number) {\r\n // Now, copy this mip into the mip chain of the voxel grid.\r\n // TODO - this currently isn't working. \"textureSampler\" isn't being properly set to mipTarget.\r\n const mipTarget = this._mipArray[lodLevel - 1];\r\n if (!mipTarget) {\r\n return;\r\n }\r\n const voxelGrid = this.getVoxelGrid();\r\n let rt: RenderTargetWrapper;\r\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\r\n rt = voxelGrid.renderTarget;\r\n } else {\r\n rt = (voxelGrid as any)._rtWrapper;\r\n }\r\n if (rt) {\r\n this._copyMipEffectRenderer.saveStates();\r\n const bindSize = mipTarget.getSize().width;\r\n\r\n // Render to each layer of the voxel grid.\r\n for (let layer = 0; layer < bindSize; layer++) {\r\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\r\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\r\n this._copyMipEffectWrapper.effect.setTexture(\"textureSampler\", mipTarget);\r\n this._copyMipEffectWrapper.effect.setInt(\"layerNum\", layer);\r\n this._copyMipEffectRenderer.draw();\r\n this._engine.unBindFramebuffer(rt, true);\r\n }\r\n this._copyMipEffectRenderer.restoreStates();\r\n }\r\n }\r\n\r\n private _computeNumberOfSlabs(): number {\r\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\r\n }\r\n\r\n private _createTextures() {\r\n const size: TextureSize = {\r\n width: this._voxelResolution,\r\n height: this._voxelResolution,\r\n layers: this._isVoxelGrid3D ? undefined : this._voxelResolution,\r\n depth: this._isVoxelGrid3D ? this._voxelResolution : undefined,\r\n };\r\n const voxelAxisOptions: RenderTargetTextureOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_R,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n\r\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\r\n // We call this a slab.\r\n const numSlabs = this._computeNumberOfSlabs();\r\n const voxelCombinedOptions: RenderTargetTextureOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: true,\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_R,\r\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\r\n };\r\n if (this._triPlanarVoxelization) {\r\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\r\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\r\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\r\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\r\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\r\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\r\n\r\n this._voxelGridRT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"combineVoxelGrids\", this._scene, voxelCombinedOptions, true);\r\n this._voxelGridRT.isRenderTarget = true;\r\n this._voxelGridRT.setFloat(\"layer\", 0.0);\r\n this._voxelGridRT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\r\n this._voxelGridRT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\r\n this._voxelGridRT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\r\n // We will render this only after voxelization is completed for the 3 axes.\r\n this._voxelGridRT.autoClear = false;\r\n this._voxelGridRT.refreshRate = 0;\r\n this._voxelGridRT.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this._voxelGridRT.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n } else {\r\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\r\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\r\n }\r\n\r\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\r\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\r\n const mipDim = this._voxelResolution >> mipIdx;\r\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\r\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"generateVoxelMip\", this._scene, voxelAxisOptions);\r\n\r\n const mipTarget = this._mipArray[mipIdx - 1];\r\n mipTarget._noMipmap = true;\r\n mipTarget.refreshRate = 0;\r\n mipTarget.autoClear = false;\r\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\r\n mipTarget.setInt(\"layerNum\", 0);\r\n }\r\n }\r\n\r\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\r\n voxelRT.noPrePassRenderer = true;\r\n const mrtArray: MultiRenderTarget[] = [];\r\n const targetTypes = new Array(this._maxDrawBuffers).fill(this._isVoxelGrid3D ? Constants.TEXTURE_3D : Constants.TEXTURE_2D_ARRAY);\r\n\r\n for (let mrt_index = 0; mrt_index < numSlabs; mrt_index++) {\r\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\r\n layerIndices = layerIndices.map((value, index) => mrt_index * this._maxDrawBuffers + index);\r\n\r\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\r\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrt_index * this._maxDrawBuffers + index));\r\n\r\n const mrt = new MultiRenderTarget(\r\n \"mrt_\" + name + mrt_index,\r\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._isVoxelGrid3D ? this._voxelResolution : undefined },\r\n this._maxDrawBuffers, // number of draw buffers\r\n this._scene,\r\n {\r\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\r\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\r\n generateMipMaps: false,\r\n targetTypes,\r\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\r\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\r\n layerIndex: layerIndices,\r\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n },\r\n textureNames\r\n );\r\n\r\n mrt.clearColor = new Color4(0, 0, 0, 1);\r\n mrt.noPrePassRenderer = true;\r\n for (let i = 0; i < this._maxDrawBuffers; i++) {\r\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\r\n }\r\n\r\n mrtArray.push(mrt);\r\n }\r\n return mrtArray;\r\n }\r\n\r\n private _disposeVoxelTextures() {\r\n this._stopVoxelization();\r\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\r\n if (this._triPlanarVoxelization) {\r\n this._voxelMrtsXaxis[i].dispose(true);\r\n this._voxelMrtsYaxis[i].dispose(true);\r\n }\r\n this._voxelMrtsZaxis[i].dispose(true);\r\n }\r\n if (this._triPlanarVoxelization) {\r\n this._voxelGridXaxis?.dispose();\r\n this._voxelGridYaxis?.dispose();\r\n this._voxelGridRT?.dispose();\r\n }\r\n this._voxelGridZaxis?.dispose();\r\n this._mipArray.forEach((mip) => {\r\n mip.dispose();\r\n });\r\n this._mipArray = [];\r\n this._voxelMrtsXaxis = [];\r\n this._voxelMrtsYaxis = [];\r\n this._voxelMrtsZaxis = [];\r\n }\r\n\r\n private _createVoxelMaterial(): ShaderMaterial {\r\n const voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"voxelGrid\", {\r\n uniforms: [\"world\", \"viewMatrix\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\r\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\r\n });\r\n voxelMaterial.cullBackFaces = false;\r\n voxelMaterial.backFaceCulling = false;\r\n voxelMaterial.depthFunction = Engine.ALWAYS;\r\n return voxelMaterial;\r\n }\r\n\r\n /**\r\n * Checks if the voxel renderer is ready to voxelize scene\r\n * @returns true if the voxel renderer is ready to voxelize scene\r\n */\r\n public isReady() {\r\n if (!this.getVoxelGrid().isReady() || this._voxelizationInProgress) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * If the MRT's are already in the list of render targets, this will\r\n * remove them so that they don't get rendered again.\r\n */\r\n private _stopVoxelization() {\r\n // If the MRT's are already in the list of render targets, remove them.\r\n this._removeVoxelRTs(this._voxelMrtsXaxis);\r\n this._removeVoxelRTs(this._voxelMrtsYaxis);\r\n this._removeVoxelRTs(this._voxelMrtsZaxis);\r\n }\r\n\r\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\r\n // const currentRTs = this._scene.customRenderTargets;\r\n const rtIdx = this._renderTargets.findIndex((rt) => {\r\n if (rt === rts[0]) return true;\r\n return false;\r\n });\r\n if (rtIdx >= 0) {\r\n this._renderTargets.splice(rtIdx, rts.length);\r\n } else {\r\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\r\n if (rt === rts[0]) return true;\r\n return false;\r\n });\r\n if (rtIdx >= 0) {\r\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Renders voxel grid of scene for IBL shadows\r\n * @param excludedMeshes\r\n */\r\n public updateVoxelGrid(excludedMeshes: number[]) {\r\n this._stopVoxelization();\r\n\r\n this._voxelizationInProgress = true;\r\n\r\n if (this._triPlanarVoxelization) {\r\n this._addRTsForRender(this._voxelMrtsXaxis, excludedMeshes, 0);\r\n this._addRTsForRender(this._voxelMrtsYaxis, excludedMeshes, 1);\r\n this._addRTsForRender(this._voxelMrtsZaxis, excludedMeshes, 2);\r\n } else {\r\n this._addRTsForRender(this._voxelMrtsZaxis, excludedMeshes, 2);\r\n }\r\n\r\n // Add the slab debug RT if needed.\r\n if (this._voxelDebugEnabled) {\r\n this._removeVoxelRTs([this._voxelSlabDebugRT]);\r\n this._addRTsForRender([this._voxelSlabDebugRT], [], this._voxelDebugAxis, 1, true);\r\n }\r\n\r\n (this as any).boundVoxelGridRenderFn = this._renderVoxelGrid.bind(this);\r\n this._scene.onAfterRenderTargetsRenderObservable.add((this as any).boundVoxelGridRenderFn);\r\n }\r\n\r\n private _renderVoxelGrid() {\r\n if (this._voxelizationInProgress) {\r\n const allRTsReady = this._renderTargets.every((rt) => rt.isReadyForRendering());\r\n if (allRTsReady) {\r\n (this._scene.prePassRenderer as any)._setEnabled(false);\r\n this._renderTargets.forEach((rt) => {\r\n rt.render();\r\n });\r\n this._stopVoxelization();\r\n\r\n if (this._triPlanarVoxelization) {\r\n // This hack is to prevent the procedural texture from auto-generating mips while unbinding the framebuffer.\r\n this._voxelGridRT._generateMipMaps = false;\r\n this._voxelGridRT.render();\r\n }\r\n this._generateMipMaps();\r\n this._copyMipMaps();\r\n this._voxelizationInProgress = false;\r\n this._scene.onAfterRenderTargetsRenderObservable.removeCallback((this as any).boundVoxelGridRenderFn);\r\n this.onReadyObservable.notifyObservers();\r\n (this._scene.prePassRenderer as any)._setEnabled(true);\r\n }\r\n }\r\n }\r\n\r\n private _addRTsForRender(mrts: RenderTargetTexture[], excludedMeshes: number[], axis: number, shaderType: number = 0, continuousRender: boolean = false) {\r\n const slabSize = 1.0 / this._computeNumberOfSlabs();\r\n const meshes = this._scene.meshes;\r\n\r\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\r\n mrts.forEach((mrt, mrtIndex) => {\r\n mrt.renderList = [];\r\n const nearPlane = mrtIndex * slabSize;\r\n const farPlane = (mrtIndex + 1) * slabSize;\r\n const stepSize = slabSize / this._maxDrawBuffers;\r\n\r\n let voxelMaterial: ShaderMaterial;\r\n if (shaderType === 0) {\r\n voxelMaterial = this._createVoxelMaterial();\r\n } else {\r\n voxelMaterial = new ShaderMaterial(\"voxelSlabDebug\", this._scene, \"voxelSlabDebug\", {\r\n uniforms: [\"world\", \"viewMatrix\", \"cameraViewMatrix\", \"projection\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\r\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\r\n });\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n voxelMaterial.setMatrix(\"projection\", this._scene.activeCamera!.getProjectionMatrix());\r\n voxelMaterial.setMatrix(\"cameraViewMatrix\", this._scene.activeCamera!.getViewMatrix());\r\n });\r\n }\r\n const cameraPosition = new Vector3(0, 0, 0);\r\n let targetPosition = new Vector3(0, 0, 1);\r\n if (axis === 0) {\r\n targetPosition = new Vector3(1, 0, 0);\r\n } else if (axis === 1) {\r\n targetPosition = new Vector3(0, 1, 0);\r\n }\r\n let upDirection = new Vector3(0, 1, 0);\r\n if (axis === 1) {\r\n upDirection = new Vector3(1, 0, 0);\r\n }\r\n voxelMaterial.setMatrix(\"viewMatrix\", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));\r\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\r\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\r\n voxelMaterial.setFloat(\"farPlane\", farPlane);\r\n voxelMaterial.setFloat(\"stepSize\", stepSize);\r\n\r\n // Set this material on every mesh in the scene (for this RT)\r\n meshes.forEach((mesh) => {\r\n if (mesh instanceof Mesh && mesh.material && excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n mrt.renderList?.push(mesh);\r\n\r\n // TODO - if the mesh already has a voxel material applied, don't create a new one.\r\n // mesh.getMaterialForRenderPass(mrt.renderPassIds)\r\n mrt.setMaterialForRendering(mesh, voxelMaterial);\r\n }\r\n });\r\n });\r\n\r\n // Add the MRT's to render.\r\n if (continuousRender) {\r\n this._scene.customRenderTargets = this._scene.customRenderTargets.concat(mrts);\r\n } else {\r\n this._renderTargets = this._renderTargets.concat(mrts);\r\n }\r\n }\r\n\r\n /**\r\n * Called by the pipeline to resize resources.\r\n */\r\n public resize() {\r\n this._voxelSlabDebugRT?.resize({ width: this._scene.getEngine().getRenderWidth(), height: this._scene.getEngine().getRenderHeight() });\r\n }\r\n\r\n /**\r\n * Disposes the voxel renderer and associated resources\r\n */\r\n public dispose() {\r\n this._disposeVoxelTextures();\r\n if (this._voxelSlabDebugRT) {\r\n this._removeVoxelRTs([this._voxelSlabDebugRT]);\r\n this._voxelSlabDebugRT.dispose();\r\n }\r\n if (this._voxelDebugPass) {\r\n this._voxelDebugPass.dispose();\r\n }\r\n // TODO - dispose all created voxel materials.\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { Scene } from "../../scene";
|
|
2
|
+
import { Matrix } from "../../Maths/math.vector";
|
|
3
|
+
import "../../Shaders/iblShadowVoxelTracing.fragment";
|
|
4
|
+
import "../../Shaders/iblShadowDebug.fragment";
|
|
5
|
+
import { PostProcess } from "../../PostProcesses/postProcess";
|
|
6
|
+
import type { IblShadowsRenderPipeline } from "./iblShadowsRenderPipeline";
|
|
7
|
+
/**
|
|
8
|
+
* Build cdf maps for IBL importance sampling during IBL shadow computation.
|
|
9
|
+
* This should not be instanciated directly, as it is part of a scene component
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare class _IblShadowsVoxelTracingPass {
|
|
13
|
+
private _scene;
|
|
14
|
+
private _engine;
|
|
15
|
+
private _renderPipeline;
|
|
16
|
+
private _voxelShadowOpacity;
|
|
17
|
+
/**
|
|
18
|
+
* The opacity of the shadow cast from the voxel grid
|
|
19
|
+
*/
|
|
20
|
+
get voxelShadowOpacity(): number;
|
|
21
|
+
/**
|
|
22
|
+
* The opacity of the shadow cast from the voxel grid
|
|
23
|
+
*/
|
|
24
|
+
set voxelShadowOpacity(value: number);
|
|
25
|
+
private _sssSamples;
|
|
26
|
+
private _sssStride;
|
|
27
|
+
private _sssMaxDist;
|
|
28
|
+
private _sssThickness;
|
|
29
|
+
private _ssShadowOpacity;
|
|
30
|
+
/**
|
|
31
|
+
* The opacity of the screen-space shadow
|
|
32
|
+
*/
|
|
33
|
+
get ssShadowOpacity(): number;
|
|
34
|
+
/**
|
|
35
|
+
* The opacity of the screen-space shadow
|
|
36
|
+
*/
|
|
37
|
+
set ssShadowOpacity(value: number);
|
|
38
|
+
/**
|
|
39
|
+
* The number of samples used in the screen space shadow pass.
|
|
40
|
+
*/
|
|
41
|
+
get sssSamples(): number;
|
|
42
|
+
/**
|
|
43
|
+
* The number of samples used in the screen space shadow pass.
|
|
44
|
+
*/
|
|
45
|
+
set sssSamples(value: number);
|
|
46
|
+
/**
|
|
47
|
+
* The stride used in the screen space shadow pass. This controls the distance between samples.
|
|
48
|
+
*/
|
|
49
|
+
get sssStride(): number;
|
|
50
|
+
/**
|
|
51
|
+
* The stride used in the screen space shadow pass. This controls the distance between samples.
|
|
52
|
+
*/
|
|
53
|
+
set sssStride(value: number);
|
|
54
|
+
/**
|
|
55
|
+
* The maximum distance that the screen-space shadow will be able to occlude.
|
|
56
|
+
*/
|
|
57
|
+
get sssMaxDist(): number;
|
|
58
|
+
/**
|
|
59
|
+
* The maximum distance that the screen-space shadow will be able to occlude.
|
|
60
|
+
*/
|
|
61
|
+
set sssMaxDist(value: number);
|
|
62
|
+
/**
|
|
63
|
+
* The thickness of the screen-space shadow
|
|
64
|
+
*/
|
|
65
|
+
get sssThickness(): number;
|
|
66
|
+
/**
|
|
67
|
+
* The thickness of the screen-space shadow
|
|
68
|
+
*/
|
|
69
|
+
set sssThickness(value: number);
|
|
70
|
+
private _outputPP;
|
|
71
|
+
private _cameraInvView;
|
|
72
|
+
private _cameraInvProj;
|
|
73
|
+
private _invWorldScaleMatrix;
|
|
74
|
+
private _frameId;
|
|
75
|
+
private _sampleDirections;
|
|
76
|
+
/**
|
|
77
|
+
* The number of directions to sample for the voxel tracing.
|
|
78
|
+
*/
|
|
79
|
+
get sampleDirections(): number;
|
|
80
|
+
/**
|
|
81
|
+
* The number of directions to sample for the voxel tracing.
|
|
82
|
+
*/
|
|
83
|
+
set sampleDirections(value: number);
|
|
84
|
+
/**
|
|
85
|
+
* The current rotation of the environment map, in radians.
|
|
86
|
+
*/
|
|
87
|
+
get envRotation(): number;
|
|
88
|
+
/**
|
|
89
|
+
* The current rotation of the environment map, in radians.
|
|
90
|
+
*/
|
|
91
|
+
set envRotation(value: number);
|
|
92
|
+
/** Enable the debug view for this pass */
|
|
93
|
+
debugEnabled: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Gets the pass post process
|
|
96
|
+
* @returns The post process
|
|
97
|
+
*/
|
|
98
|
+
getPassPP(): PostProcess;
|
|
99
|
+
/**
|
|
100
|
+
* Gets the debug pass post process. This will create the resources for the pass
|
|
101
|
+
* if they don't already exist.
|
|
102
|
+
* @returns The post process
|
|
103
|
+
*/
|
|
104
|
+
getDebugPassPP(): PostProcess;
|
|
105
|
+
private _debugPassName;
|
|
106
|
+
/**
|
|
107
|
+
* The name of the debug pass
|
|
108
|
+
*/
|
|
109
|
+
get debugPassName(): string;
|
|
110
|
+
/** The default rotation of the environment map will align the shadows with the default lighting orientation */
|
|
111
|
+
private _envRotation;
|
|
112
|
+
private _downscale;
|
|
113
|
+
/**
|
|
114
|
+
* Set the matrix to use for scaling the world space to voxel space
|
|
115
|
+
* @param matrix The matrix to use for scaling the world space to voxel space
|
|
116
|
+
*/
|
|
117
|
+
setWorldScaleMatrix(matrix: Matrix): void;
|
|
118
|
+
private _debugVoxelMarchEnabled;
|
|
119
|
+
private _debugPassPP;
|
|
120
|
+
private _debugSizeParams;
|
|
121
|
+
/**
|
|
122
|
+
* Sets params that control the position and scaling of the debug display on the screen.
|
|
123
|
+
* @param x Screen X offset of the debug display (0-1)
|
|
124
|
+
* @param y Screen Y offset of the debug display (0-1)
|
|
125
|
+
* @param widthScale X scale of the debug display (0-1)
|
|
126
|
+
* @param heightScale Y scale of the debug display (0-1)
|
|
127
|
+
*/
|
|
128
|
+
setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number): void;
|
|
129
|
+
/**
|
|
130
|
+
* Creates the debug post process effect for this pass
|
|
131
|
+
*/
|
|
132
|
+
private _createDebugPass;
|
|
133
|
+
/**
|
|
134
|
+
* Instantiates the shadow voxel-tracing pass
|
|
135
|
+
* @param scene Scene to attach to
|
|
136
|
+
* @param iblShadowsRenderPipeline The IBL shadows render pipeline
|
|
137
|
+
* @returns The shadow voxel-tracing pass
|
|
138
|
+
*/
|
|
139
|
+
constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
|
|
140
|
+
private _createTextures;
|
|
141
|
+
private _updatePostProcess;
|
|
142
|
+
/**
|
|
143
|
+
* Checks if the pass is ready
|
|
144
|
+
* @returns true if the pass is ready
|
|
145
|
+
*/
|
|
146
|
+
isReady(): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Disposes the associated resources
|
|
149
|
+
*/
|
|
150
|
+
dispose(): void;
|
|
151
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
|
|
2
|
+
import { Matrix, Vector2, Vector4 } from "../../Maths/math.vector.js";
|
|
3
|
+
import "../../Shaders/iblShadowVoxelTracing.fragment.js";
|
|
4
|
+
import "../../Shaders/iblShadowDebug.fragment.js";
|
|
5
|
+
import { PostProcess } from "../../PostProcesses/postProcess.js";
|
|
6
|
+
/**
|
|
7
|
+
* Build cdf maps for IBL importance sampling during IBL shadow computation.
|
|
8
|
+
* This should not be instanciated directly, as it is part of a scene component
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export class _IblShadowsVoxelTracingPass {
|
|
12
|
+
/**
|
|
13
|
+
* The opacity of the shadow cast from the voxel grid
|
|
14
|
+
*/
|
|
15
|
+
get voxelShadowOpacity() {
|
|
16
|
+
return this._voxelShadowOpacity;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The opacity of the shadow cast from the voxel grid
|
|
20
|
+
*/
|
|
21
|
+
set voxelShadowOpacity(value) {
|
|
22
|
+
this._voxelShadowOpacity = value;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The opacity of the screen-space shadow
|
|
26
|
+
*/
|
|
27
|
+
get ssShadowOpacity() {
|
|
28
|
+
return this._ssShadowOpacity;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The opacity of the screen-space shadow
|
|
32
|
+
*/
|
|
33
|
+
set ssShadowOpacity(value) {
|
|
34
|
+
this._ssShadowOpacity = value;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The number of samples used in the screen space shadow pass.
|
|
38
|
+
*/
|
|
39
|
+
get sssSamples() {
|
|
40
|
+
return this._sssSamples;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The number of samples used in the screen space shadow pass.
|
|
44
|
+
*/
|
|
45
|
+
set sssSamples(value) {
|
|
46
|
+
this._sssSamples = value;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The stride used in the screen space shadow pass. This controls the distance between samples.
|
|
50
|
+
*/
|
|
51
|
+
get sssStride() {
|
|
52
|
+
return this._sssStride;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The stride used in the screen space shadow pass. This controls the distance between samples.
|
|
56
|
+
*/
|
|
57
|
+
set sssStride(value) {
|
|
58
|
+
this._sssStride = value;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The maximum distance that the screen-space shadow will be able to occlude.
|
|
62
|
+
*/
|
|
63
|
+
get sssMaxDist() {
|
|
64
|
+
return this._sssMaxDist;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The maximum distance that the screen-space shadow will be able to occlude.
|
|
68
|
+
*/
|
|
69
|
+
set sssMaxDist(value) {
|
|
70
|
+
this._sssMaxDist = value;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The thickness of the screen-space shadow
|
|
74
|
+
*/
|
|
75
|
+
get sssThickness() {
|
|
76
|
+
return this._sssThickness;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The thickness of the screen-space shadow
|
|
80
|
+
*/
|
|
81
|
+
set sssThickness(value) {
|
|
82
|
+
this._sssThickness = value;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The number of directions to sample for the voxel tracing.
|
|
86
|
+
*/
|
|
87
|
+
get sampleDirections() {
|
|
88
|
+
return this._sampleDirections;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The number of directions to sample for the voxel tracing.
|
|
92
|
+
*/
|
|
93
|
+
set sampleDirections(value) {
|
|
94
|
+
this._sampleDirections = value;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The current rotation of the environment map, in radians.
|
|
98
|
+
*/
|
|
99
|
+
get envRotation() {
|
|
100
|
+
return this._envRotation;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The current rotation of the environment map, in radians.
|
|
104
|
+
*/
|
|
105
|
+
set envRotation(value) {
|
|
106
|
+
this._envRotation = value;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Gets the pass post process
|
|
110
|
+
* @returns The post process
|
|
111
|
+
*/
|
|
112
|
+
getPassPP() {
|
|
113
|
+
return this._outputPP;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Gets the debug pass post process. This will create the resources for the pass
|
|
117
|
+
* if they don't already exist.
|
|
118
|
+
* @returns The post process
|
|
119
|
+
*/
|
|
120
|
+
getDebugPassPP() {
|
|
121
|
+
if (!this._debugPassPP) {
|
|
122
|
+
this._createDebugPass();
|
|
123
|
+
}
|
|
124
|
+
return this._debugPassPP;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The name of the debug pass
|
|
128
|
+
*/
|
|
129
|
+
get debugPassName() {
|
|
130
|
+
return this._debugPassName;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Set the matrix to use for scaling the world space to voxel space
|
|
134
|
+
* @param matrix The matrix to use for scaling the world space to voxel space
|
|
135
|
+
*/
|
|
136
|
+
setWorldScaleMatrix(matrix) {
|
|
137
|
+
this._invWorldScaleMatrix = matrix;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Sets params that control the position and scaling of the debug display on the screen.
|
|
141
|
+
* @param x Screen X offset of the debug display (0-1)
|
|
142
|
+
* @param y Screen Y offset of the debug display (0-1)
|
|
143
|
+
* @param widthScale X scale of the debug display (0-1)
|
|
144
|
+
* @param heightScale Y scale of the debug display (0-1)
|
|
145
|
+
*/
|
|
146
|
+
setDebugDisplayParams(x, y, widthScale, heightScale) {
|
|
147
|
+
this._debugSizeParams.set(x, y, widthScale, heightScale);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Creates the debug post process effect for this pass
|
|
151
|
+
*/
|
|
152
|
+
_createDebugPass() {
|
|
153
|
+
if (!this._debugPassPP) {
|
|
154
|
+
const debugOptions = {
|
|
155
|
+
width: this._engine.getRenderWidth(),
|
|
156
|
+
height: this._engine.getRenderHeight(),
|
|
157
|
+
uniforms: ["sizeParams"],
|
|
158
|
+
samplers: ["debugSampler"],
|
|
159
|
+
engine: this._engine,
|
|
160
|
+
reusable: false,
|
|
161
|
+
};
|
|
162
|
+
this._debugPassPP = new PostProcess(this.debugPassName, "iblShadowDebug", debugOptions);
|
|
163
|
+
this._debugPassPP.autoClear = false;
|
|
164
|
+
this._debugPassPP.onApplyObservable.add((effect) => {
|
|
165
|
+
// update the caustic texture with what we just rendered.
|
|
166
|
+
effect.setTextureFromPostProcessOutput("debugSampler", this._outputPP);
|
|
167
|
+
effect.setVector4("sizeParams", this._debugSizeParams);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Instantiates the shadow voxel-tracing pass
|
|
173
|
+
* @param scene Scene to attach to
|
|
174
|
+
* @param iblShadowsRenderPipeline The IBL shadows render pipeline
|
|
175
|
+
* @returns The shadow voxel-tracing pass
|
|
176
|
+
*/
|
|
177
|
+
constructor(scene, iblShadowsRenderPipeline) {
|
|
178
|
+
this._voxelShadowOpacity = 1.0;
|
|
179
|
+
this._sssSamples = 16;
|
|
180
|
+
this._sssStride = 8;
|
|
181
|
+
this._sssMaxDist = 0.05;
|
|
182
|
+
this._sssThickness = 0.01;
|
|
183
|
+
this._ssShadowOpacity = 1.0;
|
|
184
|
+
this._cameraInvView = Matrix.Identity();
|
|
185
|
+
this._cameraInvProj = Matrix.Identity();
|
|
186
|
+
this._invWorldScaleMatrix = Matrix.Identity();
|
|
187
|
+
this._frameId = 0;
|
|
188
|
+
this._sampleDirections = 4;
|
|
189
|
+
/** Enable the debug view for this pass */
|
|
190
|
+
this.debugEnabled = false;
|
|
191
|
+
this._debugPassName = "Voxel Tracing Debug Pass";
|
|
192
|
+
/** The default rotation of the environment map will align the shadows with the default lighting orientation */
|
|
193
|
+
this._envRotation = -Math.PI / 2.0;
|
|
194
|
+
this._downscale = 1.0;
|
|
195
|
+
this._debugVoxelMarchEnabled = true;
|
|
196
|
+
this._debugSizeParams = new Vector4(0.0, 0.0, 0.0, 0.0);
|
|
197
|
+
this._scene = scene;
|
|
198
|
+
this._engine = scene.getEngine();
|
|
199
|
+
this._renderPipeline = iblShadowsRenderPipeline;
|
|
200
|
+
this._createTextures();
|
|
201
|
+
}
|
|
202
|
+
_createTextures() {
|
|
203
|
+
let defines = "";
|
|
204
|
+
if (this._debugVoxelMarchEnabled) {
|
|
205
|
+
defines += "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
|
|
206
|
+
}
|
|
207
|
+
const ppOptions = {
|
|
208
|
+
width: this._engine.getRenderWidth(),
|
|
209
|
+
height: this._engine.getRenderHeight(),
|
|
210
|
+
textureFormat: 7,
|
|
211
|
+
textureType: 0,
|
|
212
|
+
samplingMode: 1,
|
|
213
|
+
uniforms: ["viewMtx", "projMtx", "invProjMtx", "invViewMtx", "wsNormalizationMtx", "shadowParameters", "offsetDataParameters", "sssParameters", "shadowOpacity"],
|
|
214
|
+
samplers: ["voxelGridSampler", "icdfySampler", "icdfxSampler", "blueNoiseSampler", "worldNormalSampler", "linearDepthSampler", "depthSampler", "worldPositionSampler"],
|
|
215
|
+
defines: defines,
|
|
216
|
+
engine: this._engine,
|
|
217
|
+
reusable: false,
|
|
218
|
+
};
|
|
219
|
+
this._outputPP = new PostProcess("voxelTracingPass", "iblShadowVoxelTracing", ppOptions);
|
|
220
|
+
this._outputPP.autoClear = false;
|
|
221
|
+
this._outputPP.onApplyObservable.add((effect) => {
|
|
222
|
+
this._updatePostProcess(effect, this._scene.activeCamera);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
_updatePostProcess(effect, camera) {
|
|
226
|
+
effect.setMatrix("viewMtx", camera.getViewMatrix());
|
|
227
|
+
effect.setMatrix("projMtx", camera.getProjectionMatrix());
|
|
228
|
+
camera.getProjectionMatrix().invertToRef(this._cameraInvProj);
|
|
229
|
+
camera.getViewMatrix().invertToRef(this._cameraInvView);
|
|
230
|
+
effect.setMatrix("invProjMtx", this._cameraInvProj);
|
|
231
|
+
effect.setMatrix("invViewMtx", this._cameraInvView);
|
|
232
|
+
effect.setMatrix("wsNormalizationMtx", this._invWorldScaleMatrix);
|
|
233
|
+
this._frameId++;
|
|
234
|
+
const downscaleSquared = this._downscale * this._downscale;
|
|
235
|
+
const rotation = this._scene.useRightHandedSystem ? this._envRotation : (this._envRotation + Math.PI) % (2.0 * Math.PI);
|
|
236
|
+
effect.setVector4("shadowParameters", new Vector4(this._sampleDirections, this._frameId / downscaleSquared, this._downscale, rotation));
|
|
237
|
+
const offset = new Vector2(0.0, 0.0);
|
|
238
|
+
const voxelGrid = this._renderPipeline.getVoxelGridTexture();
|
|
239
|
+
const highestMip = Math.floor(Math.log2(voxelGrid.getSize().width));
|
|
240
|
+
effect.setVector4("offsetDataParameters", new Vector4(offset.x, offset.y, highestMip, 0.0));
|
|
241
|
+
// SSS Options.
|
|
242
|
+
const worldScale = (1.0 / this._invWorldScaleMatrix.m[0]) * 2.0;
|
|
243
|
+
const maxDist = this._sssMaxDist * worldScale;
|
|
244
|
+
const thickness = this._sssThickness * worldScale;
|
|
245
|
+
effect.setVector4("sssParameters", new Vector4(this._sssSamples, this._sssStride, maxDist, thickness));
|
|
246
|
+
effect.setVector4("shadowOpacity", new Vector4(this._voxelShadowOpacity, this._ssShadowOpacity, 0.0, 0.0));
|
|
247
|
+
effect.setTexture("voxelGridSampler", voxelGrid);
|
|
248
|
+
effect.setTexture("blueNoiseSampler", this._renderPipeline._noiseTexture);
|
|
249
|
+
effect.setTexture("icdfySampler", this._renderPipeline.getIcdfyTexture());
|
|
250
|
+
effect.setTexture("icdfxSampler", this._renderPipeline.getIcdfxTexture());
|
|
251
|
+
if (this._debugVoxelMarchEnabled) {
|
|
252
|
+
effect.defines = "#define VOXEL_MARCH_DIAGNOSTIC_INFO_OPTION 1u\n";
|
|
253
|
+
}
|
|
254
|
+
const prePassRenderer = this._scene.prePassRenderer;
|
|
255
|
+
if (prePassRenderer) {
|
|
256
|
+
const wnormalIndex = prePassRenderer.getIndex(8);
|
|
257
|
+
const depthIndex = prePassRenderer.getIndex(5);
|
|
258
|
+
const clipDepthIndex = prePassRenderer.getIndex(10);
|
|
259
|
+
const wPositionIndex = prePassRenderer.getIndex(1);
|
|
260
|
+
if (wnormalIndex >= 0)
|
|
261
|
+
effect.setTexture("worldNormalSampler", prePassRenderer.getRenderTarget().textures[wnormalIndex]);
|
|
262
|
+
if (depthIndex >= 0)
|
|
263
|
+
effect.setTexture("linearDepthSampler", prePassRenderer.getRenderTarget().textures[depthIndex]);
|
|
264
|
+
if (clipDepthIndex >= 0)
|
|
265
|
+
effect.setTexture("depthSampler", prePassRenderer.getRenderTarget().textures[clipDepthIndex]);
|
|
266
|
+
if (wPositionIndex >= 0)
|
|
267
|
+
effect.setTexture("worldPositionSampler", prePassRenderer.getRenderTarget().textures[wPositionIndex]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Checks if the pass is ready
|
|
272
|
+
* @returns true if the pass is ready
|
|
273
|
+
*/
|
|
274
|
+
isReady() {
|
|
275
|
+
return (this._outputPP.isReady() &&
|
|
276
|
+
!(this._debugPassPP && !this._debugPassPP.isReady()) &&
|
|
277
|
+
this._renderPipeline.getIcdfyTexture().isReady() &&
|
|
278
|
+
this._renderPipeline.getIcdfxTexture().isReady() &&
|
|
279
|
+
this._renderPipeline.getVoxelGridTexture().isReady());
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Disposes the associated resources
|
|
283
|
+
*/
|
|
284
|
+
dispose() {
|
|
285
|
+
this._outputPP.dispose();
|
|
286
|
+
if (this._debugPassPP) {
|
|
287
|
+
this._debugPassPP.dispose();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=iblShadowsVoxelTracingPass.js.map
|
|
@@ -0,0 +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 = true;\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"]}
|