@babylonjs/core 7.48.3 → 7.49.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.
Files changed (33) hide show
  1. package/Animations/animatable.core.d.ts +1 -0
  2. package/Animations/animatable.core.js +3 -1
  3. package/Animations/animatable.core.js.map +1 -1
  4. package/Engines/WebGPU/webgpuCacheSampler.js +12 -3
  5. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  6. package/Engines/abstractEngine.js +2 -2
  7. package/Engines/abstractEngine.js.map +1 -1
  8. package/Inputs/scene.inputManager.js +4 -4
  9. package/Inputs/scene.inputManager.js.map +1 -1
  10. package/Meshes/Node/Blocks/Sources/pointListBlock.d.ts +35 -0
  11. package/Meshes/Node/Blocks/Sources/pointListBlock.js +76 -0
  12. package/Meshes/Node/Blocks/Sources/pointListBlock.js.map +1 -0
  13. package/Meshes/Node/Blocks/computeNormalsBlock.js +3 -0
  14. package/Meshes/Node/Blocks/computeNormalsBlock.js.map +1 -1
  15. package/Meshes/Node/index.d.ts +1 -0
  16. package/Meshes/Node/index.js +1 -0
  17. package/Meshes/Node/index.js.map +1 -1
  18. package/Meshes/abstractMesh.hotSpot.d.ts +4 -4
  19. package/Meshes/abstractMesh.hotSpot.js +7 -10
  20. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  21. package/Meshes/csg2.js +1 -1
  22. package/Meshes/csg2.js.map +1 -1
  23. package/Meshes/mesh.d.ts +5 -0
  24. package/Meshes/mesh.js +32 -20
  25. package/Meshes/mesh.js.map +1 -1
  26. package/Misc/snapshotRenderingHelper.d.ts +3 -1
  27. package/Misc/snapshotRenderingHelper.js +27 -5
  28. package/Misc/snapshotRenderingHelper.js.map +1 -1
  29. package/Rendering/GlobalIllumination/giRSMManager.js +2 -2
  30. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  31. package/ShadersWGSL/screenSpaceReflection2.fragment.js +1 -0
  32. package/ShadersWGSL/screenSpaceReflection2.fragment.js.map +1 -1
  33. package/package.json +1 -1
@@ -64,8 +64,10 @@ export declare class SnapshotRenderingHelper {
64
64
  /**
65
65
  * Call this method to update a mesh on the GPU after some properties have changed (position, rotation, scaling, visibility).
66
66
  * @param mesh The mesh to update. Can be a single mesh or an array of meshes to update.
67
+ * @param updateInstancedMeshes If true, the method will also update instanced meshes. Default is true. If you know instanced meshes won't move (or you don't have instanced meshes), you can set this to false to save some CPU time.
67
68
  */
68
- updateMesh(mesh: AbstractMesh | AbstractMesh[]): void;
69
+ updateMesh(mesh: AbstractMesh | AbstractMesh[], updateInstancedMeshes?: boolean): void;
70
+ private _updateInstancedMesh;
69
71
  /**
70
72
  * Update the meshes used in an effect layer to ensure that snapshot rendering works correctly for these meshes in this layer.
71
73
  * @param effectLayer The effect layer
@@ -36,8 +36,10 @@ export class SnapshotRenderingHelper {
36
36
  this._onResizeObserver = this._engine.onResizeObservable.add(() => {
37
37
  this._log("onResize", "start");
38
38
  // enableSnapshotRendering() will delay the actual enabling of snapshot rendering by at least a frame, so these two lines are not redundant!
39
- this.disableSnapshotRendering();
40
- this.enableSnapshotRendering();
39
+ if (this._fastSnapshotRenderingEnabled) {
40
+ this.disableSnapshotRendering();
41
+ this.enableSnapshotRendering();
42
+ }
41
43
  this._log("onResize", "end");
42
44
  });
43
45
  this._scene.onBeforeRenderObservable.add(() => {
@@ -180,18 +182,38 @@ export class SnapshotRenderingHelper {
180
182
  /**
181
183
  * Call this method to update a mesh on the GPU after some properties have changed (position, rotation, scaling, visibility).
182
184
  * @param mesh The mesh to update. Can be a single mesh or an array of meshes to update.
185
+ * @param updateInstancedMeshes If true, the method will also update instanced meshes. Default is true. If you know instanced meshes won't move (or you don't have instanced meshes), you can set this to false to save some CPU time.
183
186
  */
184
- updateMesh(mesh) {
187
+ updateMesh(mesh, updateInstancedMeshes = true) {
185
188
  if (!this._fastSnapshotRenderingEnabled) {
186
189
  return;
187
190
  }
188
191
  if (Array.isArray(mesh)) {
189
192
  for (const m of mesh) {
190
- m.transferToEffect(m.computeWorldMatrix(true));
193
+ if (!updateInstancedMeshes || !this._updateInstancedMesh(m)) {
194
+ m.transferToEffect(m.computeWorldMatrix());
195
+ }
191
196
  }
192
197
  return;
193
198
  }
194
- mesh.transferToEffect(mesh.computeWorldMatrix(true));
199
+ if (!updateInstancedMeshes || !this._updateInstancedMesh(mesh)) {
200
+ mesh.transferToEffect(mesh.computeWorldMatrix());
201
+ }
202
+ }
203
+ _updateInstancedMesh(mesh) {
204
+ if (mesh.hasInstances) {
205
+ if (mesh.subMeshes) {
206
+ const sourceMesh = mesh;
207
+ for (const subMesh of sourceMesh.subMeshes) {
208
+ sourceMesh._updateInstancedBuffers(subMesh, sourceMesh._getInstancesRenderList(subMesh._id), sourceMesh._instanceDataStorage.instancesBufferSize, this._engine);
209
+ }
210
+ }
211
+ return true;
212
+ }
213
+ else if (mesh.isAnInstance) {
214
+ return true;
215
+ }
216
+ return false;
195
217
  }
196
218
  /**
197
219
  * Update the meshes used in an effect layer to ensure that snapshot rendering works correctly for these meshes in this layer.
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotRenderingHelper.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/snapshotRenderingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n AbstractEngine,\r\n AbstractMesh,\r\n EffectLayer,\r\n Mesh,\r\n Nullable,\r\n Observer,\r\n Scene,\r\n WebGPUDrawContext,\r\n WebGPUShaderProcessor,\r\n WebGPUPipelineContext,\r\n GaussianSplattingMesh,\r\n // eslint-disable-next-line import/no-internal-modules\r\n} from \"core/index\";\r\n\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { BindMorphTargetParameters } from \"core/Materials/materialHelper.functions\";\r\nimport { ScenePerformancePriority } from \"core/scene\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Options for the snapshot rendering helper\r\n */\r\nexport interface SnapshotRenderingHelpersOptions {\r\n /**\r\n * Maximum number of influences for morph target managers\r\n * In FAST snapshot mode, the number of influences must be fixed and cannot change from one frame to the next.\r\n * morphTargetsNumMaxInfluences is the maximum number of non-zero influences allowed in a morph target manager.\r\n * The final value defined for a morph target manager is: Math.min(morphTargetManager.numTargets, morphTargetsNumMaxInfluences)\r\n * Default: 20\r\n */\r\n morphTargetsNumMaxInfluences?: number;\r\n}\r\n\r\n/**\r\n * A helper class to simplify work with FAST snapshot mode (WebGPU only - can be used in WebGL too, but won't do anything).\r\n */\r\nexport class SnapshotRenderingHelper {\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _options: SnapshotRenderingHelpersOptions;\r\n private readonly _onBeforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _onBeforeRenderObserverUpdateLayer: Nullable<Observer<Scene>>;\r\n private readonly _onResizeObserver: Nullable<Observer<AbstractEngine>>;\r\n private _disableRenderingRefCount = 0;\r\n private _currentPerformancePriorityMode = ScenePerformancePriority.BackwardCompatible;\r\n private _pendingCurrentPerformancePriorityMode?: ScenePerformancePriority;\r\n private _isEnabling = false;\r\n private _enableCancelFunctions: Map<() => void, () => void> = new Map(); // first function is the callback, second function is the cancel function\r\n private _disableCancelFunctions: Map<() => void, () => void> = new Map(); // same as above\r\n\r\n /**\r\n * Indicates if debug logs should be displayed\r\n */\r\n public showDebugLogs = false;\r\n\r\n /**\r\n * Creates a new snapshot rendering helper\r\n * Note that creating an instance of the helper will set the snapshot rendering mode to SNAPSHOTRENDERING_FAST but will not enable snapshot rendering (engine.snapshotRendering is not updated).\r\n * Note also that fixMeshes() is called as part of the construction\r\n * @param scene The scene to use the helper in\r\n * @param options The options for the helper\r\n */\r\n constructor(scene: Scene, options?: SnapshotRenderingHelpersOptions) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._options = {\r\n morphTargetsNumMaxInfluences: 20,\r\n ...options,\r\n };\r\n\r\n this._engine.snapshotRenderingMode = Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n this.fixMeshes();\r\n\r\n this._onResizeObserver = this._engine.onResizeObservable.add(() => {\r\n this._log(\"onResize\", \"start\");\r\n\r\n // enableSnapshotRendering() will delay the actual enabling of snapshot rendering by at least a frame, so these two lines are not redundant!\r\n this.disableSnapshotRendering();\r\n this.enableSnapshotRendering();\r\n\r\n this._log(\"onResize\", \"end\");\r\n });\r\n\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n // Animate skeletons\r\n scene.skeletons.forEach((skeleton) => skeleton.prepare(true));\r\n\r\n for (const mesh of scene.meshes) {\r\n if (mesh.infiniteDistance) {\r\n mesh.transferToEffect(mesh.computeWorldMatrix(true));\r\n }\r\n\r\n if (mesh.skeleton) {\r\n mesh.transferToEffect(mesh.computeWorldMatrix(true));\r\n }\r\n\r\n if (mesh.getClassName() === \"GaussianSplattingMesh\") {\r\n (mesh as GaussianSplattingMesh)._postToWorker();\r\n }\r\n\r\n if (mesh.morphTargetManager && mesh.subMeshes) {\r\n // Make sure morph target animations work\r\n for (const subMesh of mesh.subMeshes) {\r\n const dw = subMesh._drawWrapper;\r\n const effect = dw.effect;\r\n if (effect) {\r\n const dataBuffer = (dw.drawContext as WebGPUDrawContext).buffers[\"LeftOver\" satisfies (typeof WebGPUShaderProcessor)[\"LeftOvertUBOName\"]];\r\n const ubLeftOver = (effect._pipelineContext as WebGPUPipelineContext)?.uniformBuffer;\r\n if (dataBuffer && ubLeftOver && ubLeftOver.setDataBuffer(dataBuffer)) {\r\n mesh.morphTargetManager._bind(effect);\r\n BindMorphTargetParameters(mesh, effect);\r\n ubLeftOver.update();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets a value indicating if the helper is in a steady state (not in the process of enabling snapshot rendering).\r\n */\r\n public get isReady() {\r\n return !this._isEnabling;\r\n }\r\n\r\n /**\r\n * Enable snapshot rendering\r\n * Use this method instead of engine.snapshotRendering=true, to make sure everything is ready before enabling snapshot rendering.\r\n * Note that this method is ref-counted and works in pair with disableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().\r\n */\r\n public enableSnapshotRendering() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n if (--this._disableRenderingRefCount > 0) {\r\n return;\r\n }\r\n\r\n this._log(\"enableSnapshotRendering\", \"called\");\r\n if (this._disableCancelFunctions.size > 0) {\r\n this._log(\"enableSnapshotRendering\", `cancelling ${this._disableCancelFunctions.size} \"disable\" callbacks`);\r\n }\r\n\r\n this._disableCancelFunctions.forEach((cancel) => cancel());\r\n this._disableCancelFunctions.clear();\r\n\r\n this._isEnabling = true;\r\n this._disableRenderingRefCount = 0;\r\n\r\n this._currentPerformancePriorityMode = this._pendingCurrentPerformancePriorityMode ?? this._scene.performancePriority;\r\n this._pendingCurrentPerformancePriorityMode = undefined;\r\n this._scene.performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n\r\n const callbackWhenSceneReady = () => {\r\n this._enableCancelFunctions.delete(callbackWhenSceneReady);\r\n\r\n // Make sure a full frame is rendered before enabling snapshot rendering, so use \"+2\" instead of \"+1\"\r\n const targetFrameId = this._engine.frameId + 2;\r\n\r\n this._log(\"enableSnapshotRendering\", `scene ready, add callbacks for frames ${targetFrameId} and ${targetFrameId + 1}`);\r\n\r\n this._executeAtFrame(targetFrameId, () => {\r\n this._log(\"enableSnapshotRendering\", `callback #1, enable snapshot rendering at the engine level`);\r\n this._engine.snapshotRendering = true;\r\n });\r\n\r\n // Render one frame with snapshot rendering enabled to make sure everything is ready\r\n this._executeAtFrame(targetFrameId + 1, () => {\r\n this._log(\"enableSnapshotRendering\", `callback #2, signals that snapshot rendering helper is ready`);\r\n this._isEnabling = false;\r\n });\r\n };\r\n\r\n this._enableCancelFunctions.set(callbackWhenSceneReady, () => this._scene.onReadyObservable.removeCallback(callbackWhenSceneReady));\r\n\r\n this._scene.executeWhenReady(callbackWhenSceneReady);\r\n }\r\n\r\n /**\r\n * Disable snapshot rendering\r\n * Note that this method is ref-counted and works in pair with disableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().\r\n */\r\n public disableSnapshotRendering() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._log(\"disableSnapshotRendering\", \"called\");\r\n\r\n if (this._disableRenderingRefCount === 0) {\r\n if (this._enableCancelFunctions.size > 0) {\r\n this._log(\"disableSnapshotRendering\", `cancelling ${this._enableCancelFunctions.size} \"enable\" callbacks`);\r\n }\r\n\r\n this._enableCancelFunctions.forEach((cancel) => cancel());\r\n this._enableCancelFunctions.clear();\r\n\r\n this._isEnabling = false;\r\n\r\n // Snapshot rendering switches from enabled to disabled\r\n // We reset the performance priority mode to that which it was before enabling snapshot rendering, but first set it to “BackwardCompatible” to allow the system to regenerate resources that may have been optimized for snapshot rendering.\r\n // We'll then restore the original mode at the next frame.\r\n this._scene.performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n if (this._currentPerformancePriorityMode !== ScenePerformancePriority.BackwardCompatible) {\r\n this._log(\r\n \"disableSnapshotRendering\",\r\n `makes sure that the scene is rendered once in BackwardCompatible mode (code: ${ScenePerformancePriority.BackwardCompatible}) before switching to mode ${this._currentPerformancePriorityMode}`\r\n );\r\n\r\n this._pendingCurrentPerformancePriorityMode = this._currentPerformancePriorityMode;\r\n\r\n const callbackWhenSceneReady = () => {\r\n this._log(\"disableSnapshotRendering\", `scene ready, add callback for frame ${this._engine.frameId + 2}`);\r\n\r\n this._executeAtFrame(\r\n this._engine.frameId + 2,\r\n () => {\r\n this._log(\"disableSnapshotRendering\", `switching to performance priority mode ${this._pendingCurrentPerformancePriorityMode}`);\r\n this._scene.performancePriority = this._pendingCurrentPerformancePriorityMode!;\r\n this._pendingCurrentPerformancePriorityMode = undefined;\r\n },\r\n \"whenDisabled\"\r\n );\r\n };\r\n\r\n this._disableCancelFunctions.set(callbackWhenSceneReady, () => this._scene.onReadyObservable.removeCallback(callbackWhenSceneReady));\r\n\r\n this._scene.executeWhenReady(callbackWhenSceneReady);\r\n }\r\n }\r\n\r\n this._engine.snapshotRendering = false;\r\n this._disableRenderingRefCount++;\r\n }\r\n\r\n /**\r\n * Fix meshes for snapshot rendering.\r\n * This method will make sure that some features are disabled or fixed to make sure snapshot rendering works correctly.\r\n * @param meshes List of meshes to fix. If not provided, all meshes in the scene will be fixed.\r\n */\r\n public fixMeshes(meshes?: AbstractMesh[]) {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n meshes = meshes || this._scene.meshes;\r\n\r\n for (const mesh of meshes) {\r\n (mesh as Mesh).ignoreCameraMaxZ = false;\r\n if (mesh.morphTargetManager) {\r\n mesh.morphTargetManager.numMaxInfluencers = Math.min(mesh.morphTargetManager.numTargets, this._options.morphTargetsNumMaxInfluences!);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Call this method to update a mesh on the GPU after some properties have changed (position, rotation, scaling, visibility).\r\n * @param mesh The mesh to update. Can be a single mesh or an array of meshes to update.\r\n */\r\n public updateMesh(mesh: AbstractMesh | AbstractMesh[]) {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n m.transferToEffect(m.computeWorldMatrix(true));\r\n }\r\n return;\r\n }\r\n\r\n mesh.transferToEffect(mesh.computeWorldMatrix(true));\r\n }\r\n\r\n /**\r\n * Update the meshes used in an effect layer to ensure that snapshot rendering works correctly for these meshes in this layer.\r\n * @param effectLayer The effect layer\r\n * @param autoUpdate If true, the helper will automatically update the effect layer meshes with each frame. If false, you'll need to call this method manually when the camera or layer meshes move or rotate.\r\n */\r\n public updateMeshesForEffectLayer(effectLayer: EffectLayer, autoUpdate = true) {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n const renderPassId = effectLayer.mainTexture.renderPassId;\r\n\r\n if (autoUpdate) {\r\n this._onBeforeRenderObserverUpdateLayer = this._scene.onBeforeRenderObservable.add(() => {\r\n this._updateMeshMatricesForRenderPassId(renderPassId);\r\n });\r\n } else {\r\n this._updateMeshMatricesForRenderPassId(renderPassId);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the helper\r\n */\r\n public dispose() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserverUpdateLayer);\r\n this._engine.onResizeObservable.remove(this._onResizeObserver);\r\n }\r\n\r\n private get _fastSnapshotRenderingEnabled() {\r\n return this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n }\r\n\r\n private _updateMeshMatricesForRenderPassId(renderPassId: number) {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n const sceneTransformationMatrix = this._scene.getTransformMatrix();\r\n\r\n for (let i = 0; i < this._scene.meshes.length; ++i) {\r\n const mesh = this._scene.meshes[i];\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n for (let j = 0; j < mesh.subMeshes.length; ++j) {\r\n const dw = mesh.subMeshes[j]._getDrawWrapper(renderPassId);\r\n const effect = dw?.effect;\r\n if (effect) {\r\n const dataBuffer = (dw.drawContext as WebGPUDrawContext).buffers[\"LeftOver\" satisfies (typeof WebGPUShaderProcessor)[\"LeftOvertUBOName\"]];\r\n const ubLeftOver = (effect._pipelineContext as WebGPUPipelineContext)?.uniformBuffer;\r\n if (dataBuffer && ubLeftOver && ubLeftOver.setDataBuffer(dataBuffer)) {\r\n effect.setMatrix(\"viewProjection\", sceneTransformationMatrix);\r\n effect.setMatrix(\"world\", mesh.computeWorldMatrix());\r\n ubLeftOver.update();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _executeAtFrame(frameId: number, func: () => void, mode: \"whenEnabled\" | \"whenDisabled\" = \"whenEnabled\") {\r\n const callback = () => {\r\n if (this._engine.frameId >= frameId) {\r\n this._engine.onEndFrameObservable.remove(obs);\r\n if (mode === \"whenEnabled\") {\r\n this._enableCancelFunctions.delete(callback);\r\n } else {\r\n this._disableCancelFunctions.delete(callback);\r\n }\r\n func();\r\n }\r\n };\r\n\r\n const obs = this._engine.onEndFrameObservable.add(callback);\r\n if (mode === \"whenEnabled\") {\r\n this._enableCancelFunctions.set(callback, () => this._engine.onEndFrameObservable.remove(obs));\r\n } else {\r\n this._disableCancelFunctions.set(callback, () => this._engine.onEndFrameObservable.remove(obs));\r\n }\r\n }\r\n\r\n private _log(funcName: string, message: string) {\r\n if (this.showDebugLogs) {\r\n Logger.Log(`[Frame: ${this._engine.frameId}] SnapshotRenderingHelper:${funcName} - ${message}`);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"snapshotRenderingHelper.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/snapshotRenderingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n AbstractEngine,\r\n AbstractMesh,\r\n EffectLayer,\r\n Mesh,\r\n Nullable,\r\n Observer,\r\n Scene,\r\n WebGPUDrawContext,\r\n WebGPUShaderProcessor,\r\n WebGPUPipelineContext,\r\n GaussianSplattingMesh,\r\n // eslint-disable-next-line import/no-internal-modules\r\n} from \"core/index\";\r\n\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { BindMorphTargetParameters } from \"core/Materials/materialHelper.functions\";\r\nimport { ScenePerformancePriority } from \"core/scene\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Options for the snapshot rendering helper\r\n */\r\nexport interface SnapshotRenderingHelpersOptions {\r\n /**\r\n * Maximum number of influences for morph target managers\r\n * In FAST snapshot mode, the number of influences must be fixed and cannot change from one frame to the next.\r\n * morphTargetsNumMaxInfluences is the maximum number of non-zero influences allowed in a morph target manager.\r\n * The final value defined for a morph target manager is: Math.min(morphTargetManager.numTargets, morphTargetsNumMaxInfluences)\r\n * Default: 20\r\n */\r\n morphTargetsNumMaxInfluences?: number;\r\n}\r\n\r\n/**\r\n * A helper class to simplify work with FAST snapshot mode (WebGPU only - can be used in WebGL too, but won't do anything).\r\n */\r\nexport class SnapshotRenderingHelper {\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _options: SnapshotRenderingHelpersOptions;\r\n private readonly _onBeforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _onBeforeRenderObserverUpdateLayer: Nullable<Observer<Scene>>;\r\n private readonly _onResizeObserver: Nullable<Observer<AbstractEngine>>;\r\n private _disableRenderingRefCount = 0;\r\n private _currentPerformancePriorityMode = ScenePerformancePriority.BackwardCompatible;\r\n private _pendingCurrentPerformancePriorityMode?: ScenePerformancePriority;\r\n private _isEnabling = false;\r\n private _enableCancelFunctions: Map<() => void, () => void> = new Map(); // first function is the callback, second function is the cancel function\r\n private _disableCancelFunctions: Map<() => void, () => void> = new Map(); // same as above\r\n\r\n /**\r\n * Indicates if debug logs should be displayed\r\n */\r\n public showDebugLogs = false;\r\n\r\n /**\r\n * Creates a new snapshot rendering helper\r\n * Note that creating an instance of the helper will set the snapshot rendering mode to SNAPSHOTRENDERING_FAST but will not enable snapshot rendering (engine.snapshotRendering is not updated).\r\n * Note also that fixMeshes() is called as part of the construction\r\n * @param scene The scene to use the helper in\r\n * @param options The options for the helper\r\n */\r\n constructor(scene: Scene, options?: SnapshotRenderingHelpersOptions) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._options = {\r\n morphTargetsNumMaxInfluences: 20,\r\n ...options,\r\n };\r\n\r\n this._engine.snapshotRenderingMode = Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n this.fixMeshes();\r\n\r\n this._onResizeObserver = this._engine.onResizeObservable.add(() => {\r\n this._log(\"onResize\", \"start\");\r\n\r\n // enableSnapshotRendering() will delay the actual enabling of snapshot rendering by at least a frame, so these two lines are not redundant!\r\n if (this._fastSnapshotRenderingEnabled) {\r\n this.disableSnapshotRendering();\r\n this.enableSnapshotRendering();\r\n }\r\n\r\n this._log(\"onResize\", \"end\");\r\n });\r\n\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n // Animate skeletons\r\n scene.skeletons.forEach((skeleton) => skeleton.prepare(true));\r\n\r\n for (const mesh of scene.meshes) {\r\n if (mesh.infiniteDistance) {\r\n mesh.transferToEffect(mesh.computeWorldMatrix(true));\r\n }\r\n\r\n if (mesh.skeleton) {\r\n mesh.transferToEffect(mesh.computeWorldMatrix(true));\r\n }\r\n\r\n if (mesh.getClassName() === \"GaussianSplattingMesh\") {\r\n (mesh as GaussianSplattingMesh)._postToWorker();\r\n }\r\n\r\n if (mesh.morphTargetManager && mesh.subMeshes) {\r\n // Make sure morph target animations work\r\n for (const subMesh of mesh.subMeshes) {\r\n const dw = subMesh._drawWrapper;\r\n const effect = dw.effect;\r\n if (effect) {\r\n const dataBuffer = (dw.drawContext as WebGPUDrawContext).buffers[\"LeftOver\" satisfies (typeof WebGPUShaderProcessor)[\"LeftOvertUBOName\"]];\r\n const ubLeftOver = (effect._pipelineContext as WebGPUPipelineContext)?.uniformBuffer;\r\n if (dataBuffer && ubLeftOver && ubLeftOver.setDataBuffer(dataBuffer)) {\r\n mesh.morphTargetManager._bind(effect);\r\n BindMorphTargetParameters(mesh, effect);\r\n ubLeftOver.update();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets a value indicating if the helper is in a steady state (not in the process of enabling snapshot rendering).\r\n */\r\n public get isReady() {\r\n return !this._isEnabling;\r\n }\r\n\r\n /**\r\n * Enable snapshot rendering\r\n * Use this method instead of engine.snapshotRendering=true, to make sure everything is ready before enabling snapshot rendering.\r\n * Note that this method is ref-counted and works in pair with disableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().\r\n */\r\n public enableSnapshotRendering() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n if (--this._disableRenderingRefCount > 0) {\r\n return;\r\n }\r\n\r\n this._log(\"enableSnapshotRendering\", \"called\");\r\n if (this._disableCancelFunctions.size > 0) {\r\n this._log(\"enableSnapshotRendering\", `cancelling ${this._disableCancelFunctions.size} \"disable\" callbacks`);\r\n }\r\n\r\n this._disableCancelFunctions.forEach((cancel) => cancel());\r\n this._disableCancelFunctions.clear();\r\n\r\n this._isEnabling = true;\r\n this._disableRenderingRefCount = 0;\r\n\r\n this._currentPerformancePriorityMode = this._pendingCurrentPerformancePriorityMode ?? this._scene.performancePriority;\r\n this._pendingCurrentPerformancePriorityMode = undefined;\r\n this._scene.performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n\r\n const callbackWhenSceneReady = () => {\r\n this._enableCancelFunctions.delete(callbackWhenSceneReady);\r\n\r\n // Make sure a full frame is rendered before enabling snapshot rendering, so use \"+2\" instead of \"+1\"\r\n const targetFrameId = this._engine.frameId + 2;\r\n\r\n this._log(\"enableSnapshotRendering\", `scene ready, add callbacks for frames ${targetFrameId} and ${targetFrameId + 1}`);\r\n\r\n this._executeAtFrame(targetFrameId, () => {\r\n this._log(\"enableSnapshotRendering\", `callback #1, enable snapshot rendering at the engine level`);\r\n this._engine.snapshotRendering = true;\r\n });\r\n\r\n // Render one frame with snapshot rendering enabled to make sure everything is ready\r\n this._executeAtFrame(targetFrameId + 1, () => {\r\n this._log(\"enableSnapshotRendering\", `callback #2, signals that snapshot rendering helper is ready`);\r\n this._isEnabling = false;\r\n });\r\n };\r\n\r\n this._enableCancelFunctions.set(callbackWhenSceneReady, () => this._scene.onReadyObservable.removeCallback(callbackWhenSceneReady));\r\n\r\n this._scene.executeWhenReady(callbackWhenSceneReady);\r\n }\r\n\r\n /**\r\n * Disable snapshot rendering\r\n * Note that this method is ref-counted and works in pair with disableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().\r\n */\r\n public disableSnapshotRendering() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._log(\"disableSnapshotRendering\", \"called\");\r\n\r\n if (this._disableRenderingRefCount === 0) {\r\n if (this._enableCancelFunctions.size > 0) {\r\n this._log(\"disableSnapshotRendering\", `cancelling ${this._enableCancelFunctions.size} \"enable\" callbacks`);\r\n }\r\n\r\n this._enableCancelFunctions.forEach((cancel) => cancel());\r\n this._enableCancelFunctions.clear();\r\n\r\n this._isEnabling = false;\r\n\r\n // Snapshot rendering switches from enabled to disabled\r\n // We reset the performance priority mode to that which it was before enabling snapshot rendering, but first set it to “BackwardCompatible” to allow the system to regenerate resources that may have been optimized for snapshot rendering.\r\n // We'll then restore the original mode at the next frame.\r\n this._scene.performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n if (this._currentPerformancePriorityMode !== ScenePerformancePriority.BackwardCompatible) {\r\n this._log(\r\n \"disableSnapshotRendering\",\r\n `makes sure that the scene is rendered once in BackwardCompatible mode (code: ${ScenePerformancePriority.BackwardCompatible}) before switching to mode ${this._currentPerformancePriorityMode}`\r\n );\r\n\r\n this._pendingCurrentPerformancePriorityMode = this._currentPerformancePriorityMode;\r\n\r\n const callbackWhenSceneReady = () => {\r\n this._log(\"disableSnapshotRendering\", `scene ready, add callback for frame ${this._engine.frameId + 2}`);\r\n\r\n this._executeAtFrame(\r\n this._engine.frameId + 2,\r\n () => {\r\n this._log(\"disableSnapshotRendering\", `switching to performance priority mode ${this._pendingCurrentPerformancePriorityMode}`);\r\n this._scene.performancePriority = this._pendingCurrentPerformancePriorityMode!;\r\n this._pendingCurrentPerformancePriorityMode = undefined;\r\n },\r\n \"whenDisabled\"\r\n );\r\n };\r\n\r\n this._disableCancelFunctions.set(callbackWhenSceneReady, () => this._scene.onReadyObservable.removeCallback(callbackWhenSceneReady));\r\n\r\n this._scene.executeWhenReady(callbackWhenSceneReady);\r\n }\r\n }\r\n\r\n this._engine.snapshotRendering = false;\r\n this._disableRenderingRefCount++;\r\n }\r\n\r\n /**\r\n * Fix meshes for snapshot rendering.\r\n * This method will make sure that some features are disabled or fixed to make sure snapshot rendering works correctly.\r\n * @param meshes List of meshes to fix. If not provided, all meshes in the scene will be fixed.\r\n */\r\n public fixMeshes(meshes?: AbstractMesh[]) {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n meshes = meshes || this._scene.meshes;\r\n\r\n for (const mesh of meshes) {\r\n (mesh as Mesh).ignoreCameraMaxZ = false;\r\n if (mesh.morphTargetManager) {\r\n mesh.morphTargetManager.numMaxInfluencers = Math.min(mesh.morphTargetManager.numTargets, this._options.morphTargetsNumMaxInfluences!);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Call this method to update a mesh on the GPU after some properties have changed (position, rotation, scaling, visibility).\r\n * @param mesh The mesh to update. Can be a single mesh or an array of meshes to update.\r\n * @param updateInstancedMeshes If true, the method will also update instanced meshes. Default is true. If you know instanced meshes won't move (or you don't have instanced meshes), you can set this to false to save some CPU time.\r\n */\r\n public updateMesh(mesh: AbstractMesh | AbstractMesh[], updateInstancedMeshes = true) {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(mesh)) {\r\n for (const m of mesh) {\r\n if (!updateInstancedMeshes || !this._updateInstancedMesh(m)) {\r\n m.transferToEffect(m.computeWorldMatrix());\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!updateInstancedMeshes || !this._updateInstancedMesh(mesh)) {\r\n mesh.transferToEffect(mesh.computeWorldMatrix());\r\n }\r\n }\r\n\r\n private _updateInstancedMesh(mesh: AbstractMesh) {\r\n if (mesh.hasInstances) {\r\n if (mesh.subMeshes) {\r\n const sourceMesh = mesh as Mesh;\r\n for (const subMesh of sourceMesh.subMeshes) {\r\n sourceMesh._updateInstancedBuffers(subMesh, sourceMesh._getInstancesRenderList(subMesh._id), sourceMesh._instanceDataStorage.instancesBufferSize, this._engine);\r\n }\r\n }\r\n return true;\r\n } else if (mesh.isAnInstance) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Update the meshes used in an effect layer to ensure that snapshot rendering works correctly for these meshes in this layer.\r\n * @param effectLayer The effect layer\r\n * @param autoUpdate If true, the helper will automatically update the effect layer meshes with each frame. If false, you'll need to call this method manually when the camera or layer meshes move or rotate.\r\n */\r\n public updateMeshesForEffectLayer(effectLayer: EffectLayer, autoUpdate = true) {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n const renderPassId = effectLayer.mainTexture.renderPassId;\r\n\r\n if (autoUpdate) {\r\n this._onBeforeRenderObserverUpdateLayer = this._scene.onBeforeRenderObservable.add(() => {\r\n this._updateMeshMatricesForRenderPassId(renderPassId);\r\n });\r\n } else {\r\n this._updateMeshMatricesForRenderPassId(renderPassId);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the helper\r\n */\r\n public dispose() {\r\n if (!this._engine.isWebGPU) {\r\n return;\r\n }\r\n\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserverUpdateLayer);\r\n this._engine.onResizeObservable.remove(this._onResizeObserver);\r\n }\r\n\r\n private get _fastSnapshotRenderingEnabled() {\r\n return this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n }\r\n\r\n private _updateMeshMatricesForRenderPassId(renderPassId: number) {\r\n if (!this._fastSnapshotRenderingEnabled) {\r\n return;\r\n }\r\n\r\n const sceneTransformationMatrix = this._scene.getTransformMatrix();\r\n\r\n for (let i = 0; i < this._scene.meshes.length; ++i) {\r\n const mesh = this._scene.meshes[i];\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n for (let j = 0; j < mesh.subMeshes.length; ++j) {\r\n const dw = mesh.subMeshes[j]._getDrawWrapper(renderPassId);\r\n const effect = dw?.effect;\r\n if (effect) {\r\n const dataBuffer = (dw.drawContext as WebGPUDrawContext).buffers[\"LeftOver\" satisfies (typeof WebGPUShaderProcessor)[\"LeftOvertUBOName\"]];\r\n const ubLeftOver = (effect._pipelineContext as WebGPUPipelineContext)?.uniformBuffer;\r\n if (dataBuffer && ubLeftOver && ubLeftOver.setDataBuffer(dataBuffer)) {\r\n effect.setMatrix(\"viewProjection\", sceneTransformationMatrix);\r\n effect.setMatrix(\"world\", mesh.computeWorldMatrix());\r\n ubLeftOver.update();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _executeAtFrame(frameId: number, func: () => void, mode: \"whenEnabled\" | \"whenDisabled\" = \"whenEnabled\") {\r\n const callback = () => {\r\n if (this._engine.frameId >= frameId) {\r\n this._engine.onEndFrameObservable.remove(obs);\r\n if (mode === \"whenEnabled\") {\r\n this._enableCancelFunctions.delete(callback);\r\n } else {\r\n this._disableCancelFunctions.delete(callback);\r\n }\r\n func();\r\n }\r\n };\r\n\r\n const obs = this._engine.onEndFrameObservable.add(callback);\r\n if (mode === \"whenEnabled\") {\r\n this._enableCancelFunctions.set(callback, () => this._engine.onEndFrameObservable.remove(obs));\r\n } else {\r\n this._disableCancelFunctions.set(callback, () => this._engine.onEndFrameObservable.remove(obs));\r\n }\r\n }\r\n\r\n private _log(funcName: string, message: string) {\r\n if (this.showDebugLogs) {\r\n Logger.Log(`[Frame: ${this._engine.frameId}] SnapshotRenderingHelper:${funcName} - ${message}`);\r\n }\r\n }\r\n}\r\n"]}
@@ -342,8 +342,8 @@ export class GIRSMManager {
342
342
  this._drawPhaseObserver = this._scene.onBeforeDrawPhaseObservable.add(() => {
343
343
  const currentRenderTarget = this._engine._currentRenderTarget;
344
344
  let rebindCurrentRenderTarget = false;
345
- if (this._enable) {
346
- if (!this.pause) {
345
+ if (this._enable && this._shadersLoaded) {
346
+ if (!this.pause && this._ppGlobalIllumination.length > 0) {
347
347
  this._scene.postProcessManager.directRender(this._ppGlobalIllumination, this._ppGlobalIllumination[0].inputTexture);
348
348
  this._engine.unBindFramebuffer(this._ppGlobalIllumination[0].inputTexture, true);
349
349
  this._engine.setAlphaMode(0);
@@ -1 +1 @@
1
- {"version":3,"file":"giRSMManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger\r\n * Further explanations and implementations can be found in:\r\n * - Jaker video explaining RSM and its implementation: https://www.youtube.com/watch?v=LJQQdBsOYPM\r\n * - C++ implementation by Luis Angel: https://github.com/imyoungmin/RSM\r\n * - Javascript implementation by Erkaman: https://github.com/Erkaman/webgl-rsm\r\n */\r\nimport type { Scene } from \"core/scene\";\r\nimport type { GIRSM } from \"./giRSM\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { GeometryBufferRenderer } from \"../geometryBufferRenderer\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Class used to manage the global illumination contribution calculated from reflective shadow maps (RSM).\r\n */\r\nexport class GIRSMManager {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _giRSM: GIRSM[] = [];\r\n private _materialsWithRenderPlugin: Material[];\r\n private _sampleTexture: RawTexture;\r\n private _maxSamples: number;\r\n private _blurRTT: Nullable<RenderTargetTexture> = null;\r\n private _blurPostProcesses: Nullable<PostProcess[]> = null;\r\n private _blurXPostprocess: Nullable<PostProcess> = null;\r\n private _blurYPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingXPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingYPostprocess: Nullable<PostProcess> = null;\r\n private _ppGlobalIllumination: PostProcess[] = [];\r\n private _drawPhaseObserver: Observer<Scene>;\r\n private _debugLayer: Layer;\r\n private _counters: Array<{ name: string; value: number }>;\r\n private _countersRTW: Array<RenderTargetWrapper[]>;\r\n private _firstActivation = true;\r\n private _geomBufferEnabled = false;\r\n private _geomBufferEnablePosition = false;\r\n private _tempMatrix = new Matrix();\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Defines the default texture types and formats used by the geometry buffer renderer.\r\n */\r\n public static GeometryBufferTextureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 0: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_R }, // depth\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 1: { textureType: Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // normal\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 2: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // position\r\n };\r\n\r\n /**\r\n * Enables or disables the manager. Default is false.\r\n * If disabled, the global illumination won't be calculated and the scene will be rendered normally, without any global illumination contribution.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(enable: boolean) {\r\n if (this._giRSM.length === 0) {\r\n enable = false;\r\n }\r\n\r\n if (enable === this._enable) {\r\n return;\r\n }\r\n\r\n this._enable = enable;\r\n this._debugLayer.isEnabled = this._showOnlyGI && enable;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(GIRSMRenderPluginMaterial.Name) as GIRSMRenderPluginMaterial;\r\n plugin.isEnabled = enable;\r\n }\r\n });\r\n\r\n this.recreateResources(!enable);\r\n }\r\n\r\n /**\r\n * Defines if the global illumination calculation is paused or not.\r\n * Use this setting to pause the global illumination calculation when you know that the scene (camera/mesh/light positions) is not changing anymore to save some GPU power.\r\n * The scene will still be rendered with the latest global illumination contribution.\r\n */\r\n public pause = false;\r\n\r\n private _enableBlur = true;\r\n\r\n /**\r\n * Defines if the global illumination contribution should be blurred or not (using a bilateral blur). Default is true.\r\n */\r\n public get enableBlur() {\r\n return this._enableBlur;\r\n }\r\n\r\n public set enableBlur(enable: boolean) {\r\n if (enable === this._enableBlur) {\r\n return;\r\n }\r\n\r\n this._enableBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityBlur() {\r\n return this._useQualityBlur;\r\n }\r\n\r\n public set useQualityBlur(enable: boolean) {\r\n if (enable === this._useQualityBlur) {\r\n return;\r\n }\r\n\r\n this._useQualityBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the depth threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurDepthThreshold = 0.05;\r\n\r\n /**\r\n * Defines the normal threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurNormalThreshold = 0.25;\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral blur post-processes. Default is 12.\r\n */\r\n public blurKernel = 12;\r\n\r\n private _forceFullSizeBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done at full resolution or not. Default is false.\r\n * If this setting is enabled, upampling will be disabled (ignored) as it is not needed anymore.\r\n */\r\n public get fullSizeBlur() {\r\n return this._forceFullSizeBlur;\r\n }\r\n\r\n public set fullSizeBlur(mode: boolean) {\r\n if (this._forceFullSizeBlur === mode) {\r\n return;\r\n }\r\n\r\n this._forceFullSizeBlur = mode;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityUpsampling = false;\r\n\r\n /**\r\n * Defines if the upsampling should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityUpsampling() {\r\n return this._useQualityUpsampling;\r\n }\r\n\r\n public set useQualityUpsampling(enable: boolean) {\r\n if (enable === this._useQualityUpsampling) {\r\n return;\r\n }\r\n\r\n this._useQualityUpsampling = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral upsampling post-processes. Default is 6.\r\n */\r\n public upsamplerKernel = 6;\r\n\r\n private _showOnlyGI = false;\r\n\r\n /**\r\n * Defines if the debug layer should be enabled or not. Default is false.\r\n * Use this setting for debugging purpose, to show the global illumination contribution only.\r\n */\r\n public get showOnlyGI() {\r\n return this._showOnlyGI;\r\n }\r\n\r\n public set showOnlyGI(show) {\r\n if (this._showOnlyGI === show) {\r\n return;\r\n }\r\n\r\n this._showOnlyGI = show;\r\n this._debugLayer.isEnabled = show;\r\n }\r\n\r\n private _use32BitsDepthBuffer = false;\r\n\r\n /**\r\n * Defines if the depth buffer used by the geometry buffer renderer should be 32 bits or not. Default is false (16 bits).\r\n */\r\n public get use32BitsDepthBuffer() {\r\n return this._use32BitsDepthBuffer;\r\n }\r\n\r\n public set use32BitsDepthBuffer(enable: boolean) {\r\n if (this._use32BitsDepthBuffer === enable) {\r\n return;\r\n }\r\n\r\n this._use32BitsDepthBuffer = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _outputDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the output dimensions of the final process. It should normally be the same as the output dimensions of the screen.\r\n * @param dimensions The dimensions of the output texture (width and height)\r\n */\r\n public setOutputDimensions(dimensions: { width: number; height: number }) {\r\n this._outputDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the dimensions of the GI texture. Try to use the smallest size possible for better performance.\r\n * @param dimensions The dimensions of the GI texture (width and height)\r\n */\r\n public setGITextureDimensions(dimensions: { width: number; height: number }) {\r\n this._giTextureDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureType: number;\r\n\r\n /**\r\n * Gets or sets the texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n public get giTextureType() {\r\n return this._giTextureType;\r\n }\r\n\r\n public set giTextureType(textureType: number) {\r\n if (this._giTextureType === textureType) {\r\n return;\r\n }\r\n\r\n this._giTextureType = textureType;\r\n this.recreateResources();\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /** Gets the shader language used in this material. */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Gets the list of GIRSM used by the manager.\r\n */\r\n public get giRSM() {\r\n return this._giRSM;\r\n }\r\n\r\n /**\r\n * Adds a (list of) GIRSM to the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to add to the manager\r\n */\r\n public addGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n this._giRSM.push(...rsm);\r\n } else {\r\n this._giRSM.push(rsm);\r\n }\r\n\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Removes a (list of) GIRSM from the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to remove from the manager\r\n */\r\n public removeGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n for (let i = 0; i < rsm.length; ++i) {\r\n const idx = this._giRSM.indexOf(rsm[i]);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n } else {\r\n const idx = this._giRSM.indexOf(rsm);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n\r\n if (this._giRSM.length === 0) {\r\n this.enable = false;\r\n } else {\r\n this.recreateResources();\r\n }\r\n }\r\n\r\n /**\r\n * Add a material to the manager. This will enable the global illumination contribution for the material.\r\n * @param material Material that will be affected by the global illumination contribution. If not provided, all materials of the scene will be affected.\r\n */\r\n public addMaterial(material?: Material) {\r\n if (material) {\r\n this._addGISupportToMaterial(material);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0 && mesh.isEnabled() && mesh.material) {\r\n this._addGISupportToMaterial(mesh.material);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of GPU counters used by the manager.\r\n * GPU timing measurements must be enabled for the counters to be filled (engine.enableGPUTimingMeasurements = true).\r\n * Only available with WebGPU. You will still get the list of counters with other engines but the values will always be 0.\r\n */\r\n public get countersGPU(): Array<{ name: string; value: number }> {\r\n return this._counters;\r\n }\r\n\r\n /**\r\n * Recreates the resources used by the manager.\r\n * You should normally not have to call this method manually, except if you change the useFullTexture property of a GIRSM, because the manager won't track this change.\r\n * @param disposeGeometryBufferRenderer Defines if the geometry buffer renderer should be disposed and recreated. Default is false.\r\n */\r\n public recreateResources(disposeGeometryBufferRenderer = false) {\r\n if (!this._shadersLoaded) {\r\n this._onShaderLoadedObservable.addOnce(() => {\r\n this.recreateResources(disposeGeometryBufferRenderer);\r\n });\r\n return;\r\n }\r\n\r\n this._disposePostProcesses(disposeGeometryBufferRenderer);\r\n this._createPostProcesses();\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Generates the sample texture used by the the global illumination calculation process.\r\n * @param maxSamples The maximum number of samples to generate in the texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n */\r\n public generateSampleTexture(maxSamples: number) {\r\n this._sampleTexture?.dispose();\r\n\r\n this._maxSamples = maxSamples;\r\n\r\n const data = new Float32Array(this._maxSamples * 4);\r\n for (let i = 0; i < this._maxSamples; i++) {\r\n const xi1 = Math.random();\r\n const xi2 = Math.random();\r\n\r\n const x = xi1 * Math.sin(2 * Math.PI * xi2);\r\n const y = xi1 * Math.cos(2 * Math.PI * xi2);\r\n\r\n data[i * 4 + 0] = x;\r\n data[i * 4 + 1] = y;\r\n data[i * 4 + 2] = xi1 * xi1;\r\n data[i * 4 + 3] = 1;\r\n }\r\n\r\n this._sampleTexture = new RawTexture(\r\n data,\r\n this._maxSamples,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._sampleTexture.name = \"GIRSMSamples\";\r\n }\r\n\r\n /**\r\n * Disposes the manager.\r\n */\r\n public dispose() {\r\n this._disposePostProcesses(true);\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.dispose();\r\n this._scene.onBeforeDrawPhaseObservable.remove(this._drawPhaseObserver);\r\n this._onShaderLoadedObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new GIRSMManager\r\n * @param scene The scene\r\n * @param outputDimensions The dimensions of the output texture (width and height). Should normally be the same as the output dimensions of the screen.\r\n * @param giTextureDimensions The dimensions of the GI texture (width and height). Try to use the smallest size possible for better performance.\r\n * @param maxSamples The maximum number of samples to generate in the sample texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n * @param giTextureType The texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n constructor(\r\n scene: Scene,\r\n outputDimensions: { width: number; height: number },\r\n giTextureDimensions = { width: 256, height: 256 },\r\n maxSamples = 2048,\r\n giTextureType = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._outputDimensions = outputDimensions;\r\n this._giTextureDimensions = giTextureDimensions;\r\n this._giTextureType = giTextureType;\r\n this._materialsWithRenderPlugin = [];\r\n this._maxSamples = maxSamples;\r\n this._debugLayer = new Layer(\"debug layer\", null, this._scene, false);\r\n this._debugLayer.isEnabled = false;\r\n this._counters = [];\r\n this._countersRTW = [];\r\n\r\n this._initShaderSourceAsync();\r\n\r\n this.generateSampleTexture(maxSamples);\r\n\r\n this._drawPhaseObserver = this._scene.onBeforeDrawPhaseObservable.add(() => {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n let rebindCurrentRenderTarget = false;\r\n\r\n if (this._enable) {\r\n if (!this.pause) {\r\n this._scene.postProcessManager.directRender(this._ppGlobalIllumination, this._ppGlobalIllumination[0].inputTexture);\r\n this._engine.unBindFramebuffer(this._ppGlobalIllumination[0].inputTexture, true);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n rebindCurrentRenderTarget = true;\r\n\r\n if (this.enableBlur && this._blurPostProcesses) {\r\n this._scene.postProcessManager.directRender(this._blurPostProcesses, this._blurRTT!.renderTarget, true);\r\n this._engine.unBindFramebuffer(this._blurRTT!.renderTarget!, true);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._counters.length; ++i) {\r\n const rtws = this._countersRTW[i];\r\n for (let t = 0; t < rtws.length; ++t) {\r\n if (t === 0) {\r\n this._counters[i].value = this.pause ? 0 : ((rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0);\r\n } else if (!this.pause) {\r\n this._counters[i].value += (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n }\r\n\r\n if (rebindCurrentRenderTarget && currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n });\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private _onShaderLoadedObservable = new Observable<void>();\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([\r\n import(\"../../ShadersWGSL/bilateralBlur.fragment\"),\r\n import(\"../../ShadersWGSL/bilateralBlurQuality.fragment\"),\r\n import(\"../../ShadersWGSL/rsmGlobalIllumination.fragment\"),\r\n import(\"../../ShadersWGSL/rsmFullGlobalIllumination.fragment\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../Shaders/bilateralBlur.fragment\"),\r\n import(\"../../Shaders/bilateralBlurQuality.fragment\"),\r\n import(\"../../Shaders/rsmGlobalIllumination.fragment\"),\r\n import(\"../../Shaders/rsmFullGlobalIllumination.fragment\"),\r\n ]);\r\n }\r\n this._shadersLoaded = true;\r\n this._onShaderLoadedObservable.notifyObservers();\r\n }\r\n\r\n protected _disposePostProcesses(disposeGeometryBufferRenderer = false) {\r\n this._blurRTT?.dispose();\r\n this._blurRTT = null;\r\n this._blurPostProcesses = [];\r\n this._blurXPostprocess?.dispose();\r\n this._blurXPostprocess = null;\r\n this._blurYPostprocess?.dispose();\r\n this._blurYPostprocess = null;\r\n this._upsamplingXPostprocess?.dispose();\r\n this._upsamplingXPostprocess = null;\r\n this._upsamplingYPostprocess?.dispose();\r\n this._upsamplingYPostprocess = null;\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n ppGlobalIllumination.dispose();\r\n }\r\n this._ppGlobalIllumination = [];\r\n if (disposeGeometryBufferRenderer) {\r\n if (this._geomBufferEnabled) {\r\n this._scene.enableGeometryBufferRenderer();\r\n this._scene.geometryBufferRenderer!.enablePosition = this._geomBufferEnablePosition;\r\n } else {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n this._counters = [];\r\n this._countersRTW = [];\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<GIRSMRenderPluginMaterial>(GIRSMRenderPluginMaterial.Name)!;\r\n plugin.textureGIContrib = this.enableBlur ? this._blurRTT!.renderTarget!.texture! : this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n });\r\n }\r\n\r\n protected _createPostProcesses() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n const textureFormat = this._giTextureType === Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (this._firstActivation) {\r\n this._firstActivation = false;\r\n this._geomBufferEnabled = !!this._scene.geometryBufferRenderer;\r\n this._geomBufferEnablePosition = this._scene.geometryBufferRenderer?.enablePosition ?? false;\r\n }\r\n\r\n if (!this._geomBufferEnabled) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.enableGeometryBufferRenderer(\r\n this._enableBlur ? this._outputDimensions : this._giTextureDimensions,\r\n this._use32BitsDepthBuffer ? Constants.TEXTUREFORMAT_DEPTH32_FLOAT : Constants.TEXTUREFORMAT_DEPTH16,\r\n GIRSMManager.GeometryBufferTextureTypesAndFormats\r\n );\r\n\r\n if (!geometryBufferRenderer) {\r\n throw new Error(\"Geometry buffer renderer is not supported but is required for GIRSMManager.\");\r\n }\r\n\r\n geometryBufferRenderer.enablePosition = true;\r\n if (!this._geomBufferEnabled) {\r\n geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n }\r\n\r\n const decodeGeometryBufferNormals = geometryBufferRenderer.normalsAreUnsigned;\r\n const normalsAreInWorldSpace = geometryBufferRenderer.generateNormalsInWorldSpace;\r\n\r\n this._counters.push({ name: \"Geometry buffer renderer\", value: 0 });\r\n this._countersRTW.push([this._scene.geometryBufferRenderer!.getGBuffer().renderTarget!]);\r\n\r\n let defines = \"\";\r\n if (decodeGeometryBufferNormals) {\r\n defines += \"#define DECODE_NORMAL\\n\";\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n defines += \"#define TRANSFORM_NORMAL\\n\";\r\n }\r\n\r\n for (let i = 0; i < this._giRSM.length; ++i) {\r\n const giRSM = this._giRSM[i];\r\n const rsm = giRSM.rsm;\r\n\r\n const ppGlobalIllumination = new PostProcess(\"RSMGlobalIllumination\" + i, giRSM.useFullTexture ? \"rsmFullGlobalIllumination\" : \"rsmGlobalIllumination\", {\r\n ...this._giTextureDimensions,\r\n uniforms: [\"rsmLightMatrix\", \"rsmInfo\", \"rsmInfo2\", \"invView\"],\r\n samplers: [\"normalSampler\", \"rsmPositionW\", \"rsmNormalW\", \"rsmFlux\", \"rsmSamples\"],\r\n defines,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._ppGlobalIllumination.push(ppGlobalIllumination);\r\n\r\n if (i !== 0) {\r\n ppGlobalIllumination.shareOutputWith(this._ppGlobalIllumination[0]);\r\n ppGlobalIllumination.alphaMode = Constants.ALPHA_ADD;\r\n }\r\n\r\n ppGlobalIllumination.autoClear = false;\r\n ppGlobalIllumination.externalTextureSamplerBinding = true;\r\n ppGlobalIllumination.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"textureSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\"rsmPositionW\", rsm.positionWorldTexture);\r\n effect.setTexture(\"rsmNormalW\", rsm.normalWorldTexture);\r\n effect.setTexture(\"rsmFlux\", rsm.fluxTexture);\r\n effect.setMatrix(\"rsmLightMatrix\", rsm.lightTransformationMatrix);\r\n if (!giRSM.useFullTexture) {\r\n effect.setTexture(\"rsmSamples\", this._sampleTexture);\r\n effect.setFloat4(\"rsmInfo\", giRSM.numSamples, giRSM.radius, giRSM.intensity, giRSM.edgeArtifactCorrection);\r\n effect.setFloat4(\r\n \"rsmInfo2\",\r\n giRSM.noiseFactor,\r\n giRSM.rotateSample ? 1 : 0,\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height\r\n );\r\n } else {\r\n effect.setFloat4(\r\n \"rsmInfo\",\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height,\r\n giRSM.intensity,\r\n giRSM.edgeArtifactCorrection\r\n );\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n this._tempMatrix.copyFrom(this._scene.activeCamera!.getViewMatrix());\r\n this._tempMatrix.invert();\r\n effect.setMatrix(\"invView\", this._tempMatrix);\r\n }\r\n });\r\n }\r\n\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n if (!ppGlobalIllumination.inputTexture) {\r\n ppGlobalIllumination.resize(this._giTextureDimensions.width, this._giTextureDimensions.height);\r\n }\r\n }\r\n\r\n this._counters.push({ name: \"GI generation\", value: 0 });\r\n this._countersRTW.push([this._ppGlobalIllumination[0].inputTexture]);\r\n\r\n if (this._enableBlur) {\r\n const blurTextureSize = this._forceFullSizeBlur ? this._outputDimensions : this._giTextureDimensions;\r\n\r\n this._blurRTT = new RenderTargetTexture(\"GIRSMContribution\", this._outputDimensions, this._scene, {\r\n type: this._giTextureType,\r\n format: textureFormat,\r\n generateDepthBuffer: false,\r\n });\r\n this._blurRTT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.updateSamplingMode(Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._blurRTT.skipInitialClear = true;\r\n\r\n const blurRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI blur\", value: 0 });\r\n this._countersRTW.push(blurRTWs);\r\n\r\n // Bilateral blur\r\n this._blurXPostprocess = new PostProcess(this._useQualityBlur ? \"BilateralBlur\" : \"BilateralBlurX\", this._useQualityBlur ? \"bilateralBlurQuality\" : \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._blurXPostprocess.onApplyObservable.add((effect) => {\r\n effect._bindTexture(\"textureSampler\", this._ppGlobalIllumination[0].inputTexture.texture);\r\n effect.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._giTextureDimensions.width, this._useQualityBlur ? 1 / this._giTextureDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurXPostprocess.externalTextureSamplerBinding = true;\r\n this._blurXPostprocess.autoClear = false;\r\n\r\n if (!this._useQualityBlur) {\r\n this._blurYPostprocess = new PostProcess(\"BilateralBlurY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._blurYPostprocess.autoClear = false;\r\n this._blurYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._giTextureDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurYPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._blurYPostprocess.inputTexture);\r\n }\r\n\r\n this._blurPostProcesses = [this._blurXPostprocess];\r\n if (this._blurYPostprocess) {\r\n this._blurPostProcesses.push(this._blurYPostprocess);\r\n }\r\n\r\n // Bilateral upsampling\r\n const giFullDimensions = this._giTextureDimensions.width >= this._outputDimensions.width && this._giTextureDimensions.height >= this._outputDimensions.height;\r\n\r\n if (!giFullDimensions && !this._forceFullSizeBlur) {\r\n const upsamplingRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI upsampling\", value: 0 });\r\n this._countersRTW.push(upsamplingRTWs);\r\n\r\n this._upsamplingXPostprocess = new PostProcess(\r\n this._useQualityUpsampling ? \"BilateralUpsampling\" : \"BilateralUpsamplingX\",\r\n this._useQualityUpsampling ? \"bilateralBlurQuality\" : \"bilateralBlur\",\r\n {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n }\r\n );\r\n\r\n this._upsamplingXPostprocess.autoClear = false;\r\n this._upsamplingXPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._outputDimensions.width, this._useQualityUpsampling ? 1 / this._outputDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingXPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._upsamplingXPostprocess.inputTexture);\r\n\r\n if (!this.useQualityUpsampling) {\r\n this._upsamplingYPostprocess = new PostProcess(\"BilateralUpsamplingY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: this._outputDimensions,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._upsamplingYPostprocess.autoClear = false;\r\n this._upsamplingYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._outputDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingYPostprocess.resize(this._outputDimensions.width, this._outputDimensions.height);\r\n\r\n upsamplingRTWs.push(this._upsamplingYPostprocess.inputTexture);\r\n }\r\n\r\n upsamplingRTWs.push(this._blurRTT.renderTarget!);\r\n\r\n this._blurPostProcesses.push(this._upsamplingXPostprocess);\r\n if (this._upsamplingYPostprocess) {\r\n this._blurPostProcesses.push(this._upsamplingYPostprocess);\r\n }\r\n } else {\r\n blurRTWs.push(this._blurRTT.renderTarget!);\r\n }\r\n }\r\n\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.texture = new BaseTexture(this._scene, this._enableBlur ? this._blurRTT!.renderTarget!.texture : this._ppGlobalIllumination[0].inputTexture.texture);\r\n }\r\n\r\n protected _addGISupportToMaterial(material: Material) {\r\n if (material.pluginManager?.getPlugin(GIRSMRenderPluginMaterial.Name)) {\r\n return;\r\n }\r\n\r\n const plugin = new GIRSMRenderPluginMaterial(material);\r\n\r\n if (this._enable && this._ppGlobalIllumination.length > 0) {\r\n plugin.textureGIContrib = this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n\r\n plugin.isEnabled = this._enable;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialGIRSMRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_GIRSM = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the global illumination contribution.\r\n */\r\nexport class GIRSMRenderPluginMaterial extends MaterialPluginBase {\r\n private _isPBR;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"GIRSMRender\";\r\n\r\n /**\r\n * The texture containing the global illumination contribution.\r\n */\r\n @serialize()\r\n public textureGIContrib: InternalTexture;\r\n\r\n /**\r\n * The width of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureWidth: number;\r\n\r\n /**\r\n * The height of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureHeight: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, GIRSMRenderPluginMaterial.Name, 310, new MaterialGIRSMRenderDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._isPBR = material instanceof PBRBaseMaterial;\r\n }\r\n\r\n public override prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public override getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [{ name: \"girsmTextureOutputSize\", size: 2, type: \"vec2\" }],\r\n fragment: `#ifdef RENDER_WITH_GIRSM\r\n uniform vec2 girsmTextureOutputSize;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"girsmTextureGIContrib\", this.textureGIContrib);\r\n uniformBuffer.updateFloat2(\"girsmTextureOutputSize\", this.outputTextureWidth, this.outputTextureHeight);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n var girsmTextureGIContribSampler: sampler;\r\n var girsmTextureGIContrib: texture_2d<f32>;\r\n\r\n fn computeIndirect() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.girsmTextureOutputSize;\r\n return textureSample(girsmTextureGIContrib, girsmTextureGIContribSampler, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color = vec4f(color.rgb + computeIndirect() * baseColor.rgb, color.a);\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n uniform sampler2D girsmTextureGIContrib;\r\n\r\n vec3 computeIndirect() {\r\n vec2 uv = gl_FragCoord.xy / girsmTextureOutputSize;\r\n return texture2D(girsmTextureGIContrib, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color.rgb += computeIndirect() * baseColor.rgb;\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.GIRSMRenderPluginMaterial`, GIRSMRenderPluginMaterial);\r\n"]}
1
+ {"version":3,"file":"giRSMManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger\r\n * Further explanations and implementations can be found in:\r\n * - Jaker video explaining RSM and its implementation: https://www.youtube.com/watch?v=LJQQdBsOYPM\r\n * - C++ implementation by Luis Angel: https://github.com/imyoungmin/RSM\r\n * - Javascript implementation by Erkaman: https://github.com/Erkaman/webgl-rsm\r\n */\r\nimport type { Scene } from \"core/scene\";\r\nimport type { GIRSM } from \"./giRSM\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { GeometryBufferRenderer } from \"../geometryBufferRenderer\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Class used to manage the global illumination contribution calculated from reflective shadow maps (RSM).\r\n */\r\nexport class GIRSMManager {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _giRSM: GIRSM[] = [];\r\n private _materialsWithRenderPlugin: Material[];\r\n private _sampleTexture: RawTexture;\r\n private _maxSamples: number;\r\n private _blurRTT: Nullable<RenderTargetTexture> = null;\r\n private _blurPostProcesses: Nullable<PostProcess[]> = null;\r\n private _blurXPostprocess: Nullable<PostProcess> = null;\r\n private _blurYPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingXPostprocess: Nullable<PostProcess> = null;\r\n private _upsamplingYPostprocess: Nullable<PostProcess> = null;\r\n private _ppGlobalIllumination: PostProcess[] = [];\r\n private _drawPhaseObserver: Observer<Scene>;\r\n private _debugLayer: Layer;\r\n private _counters: Array<{ name: string; value: number }>;\r\n private _countersRTW: Array<RenderTargetWrapper[]>;\r\n private _firstActivation = true;\r\n private _geomBufferEnabled = false;\r\n private _geomBufferEnablePosition = false;\r\n private _tempMatrix = new Matrix();\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Defines the default texture types and formats used by the geometry buffer renderer.\r\n */\r\n public static GeometryBufferTextureTypesAndFormats: { [key: number]: { textureType: number; textureFormat: number } } = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 0: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_R }, // depth\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 1: { textureType: Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // normal\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n 2: { textureType: Constants.TEXTURETYPE_HALF_FLOAT, textureFormat: Constants.TEXTUREFORMAT_RGBA }, // position\r\n };\r\n\r\n /**\r\n * Enables or disables the manager. Default is false.\r\n * If disabled, the global illumination won't be calculated and the scene will be rendered normally, without any global illumination contribution.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(enable: boolean) {\r\n if (this._giRSM.length === 0) {\r\n enable = false;\r\n }\r\n\r\n if (enable === this._enable) {\r\n return;\r\n }\r\n\r\n this._enable = enable;\r\n this._debugLayer.isEnabled = this._showOnlyGI && enable;\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin(GIRSMRenderPluginMaterial.Name) as GIRSMRenderPluginMaterial;\r\n plugin.isEnabled = enable;\r\n }\r\n });\r\n\r\n this.recreateResources(!enable);\r\n }\r\n\r\n /**\r\n * Defines if the global illumination calculation is paused or not.\r\n * Use this setting to pause the global illumination calculation when you know that the scene (camera/mesh/light positions) is not changing anymore to save some GPU power.\r\n * The scene will still be rendered with the latest global illumination contribution.\r\n */\r\n public pause = false;\r\n\r\n private _enableBlur = true;\r\n\r\n /**\r\n * Defines if the global illumination contribution should be blurred or not (using a bilateral blur). Default is true.\r\n */\r\n public get enableBlur() {\r\n return this._enableBlur;\r\n }\r\n\r\n public set enableBlur(enable: boolean) {\r\n if (enable === this._enableBlur) {\r\n return;\r\n }\r\n\r\n this._enableBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityBlur() {\r\n return this._useQualityBlur;\r\n }\r\n\r\n public set useQualityBlur(enable: boolean) {\r\n if (enable === this._useQualityBlur) {\r\n return;\r\n }\r\n\r\n this._useQualityBlur = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the depth threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurDepthThreshold = 0.05;\r\n\r\n /**\r\n * Defines the normal threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).\r\n * You may have to change this value, depending on your scene.\r\n */\r\n public blurNormalThreshold = 0.25;\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral blur post-processes. Default is 12.\r\n */\r\n public blurKernel = 12;\r\n\r\n private _forceFullSizeBlur = false;\r\n\r\n /**\r\n * Defines if the blur should be done at full resolution or not. Default is false.\r\n * If this setting is enabled, upampling will be disabled (ignored) as it is not needed anymore.\r\n */\r\n public get fullSizeBlur() {\r\n return this._forceFullSizeBlur;\r\n }\r\n\r\n public set fullSizeBlur(mode: boolean) {\r\n if (this._forceFullSizeBlur === mode) {\r\n return;\r\n }\r\n\r\n this._forceFullSizeBlur = mode;\r\n this.recreateResources();\r\n }\r\n\r\n private _useQualityUpsampling = false;\r\n\r\n /**\r\n * Defines if the upsampling should be done with a better quality but slower or not. Default is false.\r\n */\r\n public get useQualityUpsampling() {\r\n return this._useQualityUpsampling;\r\n }\r\n\r\n public set useQualityUpsampling(enable: boolean) {\r\n if (enable === this._useQualityUpsampling) {\r\n return;\r\n }\r\n\r\n this._useQualityUpsampling = enable;\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Defines the kernel size used by the bilateral upsampling post-processes. Default is 6.\r\n */\r\n public upsamplerKernel = 6;\r\n\r\n private _showOnlyGI = false;\r\n\r\n /**\r\n * Defines if the debug layer should be enabled or not. Default is false.\r\n * Use this setting for debugging purpose, to show the global illumination contribution only.\r\n */\r\n public get showOnlyGI() {\r\n return this._showOnlyGI;\r\n }\r\n\r\n public set showOnlyGI(show) {\r\n if (this._showOnlyGI === show) {\r\n return;\r\n }\r\n\r\n this._showOnlyGI = show;\r\n this._debugLayer.isEnabled = show;\r\n }\r\n\r\n private _use32BitsDepthBuffer = false;\r\n\r\n /**\r\n * Defines if the depth buffer used by the geometry buffer renderer should be 32 bits or not. Default is false (16 bits).\r\n */\r\n public get use32BitsDepthBuffer() {\r\n return this._use32BitsDepthBuffer;\r\n }\r\n\r\n public set use32BitsDepthBuffer(enable: boolean) {\r\n if (this._use32BitsDepthBuffer === enable) {\r\n return;\r\n }\r\n\r\n this._use32BitsDepthBuffer = enable;\r\n this.recreateResources();\r\n }\r\n\r\n private _outputDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the output dimensions of the final process. It should normally be the same as the output dimensions of the screen.\r\n * @param dimensions The dimensions of the output texture (width and height)\r\n */\r\n public setOutputDimensions(dimensions: { width: number; height: number }) {\r\n this._outputDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureDimensions: { width: number; height: number };\r\n\r\n /**\r\n * Sets the dimensions of the GI texture. Try to use the smallest size possible for better performance.\r\n * @param dimensions The dimensions of the GI texture (width and height)\r\n */\r\n public setGITextureDimensions(dimensions: { width: number; height: number }) {\r\n this._giTextureDimensions = dimensions;\r\n this.recreateResources();\r\n }\r\n\r\n private _giTextureType: number;\r\n\r\n /**\r\n * Gets or sets the texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n public get giTextureType() {\r\n return this._giTextureType;\r\n }\r\n\r\n public set giTextureType(textureType: number) {\r\n if (this._giTextureType === textureType) {\r\n return;\r\n }\r\n\r\n this._giTextureType = textureType;\r\n this.recreateResources();\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /** Gets the shader language used in this material. */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Gets the list of GIRSM used by the manager.\r\n */\r\n public get giRSM() {\r\n return this._giRSM;\r\n }\r\n\r\n /**\r\n * Adds a (list of) GIRSM to the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to add to the manager\r\n */\r\n public addGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n this._giRSM.push(...rsm);\r\n } else {\r\n this._giRSM.push(rsm);\r\n }\r\n\r\n this.recreateResources();\r\n }\r\n\r\n /**\r\n * Removes a (list of) GIRSM from the manager.\r\n * @param rsm The GIRSM (or array of GIRSM) to remove from the manager\r\n */\r\n public removeGIRSM(rsm: GIRSM | GIRSM[]) {\r\n if (Array.isArray(rsm)) {\r\n for (let i = 0; i < rsm.length; ++i) {\r\n const idx = this._giRSM.indexOf(rsm[i]);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n } else {\r\n const idx = this._giRSM.indexOf(rsm);\r\n if (idx !== -1) {\r\n this._giRSM.splice(idx, 1);\r\n }\r\n }\r\n\r\n if (this._giRSM.length === 0) {\r\n this.enable = false;\r\n } else {\r\n this.recreateResources();\r\n }\r\n }\r\n\r\n /**\r\n * Add a material to the manager. This will enable the global illumination contribution for the material.\r\n * @param material Material that will be affected by the global illumination contribution. If not provided, all materials of the scene will be affected.\r\n */\r\n public addMaterial(material?: Material) {\r\n if (material) {\r\n this._addGISupportToMaterial(material);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n if (mesh.getTotalVertices() > 0 && mesh.isEnabled() && mesh.material) {\r\n this._addGISupportToMaterial(mesh.material);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of GPU counters used by the manager.\r\n * GPU timing measurements must be enabled for the counters to be filled (engine.enableGPUTimingMeasurements = true).\r\n * Only available with WebGPU. You will still get the list of counters with other engines but the values will always be 0.\r\n */\r\n public get countersGPU(): Array<{ name: string; value: number }> {\r\n return this._counters;\r\n }\r\n\r\n /**\r\n * Recreates the resources used by the manager.\r\n * You should normally not have to call this method manually, except if you change the useFullTexture property of a GIRSM, because the manager won't track this change.\r\n * @param disposeGeometryBufferRenderer Defines if the geometry buffer renderer should be disposed and recreated. Default is false.\r\n */\r\n public recreateResources(disposeGeometryBufferRenderer = false) {\r\n if (!this._shadersLoaded) {\r\n this._onShaderLoadedObservable.addOnce(() => {\r\n this.recreateResources(disposeGeometryBufferRenderer);\r\n });\r\n return;\r\n }\r\n\r\n this._disposePostProcesses(disposeGeometryBufferRenderer);\r\n this._createPostProcesses();\r\n this._setPluginParameters();\r\n }\r\n\r\n /**\r\n * Generates the sample texture used by the the global illumination calculation process.\r\n * @param maxSamples The maximum number of samples to generate in the texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n */\r\n public generateSampleTexture(maxSamples: number) {\r\n this._sampleTexture?.dispose();\r\n\r\n this._maxSamples = maxSamples;\r\n\r\n const data = new Float32Array(this._maxSamples * 4);\r\n for (let i = 0; i < this._maxSamples; i++) {\r\n const xi1 = Math.random();\r\n const xi2 = Math.random();\r\n\r\n const x = xi1 * Math.sin(2 * Math.PI * xi2);\r\n const y = xi1 * Math.cos(2 * Math.PI * xi2);\r\n\r\n data[i * 4 + 0] = x;\r\n data[i * 4 + 1] = y;\r\n data[i * 4 + 2] = xi1 * xi1;\r\n data[i * 4 + 3] = 1;\r\n }\r\n\r\n this._sampleTexture = new RawTexture(\r\n data,\r\n this._maxSamples,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._sampleTexture.name = \"GIRSMSamples\";\r\n }\r\n\r\n /**\r\n * Disposes the manager.\r\n */\r\n public dispose() {\r\n this._disposePostProcesses(true);\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.dispose();\r\n this._scene.onBeforeDrawPhaseObservable.remove(this._drawPhaseObserver);\r\n this._onShaderLoadedObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new GIRSMManager\r\n * @param scene The scene\r\n * @param outputDimensions The dimensions of the output texture (width and height). Should normally be the same as the output dimensions of the screen.\r\n * @param giTextureDimensions The dimensions of the GI texture (width and height). Try to use the smallest size possible for better performance.\r\n * @param maxSamples The maximum number of samples to generate in the sample texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!\r\n * @param giTextureType The texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.\r\n */\r\n constructor(\r\n scene: Scene,\r\n outputDimensions: { width: number; height: number },\r\n giTextureDimensions = { width: 256, height: 256 },\r\n maxSamples = 2048,\r\n giTextureType = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._outputDimensions = outputDimensions;\r\n this._giTextureDimensions = giTextureDimensions;\r\n this._giTextureType = giTextureType;\r\n this._materialsWithRenderPlugin = [];\r\n this._maxSamples = maxSamples;\r\n this._debugLayer = new Layer(\"debug layer\", null, this._scene, false);\r\n this._debugLayer.isEnabled = false;\r\n this._counters = [];\r\n this._countersRTW = [];\r\n\r\n this._initShaderSourceAsync();\r\n\r\n this.generateSampleTexture(maxSamples);\r\n\r\n this._drawPhaseObserver = this._scene.onBeforeDrawPhaseObservable.add(() => {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n let rebindCurrentRenderTarget = false;\r\n\r\n if (this._enable && this._shadersLoaded) {\r\n if (!this.pause && this._ppGlobalIllumination.length > 0) {\r\n this._scene.postProcessManager.directRender(this._ppGlobalIllumination, this._ppGlobalIllumination[0].inputTexture);\r\n this._engine.unBindFramebuffer(this._ppGlobalIllumination[0].inputTexture, true);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n rebindCurrentRenderTarget = true;\r\n\r\n if (this.enableBlur && this._blurPostProcesses) {\r\n this._scene.postProcessManager.directRender(this._blurPostProcesses, this._blurRTT!.renderTarget, true);\r\n this._engine.unBindFramebuffer(this._blurRTT!.renderTarget!, true);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._counters.length; ++i) {\r\n const rtws = this._countersRTW[i];\r\n for (let t = 0; t < rtws.length; ++t) {\r\n if (t === 0) {\r\n this._counters[i].value = this.pause ? 0 : ((rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0);\r\n } else if (!this.pause) {\r\n this._counters[i].value += (rtws[t] as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n }\r\n\r\n if (rebindCurrentRenderTarget && currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n });\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private _onShaderLoadedObservable = new Observable<void>();\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([\r\n import(\"../../ShadersWGSL/bilateralBlur.fragment\"),\r\n import(\"../../ShadersWGSL/bilateralBlurQuality.fragment\"),\r\n import(\"../../ShadersWGSL/rsmGlobalIllumination.fragment\"),\r\n import(\"../../ShadersWGSL/rsmFullGlobalIllumination.fragment\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../Shaders/bilateralBlur.fragment\"),\r\n import(\"../../Shaders/bilateralBlurQuality.fragment\"),\r\n import(\"../../Shaders/rsmGlobalIllumination.fragment\"),\r\n import(\"../../Shaders/rsmFullGlobalIllumination.fragment\"),\r\n ]);\r\n }\r\n this._shadersLoaded = true;\r\n this._onShaderLoadedObservable.notifyObservers();\r\n }\r\n\r\n protected _disposePostProcesses(disposeGeometryBufferRenderer = false) {\r\n this._blurRTT?.dispose();\r\n this._blurRTT = null;\r\n this._blurPostProcesses = [];\r\n this._blurXPostprocess?.dispose();\r\n this._blurXPostprocess = null;\r\n this._blurYPostprocess?.dispose();\r\n this._blurYPostprocess = null;\r\n this._upsamplingXPostprocess?.dispose();\r\n this._upsamplingXPostprocess = null;\r\n this._upsamplingYPostprocess?.dispose();\r\n this._upsamplingYPostprocess = null;\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n ppGlobalIllumination.dispose();\r\n }\r\n this._ppGlobalIllumination = [];\r\n if (disposeGeometryBufferRenderer) {\r\n if (this._geomBufferEnabled) {\r\n this._scene.enableGeometryBufferRenderer();\r\n this._scene.geometryBufferRenderer!.enablePosition = this._geomBufferEnablePosition;\r\n } else {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n }\r\n this._counters = [];\r\n this._countersRTW = [];\r\n }\r\n\r\n protected _setPluginParameters() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n this._materialsWithRenderPlugin.forEach((mat) => {\r\n if (mat.pluginManager) {\r\n const plugin = mat.pluginManager.getPlugin<GIRSMRenderPluginMaterial>(GIRSMRenderPluginMaterial.Name)!;\r\n plugin.textureGIContrib = this.enableBlur ? this._blurRTT!.renderTarget!.texture! : this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n });\r\n }\r\n\r\n protected _createPostProcesses() {\r\n if (!this._enable) {\r\n return;\r\n }\r\n\r\n const textureFormat = this._giTextureType === Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (this._firstActivation) {\r\n this._firstActivation = false;\r\n this._geomBufferEnabled = !!this._scene.geometryBufferRenderer;\r\n this._geomBufferEnablePosition = this._scene.geometryBufferRenderer?.enablePosition ?? false;\r\n }\r\n\r\n if (!this._geomBufferEnabled) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n const geometryBufferRenderer = this._scene.enableGeometryBufferRenderer(\r\n this._enableBlur ? this._outputDimensions : this._giTextureDimensions,\r\n this._use32BitsDepthBuffer ? Constants.TEXTUREFORMAT_DEPTH32_FLOAT : Constants.TEXTUREFORMAT_DEPTH16,\r\n GIRSMManager.GeometryBufferTextureTypesAndFormats\r\n );\r\n\r\n if (!geometryBufferRenderer) {\r\n throw new Error(\"Geometry buffer renderer is not supported but is required for GIRSMManager.\");\r\n }\r\n\r\n geometryBufferRenderer.enablePosition = true;\r\n if (!this._geomBufferEnabled) {\r\n geometryBufferRenderer.generateNormalsInWorldSpace = true;\r\n }\r\n\r\n const decodeGeometryBufferNormals = geometryBufferRenderer.normalsAreUnsigned;\r\n const normalsAreInWorldSpace = geometryBufferRenderer.generateNormalsInWorldSpace;\r\n\r\n this._counters.push({ name: \"Geometry buffer renderer\", value: 0 });\r\n this._countersRTW.push([this._scene.geometryBufferRenderer!.getGBuffer().renderTarget!]);\r\n\r\n let defines = \"\";\r\n if (decodeGeometryBufferNormals) {\r\n defines += \"#define DECODE_NORMAL\\n\";\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n defines += \"#define TRANSFORM_NORMAL\\n\";\r\n }\r\n\r\n for (let i = 0; i < this._giRSM.length; ++i) {\r\n const giRSM = this._giRSM[i];\r\n const rsm = giRSM.rsm;\r\n\r\n const ppGlobalIllumination = new PostProcess(\"RSMGlobalIllumination\" + i, giRSM.useFullTexture ? \"rsmFullGlobalIllumination\" : \"rsmGlobalIllumination\", {\r\n ...this._giTextureDimensions,\r\n uniforms: [\"rsmLightMatrix\", \"rsmInfo\", \"rsmInfo2\", \"invView\"],\r\n samplers: [\"normalSampler\", \"rsmPositionW\", \"rsmNormalW\", \"rsmFlux\", \"rsmSamples\"],\r\n defines,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._ppGlobalIllumination.push(ppGlobalIllumination);\r\n\r\n if (i !== 0) {\r\n ppGlobalIllumination.shareOutputWith(this._ppGlobalIllumination[0]);\r\n ppGlobalIllumination.alphaMode = Constants.ALPHA_ADD;\r\n }\r\n\r\n ppGlobalIllumination.autoClear = false;\r\n ppGlobalIllumination.externalTextureSamplerBinding = true;\r\n ppGlobalIllumination.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"textureSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\"rsmPositionW\", rsm.positionWorldTexture);\r\n effect.setTexture(\"rsmNormalW\", rsm.normalWorldTexture);\r\n effect.setTexture(\"rsmFlux\", rsm.fluxTexture);\r\n effect.setMatrix(\"rsmLightMatrix\", rsm.lightTransformationMatrix);\r\n if (!giRSM.useFullTexture) {\r\n effect.setTexture(\"rsmSamples\", this._sampleTexture);\r\n effect.setFloat4(\"rsmInfo\", giRSM.numSamples, giRSM.radius, giRSM.intensity, giRSM.edgeArtifactCorrection);\r\n effect.setFloat4(\r\n \"rsmInfo2\",\r\n giRSM.noiseFactor,\r\n giRSM.rotateSample ? 1 : 0,\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height\r\n );\r\n } else {\r\n effect.setFloat4(\r\n \"rsmInfo\",\r\n rsm.fluxTexture.getInternalTexture()!.width,\r\n rsm.fluxTexture.getInternalTexture()!.height,\r\n giRSM.intensity,\r\n giRSM.edgeArtifactCorrection\r\n );\r\n }\r\n if (!normalsAreInWorldSpace) {\r\n this._tempMatrix.copyFrom(this._scene.activeCamera!.getViewMatrix());\r\n this._tempMatrix.invert();\r\n effect.setMatrix(\"invView\", this._tempMatrix);\r\n }\r\n });\r\n }\r\n\r\n for (const ppGlobalIllumination of this._ppGlobalIllumination) {\r\n if (!ppGlobalIllumination.inputTexture) {\r\n ppGlobalIllumination.resize(this._giTextureDimensions.width, this._giTextureDimensions.height);\r\n }\r\n }\r\n\r\n this._counters.push({ name: \"GI generation\", value: 0 });\r\n this._countersRTW.push([this._ppGlobalIllumination[0].inputTexture]);\r\n\r\n if (this._enableBlur) {\r\n const blurTextureSize = this._forceFullSizeBlur ? this._outputDimensions : this._giTextureDimensions;\r\n\r\n this._blurRTT = new RenderTargetTexture(\"GIRSMContribution\", this._outputDimensions, this._scene, {\r\n type: this._giTextureType,\r\n format: textureFormat,\r\n generateDepthBuffer: false,\r\n });\r\n this._blurRTT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._blurRTT.updateSamplingMode(Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._blurRTT.skipInitialClear = true;\r\n\r\n const blurRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI blur\", value: 0 });\r\n this._countersRTW.push(blurRTWs);\r\n\r\n // Bilateral blur\r\n this._blurXPostprocess = new PostProcess(this._useQualityBlur ? \"BilateralBlur\" : \"BilateralBlurX\", this._useQualityBlur ? \"bilateralBlurQuality\" : \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._blurXPostprocess.onApplyObservable.add((effect) => {\r\n effect._bindTexture(\"textureSampler\", this._ppGlobalIllumination[0].inputTexture.texture);\r\n effect.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._giTextureDimensions.width, this._useQualityBlur ? 1 / this._giTextureDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurXPostprocess.externalTextureSamplerBinding = true;\r\n this._blurXPostprocess.autoClear = false;\r\n\r\n if (!this._useQualityBlur) {\r\n this._blurYPostprocess = new PostProcess(\"BilateralBlurY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._blurYPostprocess.autoClear = false;\r\n this._blurYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.blurKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._giTextureDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._blurYPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._blurYPostprocess.inputTexture);\r\n }\r\n\r\n this._blurPostProcesses = [this._blurXPostprocess];\r\n if (this._blurYPostprocess) {\r\n this._blurPostProcesses.push(this._blurYPostprocess);\r\n }\r\n\r\n // Bilateral upsampling\r\n const giFullDimensions = this._giTextureDimensions.width >= this._outputDimensions.width && this._giTextureDimensions.height >= this._outputDimensions.height;\r\n\r\n if (!giFullDimensions && !this._forceFullSizeBlur) {\r\n const upsamplingRTWs: RenderTargetWrapper[] = [];\r\n\r\n this._counters.push({ name: \"GI upsampling\", value: 0 });\r\n this._countersRTW.push(upsamplingRTWs);\r\n\r\n this._upsamplingXPostprocess = new PostProcess(\r\n this._useQualityUpsampling ? \"BilateralUpsampling\" : \"BilateralUpsamplingX\",\r\n this._useQualityUpsampling ? \"bilateralBlurQuality\" : \"bilateralBlur\",\r\n {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: blurTextureSize,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n }\r\n );\r\n\r\n this._upsamplingXPostprocess.autoClear = false;\r\n this._upsamplingXPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 1 / this._outputDimensions.width, this._useQualityUpsampling ? 1 / this._outputDimensions.height : 0);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingXPostprocess.resize(blurTextureSize.width, blurTextureSize.height);\r\n\r\n blurRTWs.push(this._upsamplingXPostprocess.inputTexture);\r\n\r\n if (!this.useQualityUpsampling) {\r\n this._upsamplingYPostprocess = new PostProcess(\"BilateralUpsamplingY\", \"bilateralBlur\", {\r\n uniforms: [\"filterSize\", \"blurDir\", \"depthThreshold\", \"normalThreshold\"],\r\n samplers: [\"depthSampler\", \"normalSampler\"],\r\n defines: decodeGeometryBufferNormals ? \"#define DECODE_NORMAL\" : undefined,\r\n size: this._outputDimensions,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: this._giTextureType,\r\n textureFormat,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n this._upsamplingYPostprocess.autoClear = false;\r\n this._upsamplingYPostprocess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\r\n \"depthSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\r\n \"normalSampler\",\r\n geometryBufferRenderer.getGBuffer().textures[geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE)]\r\n );\r\n effect.setInt(\"filterSize\", this.upsamplerKernel);\r\n effect.setFloat2(\"blurDir\", 0, 1 / this._outputDimensions.height);\r\n effect.setFloat(\"depthThreshold\", this.blurDepthThreshold);\r\n effect.setFloat(\"normalThreshold\", this.blurNormalThreshold);\r\n });\r\n\r\n this._upsamplingYPostprocess.resize(this._outputDimensions.width, this._outputDimensions.height);\r\n\r\n upsamplingRTWs.push(this._upsamplingYPostprocess.inputTexture);\r\n }\r\n\r\n upsamplingRTWs.push(this._blurRTT.renderTarget!);\r\n\r\n this._blurPostProcesses.push(this._upsamplingXPostprocess);\r\n if (this._upsamplingYPostprocess) {\r\n this._blurPostProcesses.push(this._upsamplingYPostprocess);\r\n }\r\n } else {\r\n blurRTWs.push(this._blurRTT.renderTarget!);\r\n }\r\n }\r\n\r\n this._debugLayer.texture?.dispose();\r\n this._debugLayer.texture = new BaseTexture(this._scene, this._enableBlur ? this._blurRTT!.renderTarget!.texture : this._ppGlobalIllumination[0].inputTexture.texture);\r\n }\r\n\r\n protected _addGISupportToMaterial(material: Material) {\r\n if (material.pluginManager?.getPlugin(GIRSMRenderPluginMaterial.Name)) {\r\n return;\r\n }\r\n\r\n const plugin = new GIRSMRenderPluginMaterial(material);\r\n\r\n if (this._enable && this._ppGlobalIllumination.length > 0) {\r\n plugin.textureGIContrib = this._ppGlobalIllumination[0].inputTexture.texture!;\r\n plugin.outputTextureWidth = this._outputDimensions.width;\r\n plugin.outputTextureHeight = this._outputDimensions.height;\r\n }\r\n\r\n plugin.isEnabled = this._enable;\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialGIRSMRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_GIRSM = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the global illumination contribution.\r\n */\r\nexport class GIRSMRenderPluginMaterial extends MaterialPluginBase {\r\n private _isPBR;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"GIRSMRender\";\r\n\r\n /**\r\n * The texture containing the global illumination contribution.\r\n */\r\n @serialize()\r\n public textureGIContrib: InternalTexture;\r\n\r\n /**\r\n * The width of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureWidth: number;\r\n\r\n /**\r\n * The height of the output texture.\r\n */\r\n @serialize()\r\n public outputTextureHeight: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, GIRSMRenderPluginMaterial.Name, 310, new MaterialGIRSMRenderDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._isPBR = material instanceof PBRBaseMaterial;\r\n }\r\n\r\n public override prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public override getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [{ name: \"girsmTextureOutputSize\", size: 2, type: \"vec2\" }],\r\n fragment: `#ifdef RENDER_WITH_GIRSM\r\n uniform vec2 girsmTextureOutputSize;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"girsmTextureGIContrib\", this.textureGIContrib);\r\n uniformBuffer.updateFloat2(\"girsmTextureOutputSize\", this.outputTextureWidth, this.outputTextureHeight);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n var girsmTextureGIContribSampler: sampler;\r\n var girsmTextureGIContrib: texture_2d<f32>;\r\n\r\n fn computeIndirect() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.girsmTextureOutputSize;\r\n return textureSample(girsmTextureGIContrib, girsmTextureGIContribSampler, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color = vec4f(color.rgb + computeIndirect() * baseColor.rgb, color.a);\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_GIRSM\r\n uniform sampler2D girsmTextureGIContrib;\r\n\r\n vec3 computeIndirect() {\r\n vec2 uv = gl_FragCoord.xy / girsmTextureOutputSize;\r\n return texture2D(girsmTextureGIContrib, uv).rgb;\r\n }\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: `\r\n #ifdef RENDER_WITH_GIRSM\r\n finalDiffuse += computeIndirect() * surfaceAlbedo.rgb;\r\n #endif\r\n `,\r\n };\r\n\r\n if (!this._isPBR) {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_GIRSM\r\n color.rgb += computeIndirect() * baseColor.rgb;\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.GIRSMRenderPluginMaterial`, GIRSMRenderPluginMaterial);\r\n"]}
@@ -27,6 +27,7 @@ fn computeAttenuationForIntersection(ihitPixel: vec2f,hitUV: vec2f,vsRayOrigin:
27
27
  var dCoords: vec2f=smoothstep(vec2f(0.2),vec2f(0.6),abs( vec2f(0.5,0.5)-hitUV.xy));attenuation*=clamp(1.0-(dCoords.x+dCoords.y),0.0,1.0);
28
28
  #endif
29
29
  #ifdef SSR_ATTENUATE_INTERSECTION_DISTANCE
30
+ attenuation*=1.0-clamp(distance(vsRayOrigin,vsHitPoint)/maxRayDistance,0.0,1.0);
30
31
  #endif
31
32
  #ifdef SSR_ATTENUATE_INTERSECTION_NUMITERATIONS
32
33
  attenuation*=1.0-(numIterations/uniforms.maxSteps);