@babylonjs/core 6.48.0 → 6.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.
- package/Behaviors/Meshes/baseSixDofDragBehavior.js +6 -6
- package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.d.ts +1 -0
- package/Behaviors/Meshes/sixDofDragBehavior.js +5 -1
- package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
- package/Engines/ICanvas.d.ts +10 -0
- package/Engines/ICanvas.js.map +1 -1
- package/Engines/Native/nativeDataStream.d.ts +2 -1
- package/Engines/Native/nativeDataStream.js.map +1 -1
- package/Engines/Native/nativePipelineContext.js.map +1 -1
- package/Engines/WebGL/webGLPipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +6 -4
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/nativeEngine.d.ts +2 -2
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -2
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +6 -0
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Maths/math.like.d.ts +2 -2
- package/Maths/math.like.js.map +1 -1
- package/Maths/math.vector.d.ts +1 -1
- package/Maths/math.vector.js.map +1 -1
- package/Maths/tensor.d.ts +12 -8
- package/Maths/tensor.js.map +1 -1
- package/Meshes/Compression/dracoCompression.d.ts +12 -0
- package/Meshes/Compression/dracoCompression.js +20 -14
- package/Meshes/Compression/dracoCompression.js.map +1 -1
- package/Meshes/Node/Blocks/geometryDistanceBlock.js +1 -0
- package/Meshes/Node/Blocks/geometryDistanceBlock.js.map +1 -1
- package/Meshes/Node/Blocks/geometryDotBlock.js +1 -0
- package/Meshes/Node/Blocks/geometryDotBlock.js.map +1 -1
- package/Meshes/Node/Blocks/geometryLengthBlock.js +1 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.js.map +1 -1
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +1 -0
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +5 -2
- package/Meshes/abstractMesh.js +5 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.d.ts +9 -0
- package/Meshes/thinInstanceMesh.js +31 -4
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Particles/pointsCloudSystem.js +26 -29
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.d.ts +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/reflectiveShadowMap.d.ts +5 -4
- package/Rendering/reflectiveShadowMap.js +1 -1
- package/Rendering/reflectiveShadowMap.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js +1 -1
- package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
- package/Shaders/pbr.vertex.js +1 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +11 -0
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/assets/Basis/basis_transcoder.wasm +0 -0
- package/assets/Draco/draco_decoder_gltf.wasm +0 -0
- package/package.json +2 -1
- package/types.d.ts +1 -1
- package/types.js.map +1 -1
|
@@ -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 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 { Engine } from \"core/Engines/engine\";\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 \"../../Shaders/bilateralBlur.fragment\";\r\nimport \"../../Shaders/bilateralBlurQuality.fragment\";\r\nimport \"../../Shaders/rsmGlobalIllumination.fragment\";\r\nimport \"../../Shaders/rsmFullGlobalIllumination.fragment\";\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: Engine;\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 eabled, 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 _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 /**\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 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 }\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.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 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 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 });\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 });\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 });\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 }\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 });\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 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 prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public 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 getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public 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 getCustomCode(shaderType: string) {\r\n const frag: { [name: string]: string } = {\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 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 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 { Engine } from \"core/Engines/engine\";\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 \"../../Shaders/bilateralBlur.fragment\";\r\nimport \"../../Shaders/bilateralBlurQuality.fragment\";\r\nimport \"../../Shaders/rsmGlobalIllumination.fragment\";\r\nimport \"../../Shaders/rsmFullGlobalIllumination.fragment\";\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: Engine;\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 _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 /**\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 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 }\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.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 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 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 });\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 });\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 });\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 }\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 });\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 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 prepareDefines(defines: MaterialGIRSMRenderDefines) {\r\n defines.RENDER_WITH_GIRSM = this._isEnabled;\r\n }\r\n\r\n public getClassName() {\r\n return \"GIRSMRenderPluginMaterial\";\r\n }\r\n\r\n public 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 getSamplers(samplers: string[]) {\r\n samplers.push(\"girsmTextureGIContrib\");\r\n }\r\n\r\n public 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 getCustomCode(shaderType: string) {\r\n const frag: { [name: string]: string } = {\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 return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.GIRSMRenderPluginMaterial`, GIRSMRenderPluginMaterial);\r\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ShadowLight } from "../Lights/shadowLight.js";
|
|
2
1
|
import type { UniformBuffer } from "../Materials/uniformBuffer.js";
|
|
3
2
|
import { Matrix } from "../Maths/math.vector.js";
|
|
4
3
|
import type { AbstractMesh } from "../Meshes/abstractMesh.js";
|
|
@@ -7,7 +6,9 @@ import { MaterialPluginBase } from "../Materials/materialPluginBase.js";
|
|
|
7
6
|
import type { Material } from "../Materials/material.js";
|
|
8
7
|
import type { StandardMaterial } from "../Materials/standardMaterial.js";
|
|
9
8
|
import { MaterialDefines } from "../Materials/materialDefines.js";
|
|
9
|
+
import type { SpotLight } from "../Lights/spotLight.js";
|
|
10
10
|
import { PBRBaseMaterial } from "../Materials/PBR/pbrBaseMaterial.js";
|
|
11
|
+
import type { DirectionalLight } from "../Lights/directionalLight.js";
|
|
11
12
|
/**
|
|
12
13
|
* Class used to generate the RSM (Reflective Shadow Map) textures for a given light.
|
|
13
14
|
* The textures are: position (in world space), normal (in world space) and flux (light intensity)
|
|
@@ -45,7 +46,7 @@ export declare class ReflectiveShadowMap {
|
|
|
45
46
|
/**
|
|
46
47
|
* Gets the light used to generate the RSM textures.
|
|
47
48
|
*/
|
|
48
|
-
get light():
|
|
49
|
+
get light(): DirectionalLight | SpotLight;
|
|
49
50
|
/**
|
|
50
51
|
* Gets or sets a boolean indicating if the light parameters should be recomputed even if the light parameters (position, direction) did not change.
|
|
51
52
|
* You should not set this value to true, except for debugging purpose (if you want to see changes from the inspector, for eg).
|
|
@@ -58,7 +59,7 @@ export declare class ReflectiveShadowMap {
|
|
|
58
59
|
* @param light The light to use to generate the RSM textures
|
|
59
60
|
* @param textureDimensions The dimensions of the textures to generate. Default: \{ width: 512, height: 512 \}
|
|
60
61
|
*/
|
|
61
|
-
constructor(scene: Scene, light:
|
|
62
|
+
constructor(scene: Scene, light: DirectionalLight | SpotLight, textureDimensions?: {
|
|
62
63
|
width: number;
|
|
63
64
|
height: number;
|
|
64
65
|
});
|
|
@@ -123,7 +124,7 @@ export declare class RSMCreatePluginMaterial extends MaterialPluginBase {
|
|
|
123
124
|
/**
|
|
124
125
|
* Defines the light that should be used to generate the RSM textures.
|
|
125
126
|
*/
|
|
126
|
-
light:
|
|
127
|
+
light: DirectionalLight | SpotLight;
|
|
127
128
|
private _isEnabled;
|
|
128
129
|
/**
|
|
129
130
|
* Defines if the plugin is enabled in the material.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "../tslib.es6.js";
|
|
2
2
|
/**
|
|
3
3
|
* Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger
|
|
4
|
-
* The ReflectiveShadowMap class only implements the
|
|
4
|
+
* The ReflectiveShadowMap class only implements the position / normal / flux texture generation part.
|
|
5
5
|
* For the global illumination effect, see the GIRSMManager class.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflectiveShadowMap.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/reflectiveShadowMap.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 * The ReflectiveShadowMap class only implements the geometry buffer generation part.\r\n * For the global illumination effect, see the GIRSMManager class.\r\n */\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { ShadowLight } from \"core/Lights/shadowLight\";\r\nimport { MultiRenderTarget } from \"core/Materials/Textures/multiRenderTarget\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport type { SpotLight } from \"core/Lights/spotLight\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Light } from \"core/Lights/light\";\r\n\r\n/**\r\n * Class used to generate the RSM (Reflective Shadow Map) textures for a given light.\r\n * The textures are: position (in world space), normal (in world space) and flux (light intensity)\r\n */\r\nexport class ReflectiveShadowMap {\r\n private _scene: Scene;\r\n private _light: ShadowLight;\r\n private _lightTransformMatrix: Matrix = Matrix.Identity();\r\n private _mrt: MultiRenderTarget;\r\n private _textureDimensions: { width: number; height: number };\r\n private _regularMatToMatWithPlugin: Map<Material, Material>;\r\n private _counters: Array<{ name: string; value: number }>;\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Enables or disables the RSM generation.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(value: boolean) {\r\n if (this._enable === value) {\r\n return;\r\n }\r\n\r\n this._enable = value;\r\n this._customRenderTarget(value);\r\n }\r\n\r\n /**\r\n * Gets the position texture generated by the RSM process.\r\n */\r\n public get positionWorldTexture() {\r\n return this._mrt.textures[0];\r\n }\r\n\r\n /**\r\n * Gets the normal texture generated by the RSM process.\r\n */\r\n public get normalWorldTexture() {\r\n return this._mrt.textures[1];\r\n }\r\n\r\n /**\r\n * Gets the flux texture generated by the RSM process.\r\n */\r\n public get fluxTexture() {\r\n return this._mrt.textures[2];\r\n }\r\n\r\n /**\r\n * Gets the render list used to generate the RSM textures.\r\n */\r\n public get renderList() {\r\n return this._mrt.renderList;\r\n }\r\n\r\n /**\r\n * Gets the light used to generate the RSM textures.\r\n */\r\n public get light() {\r\n return this._light;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the light parameters should be recomputed even if the light parameters (position, direction) did not change.\r\n * You should not set this value to true, except for debugging purpose (if you want to see changes from the inspector, for eg).\r\n * Instead, you should call updateLightParameters() explicitely at the right time (once the light parameters changed).\r\n */\r\n public forceUpdateLightParameters = false;\r\n\r\n /**\r\n * Creates a new RSM for the given light.\r\n * @param scene The scene\r\n * @param light The light to use to generate the RSM textures\r\n * @param textureDimensions The dimensions of the textures to generate. Default: \\{ width: 512, height: 512 \\}\r\n */\r\n constructor(scene: Scene, light: ShadowLight, textureDimensions = { width: 512, height: 512 }) {\r\n this._scene = scene;\r\n this._light = light;\r\n this._textureDimensions = textureDimensions;\r\n this._regularMatToMatWithPlugin = new Map();\r\n this._counters = [{ name: \"RSM Generation \" + light.name, value: 0 }];\r\n\r\n this._createMultiRenderTarget();\r\n this._recomputeLightTransformationMatrix();\r\n\r\n this.enable = true;\r\n }\r\n\r\n /**\r\n * Sets the dimensions of the textures to generate.\r\n * @param dimensions The dimensions of the textures to generate.\r\n */\r\n public setTextureDimensions(dimensions: { width: number; height: number }) {\r\n const renderList = this._mrt.renderList;\r\n\r\n this._textureDimensions = dimensions;\r\n this._disposeMultiRenderTarget();\r\n this._createMultiRenderTarget();\r\n\r\n renderList?.forEach((mesh) => {\r\n this._addMeshToMRT(mesh);\r\n });\r\n }\r\n\r\n /**\r\n * Adds the given mesh to the render list used to generate the RSM textures.\r\n * @param mesh The mesh to add to the render list used to generate the RSM textures. If not provided, all scene meshes will be added to the render list.\r\n */\r\n public addMesh(mesh?: AbstractMesh) {\r\n if (mesh) {\r\n this._addMeshToMRT(mesh);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n this._addMeshToMRT(mesh);\r\n });\r\n }\r\n this._recomputeLightTransformationMatrix();\r\n }\r\n\r\n /**\r\n * Recomputes the light transformation matrix. Call this method if you manually changed the light position / direction / etc. and you want to update the RSM textures accordingly.\r\n * You should also call this method if you add/remove meshes to/from the render list.\r\n */\r\n public updateLightParameters() {\r\n this._recomputeLightTransformationMatrix();\r\n }\r\n\r\n /**\r\n * Gets the light transformation matrix used to generate the RSM textures.\r\n */\r\n public get lightTransformationMatrix() {\r\n if (this.forceUpdateLightParameters) {\r\n this.updateLightParameters();\r\n }\r\n return this._lightTransformMatrix;\r\n }\r\n\r\n /**\r\n * Gets the GPU time spent to generate the RSM textures.\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 * Disposes the RSM.\r\n */\r\n public dispose() {\r\n this._disposeMultiRenderTarget();\r\n }\r\n\r\n protected _createMultiRenderTarget() {\r\n const name = this._light.name;\r\n\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n const fluxTextureType = caps.rg11b10ufColorRenderable ? Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV : Constants.TEXTURETYPE_HALF_FLOAT;\r\n const fluxTextureFormat = caps.rg11b10ufColorRenderable ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n this._mrt = new MultiRenderTarget(\r\n \"RSMmrt_\" + name,\r\n this._textureDimensions,\r\n 3, // number of RTT - position / normal / flux\r\n this._scene,\r\n {\r\n types: [Constants.TEXTURETYPE_HALF_FLOAT, Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, fluxTextureType],\r\n samplingModes: [Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURE_BILINEAR_SAMPLINGMODE],\r\n generateMipMaps: false,\r\n targetTypes: [Constants.TEXTURE_2D, Constants.TEXTURE_2D, Constants.TEXTURE_2D],\r\n formats: [Constants.TEXTUREFORMAT_RGBA, Constants.TEXTUREFORMAT_RGBA, fluxTextureFormat],\r\n },\r\n [\"RSMPosition_\" + name, \"RSMNormal_\" + name, \"RSMFlux_\" + name]\r\n );\r\n\r\n this._mrt.renderList = [];\r\n this._mrt.clearColor = new Color4(0, 0, 0, 1);\r\n this._mrt.noPrePassRenderer = true;\r\n\r\n let sceneUBO: UniformBuffer;\r\n let currentSceneUBO: UniformBuffer;\r\n\r\n const useUBO = this._scene.getEngine().supportsUniformBuffers;\r\n\r\n if (useUBO) {\r\n sceneUBO = this._scene.createSceneUniformBuffer(`Scene for RSM (light \"${name}\")`);\r\n }\r\n\r\n let shadowEnabled: boolean;\r\n\r\n this._mrt.onBeforeBindObservable.add(() => {\r\n currentSceneUBO = this._scene.getSceneUniformBuffer();\r\n shadowEnabled = this._light.shadowEnabled;\r\n this._light.shadowEnabled = false; // we render from the light point of view, so we won't have any shadow anyway!\r\n });\r\n\r\n this._mrt.onBeforeRenderObservable.add((faceIndex: number) => {\r\n if (sceneUBO) {\r\n this._scene.setSceneUniformBuffer(sceneUBO);\r\n }\r\n const viewMatrix = this._light.getViewMatrix(faceIndex);\r\n const projectionMatrix = this._light.getProjectionMatrix(viewMatrix || undefined, this._mrt.renderList || undefined);\r\n if (viewMatrix && projectionMatrix) {\r\n this._scene.setTransformMatrix(viewMatrix, projectionMatrix);\r\n }\r\n if (useUBO) {\r\n this._scene.getSceneUniformBuffer().unbindEffect();\r\n this._scene.finalizeSceneUbo();\r\n }\r\n });\r\n\r\n this._mrt.onAfterUnbindObservable.add(() => {\r\n if (sceneUBO) {\r\n this._scene.setSceneUniformBuffer(currentSceneUBO);\r\n }\r\n this._scene.updateTransformMatrix(); // restore the view/projection matrices of the active camera\r\n this._light.shadowEnabled = shadowEnabled;\r\n this._counters[0].value = (this._mrt.renderTarget as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n });\r\n\r\n this._customRenderTarget(true);\r\n }\r\n\r\n protected _customRenderTarget(add: boolean) {\r\n const idx = this._scene.customRenderTargets.indexOf(this._mrt);\r\n if (add) {\r\n if (idx === -1) {\r\n this._scene.customRenderTargets.push(this._mrt);\r\n }\r\n } else if (idx !== -1) {\r\n this._scene.customRenderTargets.splice(idx, 1);\r\n }\r\n }\r\n\r\n protected _recomputeLightTransformationMatrix() {\r\n const viewMatrix = this._light.getViewMatrix();\r\n const projectionMatrix = this._light.getProjectionMatrix(viewMatrix || undefined, this._mrt.renderList || undefined);\r\n if (viewMatrix && projectionMatrix) {\r\n viewMatrix.multiplyToRef(projectionMatrix, this._lightTransformMatrix);\r\n }\r\n }\r\n\r\n protected _addMeshToMRT(mesh: AbstractMesh) {\r\n this._mrt.renderList?.push(mesh);\r\n\r\n const material = mesh.material;\r\n if (mesh.getTotalVertices() === 0 || !material) {\r\n return;\r\n }\r\n\r\n let rsmMaterial = this._regularMatToMatWithPlugin.get(material);\r\n if (!rsmMaterial) {\r\n rsmMaterial = material.clone(\"RSMCreate_\" + material.name) || undefined;\r\n if (rsmMaterial) {\r\n // Disable the prepass renderer for this material\r\n Object.defineProperty(rsmMaterial, \"canRenderToMRT\", {\r\n get: function () {\r\n return false;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n (rsmMaterial as any).disableLighting = true;\r\n\r\n const rsmCreatePlugin = new RSMCreatePluginMaterial(rsmMaterial);\r\n\r\n rsmCreatePlugin.isEnabled = true;\r\n rsmCreatePlugin.light = this._light;\r\n\r\n this._regularMatToMatWithPlugin.set(material, rsmMaterial);\r\n }\r\n }\r\n\r\n this._mrt.setMaterialForRendering(mesh, rsmMaterial);\r\n }\r\n\r\n protected _disposeMultiRenderTarget() {\r\n this._customRenderTarget(false);\r\n this._mrt.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialRSMCreateDefines extends MaterialDefines {\r\n public RSMCREATE = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n public RSMCREATE_LIGHT_IS_SPOT = false;\r\n}\r\n\r\n/**\r\n * Plugin that implements the creation of the RSM textures\r\n */\r\nexport class RSMCreatePluginMaterial extends MaterialPluginBase {\r\n private _varAlbedoName: string;\r\n private _lightColor = new Color3();\r\n private _hasProjectionTexture = false;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"RSMCreate\";\r\n\r\n /**\r\n * Defines the light that should be used to generate the RSM textures.\r\n */\r\n @serialize()\r\n public light: ShadowLight;\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 * Create a new RSMCreatePluginMaterial\r\n * @param material Parent material of the plugin\r\n */\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, RSMCreatePluginMaterial.Name, 300, new MaterialRSMCreateDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._varAlbedoName = material instanceof PBRBaseMaterial ? \"surfaceAlbedo\" : \"baseColor.rgb\";\r\n }\r\n\r\n public prepareDefines(defines: MaterialRSMCreateDefines) {\r\n defines.RSMCREATE = this._isEnabled;\r\n\r\n this._hasProjectionTexture = false;\r\n\r\n const isSpot = this.light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT;\r\n if (isSpot) {\r\n const spot = this.light as SpotLight;\r\n this._hasProjectionTexture = spot.projectionTexture ? spot.projectionTexture.isReady() : false;\r\n }\r\n\r\n defines.RSMCREATE_PROJTEXTURE = this._hasProjectionTexture;\r\n defines.RSMCREATE_LIGHT_IS_SPOT = isSpot;\r\n }\r\n\r\n public getClassName() {\r\n return \"RSMCreatePluginMaterial\";\r\n }\r\n\r\n public getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"rsmTextureProjectionMatrix\", size: 16, type: \"mat4\" },\r\n { name: \"rsmSpotInfo\", size: 4, type: \"vec4\" },\r\n { name: \"rsmLightColor\", size: 3, type: \"vec3\" },\r\n { name: \"rsmLightPosition\", size: 3, type: \"vec3\" },\r\n ],\r\n fragment: `#ifdef RSMCREATE\r\n uniform mat4 rsmTextureProjectionMatrix;\r\n uniform vec4 rsmSpotInfo;\r\n uniform vec3 rsmLightColor;\r\n unfiorm vec3 rsmLightPosition;\r\n #endif`,\r\n };\r\n }\r\n\r\n public getSamplers(samplers: string[]) {\r\n samplers.push(\"rsmTextureProjectionSampler\");\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n\r\n this.light.diffuse.scaleToRef(this.light.getScaledIntensity(), this._lightColor);\r\n uniformBuffer.updateColor3(\"rsmLightColor\", this._lightColor);\r\n\r\n if (this.light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n const spot = this.light as SpotLight;\r\n\r\n if (this._hasProjectionTexture) {\r\n uniformBuffer.updateMatrix(\"rsmTextureProjectionMatrix\", spot.projectionTextureMatrix);\r\n uniformBuffer.setTexture(\"rsmTextureProjectionSampler\", spot.projectionTexture);\r\n }\r\n\r\n const normalizeDirection = TmpVectors.Vector3[0];\r\n\r\n if (spot.computeTransformedInformation()) {\r\n uniformBuffer.updateFloat3(\"rsmLightPosition\", this.light.transformedPosition.x, this.light.transformedPosition.y, this.light.transformedPosition.z);\r\n spot.transformedDirection.normalizeToRef(normalizeDirection);\r\n } else {\r\n uniformBuffer.updateFloat3(\"rsmLightPosition\", this.light.position.x, this.light.position.y, this.light.position.z);\r\n spot.direction.normalizeToRef(normalizeDirection);\r\n }\r\n\r\n uniformBuffer.updateFloat4(\"rsmSpotInfo\", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, Math.cos(spot.angle * 0.5));\r\n }\r\n }\r\n\r\n public getCustomCode(shaderType: string) {\r\n return shaderType === \"vertex\"\r\n ? null\r\n : {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEGIN: `\r\n #ifdef RSMCREATE\r\n #extension GL_EXT_draw_buffers : require\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RSMCREATE\r\n #ifdef RSMCREATE_PROJTEXTURE\r\n uniform highp sampler2D rsmTextureProjectionSampler; \r\n #endif\r\n layout(location = 0) out highp vec4 glFragData[3];\r\n vec4 glFragColor;\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\n #ifdef RSMCREATE\r\n vec3 rsmColor = ${this._varAlbedoName} * rsmLightColor;\r\n #ifdef RSMCREATE_PROJTEXTURE\r\n {\r\n vec4 strq = rsmTextureProjectionMatrix * vec4(vPositionW, 1.0);\r\n strq /= strq.w;\r\n rsmColor *= texture2D(rsmTextureProjectionSampler, strq.xy).rgb;\r\n }\r\n #endif\r\n #ifdef RSMCREATE_LIGHT_IS_SPOT\r\n {\r\n float cosAngle = max(0., dot(rsmSpotInfo.xyz, normalize(vPositionW - rsmLightPosition)));\r\n rsmColor = sign(cosAngle - rsmSpotInfo.w) * rsmColor;\r\n }\r\n #endif\r\n glFragData[0] = vec4(vPositionW, 1.);\r\n glFragData[1] = vec4(normalize(normalW) * 0.5 + 0.5, 1.);\r\n glFragData[2] = vec4(rsmColor, 1.);\r\n #endif\r\n `,\r\n };\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.RSMCreatePluginMaterial`, RSMCreatePluginMaterial);\r\n"]}
|
|
1
|
+
{"version":3,"file":"reflectiveShadowMap.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/reflectiveShadowMap.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 * The ReflectiveShadowMap class only implements the position / normal / flux texture generation part.\r\n * For the global illumination effect, see the GIRSMManager class.\r\n */\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { MultiRenderTarget } from \"core/Materials/Textures/multiRenderTarget\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { WebGPURenderTargetWrapper } from \"core/Engines/WebGPU/webgpuRenderTargetWrapper\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport type { SpotLight } from \"core/Lights/spotLight\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\n\r\n/**\r\n * Class used to generate the RSM (Reflective Shadow Map) textures for a given light.\r\n * The textures are: position (in world space), normal (in world space) and flux (light intensity)\r\n */\r\nexport class ReflectiveShadowMap {\r\n private _scene: Scene;\r\n private _light: DirectionalLight | SpotLight;\r\n private _lightTransformMatrix: Matrix = Matrix.Identity();\r\n private _mrt: MultiRenderTarget;\r\n private _textureDimensions: { width: number; height: number };\r\n private _regularMatToMatWithPlugin: Map<Material, Material>;\r\n private _counters: Array<{ name: string; value: number }>;\r\n\r\n private _enable = false;\r\n\r\n /**\r\n * Enables or disables the RSM generation.\r\n */\r\n public get enable() {\r\n return this._enable;\r\n }\r\n\r\n public set enable(value: boolean) {\r\n if (this._enable === value) {\r\n return;\r\n }\r\n\r\n this._enable = value;\r\n this._customRenderTarget(value);\r\n }\r\n\r\n /**\r\n * Gets the position texture generated by the RSM process.\r\n */\r\n public get positionWorldTexture() {\r\n return this._mrt.textures[0];\r\n }\r\n\r\n /**\r\n * Gets the normal texture generated by the RSM process.\r\n */\r\n public get normalWorldTexture() {\r\n return this._mrt.textures[1];\r\n }\r\n\r\n /**\r\n * Gets the flux texture generated by the RSM process.\r\n */\r\n public get fluxTexture() {\r\n return this._mrt.textures[2];\r\n }\r\n\r\n /**\r\n * Gets the render list used to generate the RSM textures.\r\n */\r\n public get renderList() {\r\n return this._mrt.renderList;\r\n }\r\n\r\n /**\r\n * Gets the light used to generate the RSM textures.\r\n */\r\n public get light() {\r\n return this._light;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the light parameters should be recomputed even if the light parameters (position, direction) did not change.\r\n * You should not set this value to true, except for debugging purpose (if you want to see changes from the inspector, for eg).\r\n * Instead, you should call updateLightParameters() explicitely at the right time (once the light parameters changed).\r\n */\r\n public forceUpdateLightParameters = false;\r\n\r\n /**\r\n * Creates a new RSM for the given light.\r\n * @param scene The scene\r\n * @param light The light to use to generate the RSM textures\r\n * @param textureDimensions The dimensions of the textures to generate. Default: \\{ width: 512, height: 512 \\}\r\n */\r\n constructor(scene: Scene, light: DirectionalLight | SpotLight, textureDimensions = { width: 512, height: 512 }) {\r\n this._scene = scene;\r\n this._light = light;\r\n this._textureDimensions = textureDimensions;\r\n this._regularMatToMatWithPlugin = new Map();\r\n this._counters = [{ name: \"RSM Generation \" + light.name, value: 0 }];\r\n\r\n this._createMultiRenderTarget();\r\n this._recomputeLightTransformationMatrix();\r\n\r\n this.enable = true;\r\n }\r\n\r\n /**\r\n * Sets the dimensions of the textures to generate.\r\n * @param dimensions The dimensions of the textures to generate.\r\n */\r\n public setTextureDimensions(dimensions: { width: number; height: number }) {\r\n const renderList = this._mrt.renderList;\r\n\r\n this._textureDimensions = dimensions;\r\n this._disposeMultiRenderTarget();\r\n this._createMultiRenderTarget();\r\n\r\n renderList?.forEach((mesh) => {\r\n this._addMeshToMRT(mesh);\r\n });\r\n }\r\n\r\n /**\r\n * Adds the given mesh to the render list used to generate the RSM textures.\r\n * @param mesh The mesh to add to the render list used to generate the RSM textures. If not provided, all scene meshes will be added to the render list.\r\n */\r\n public addMesh(mesh?: AbstractMesh) {\r\n if (mesh) {\r\n this._addMeshToMRT(mesh);\r\n } else {\r\n this._scene.meshes.forEach((mesh) => {\r\n this._addMeshToMRT(mesh);\r\n });\r\n }\r\n this._recomputeLightTransformationMatrix();\r\n }\r\n\r\n /**\r\n * Recomputes the light transformation matrix. Call this method if you manually changed the light position / direction / etc. and you want to update the RSM textures accordingly.\r\n * You should also call this method if you add/remove meshes to/from the render list.\r\n */\r\n public updateLightParameters() {\r\n this._recomputeLightTransformationMatrix();\r\n }\r\n\r\n /**\r\n * Gets the light transformation matrix used to generate the RSM textures.\r\n */\r\n public get lightTransformationMatrix() {\r\n if (this.forceUpdateLightParameters) {\r\n this.updateLightParameters();\r\n }\r\n return this._lightTransformMatrix;\r\n }\r\n\r\n /**\r\n * Gets the GPU time spent to generate the RSM textures.\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 * Disposes the RSM.\r\n */\r\n public dispose() {\r\n this._disposeMultiRenderTarget();\r\n }\r\n\r\n protected _createMultiRenderTarget() {\r\n const name = this._light.name;\r\n\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n const fluxTextureType = caps.rg11b10ufColorRenderable ? Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV : Constants.TEXTURETYPE_HALF_FLOAT;\r\n const fluxTextureFormat = caps.rg11b10ufColorRenderable ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n this._mrt = new MultiRenderTarget(\r\n \"RSMmrt_\" + name,\r\n this._textureDimensions,\r\n 3, // number of RTT - position / normal / flux\r\n this._scene,\r\n {\r\n types: [Constants.TEXTURETYPE_HALF_FLOAT, Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV, fluxTextureType],\r\n samplingModes: [Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURE_BILINEAR_SAMPLINGMODE, Constants.TEXTURE_BILINEAR_SAMPLINGMODE],\r\n generateMipMaps: false,\r\n targetTypes: [Constants.TEXTURE_2D, Constants.TEXTURE_2D, Constants.TEXTURE_2D],\r\n formats: [Constants.TEXTUREFORMAT_RGBA, Constants.TEXTUREFORMAT_RGBA, fluxTextureFormat],\r\n },\r\n [\"RSMPosition_\" + name, \"RSMNormal_\" + name, \"RSMFlux_\" + name]\r\n );\r\n\r\n this._mrt.renderList = [];\r\n this._mrt.clearColor = new Color4(0, 0, 0, 1);\r\n this._mrt.noPrePassRenderer = true;\r\n\r\n let sceneUBO: UniformBuffer;\r\n let currentSceneUBO: UniformBuffer;\r\n\r\n const useUBO = this._scene.getEngine().supportsUniformBuffers;\r\n\r\n if (useUBO) {\r\n sceneUBO = this._scene.createSceneUniformBuffer(`Scene for RSM (light \"${name}\")`);\r\n }\r\n\r\n let shadowEnabled: boolean;\r\n\r\n this._mrt.onBeforeBindObservable.add(() => {\r\n currentSceneUBO = this._scene.getSceneUniformBuffer();\r\n shadowEnabled = this._light.shadowEnabled;\r\n this._light.shadowEnabled = false; // we render from the light point of view, so we won't have any shadow anyway!\r\n });\r\n\r\n this._mrt.onBeforeRenderObservable.add((faceIndex: number) => {\r\n if (sceneUBO) {\r\n this._scene.setSceneUniformBuffer(sceneUBO);\r\n }\r\n const viewMatrix = this._light.getViewMatrix(faceIndex);\r\n const projectionMatrix = this._light.getProjectionMatrix(viewMatrix || undefined, this._mrt.renderList || undefined);\r\n if (viewMatrix && projectionMatrix) {\r\n this._scene.setTransformMatrix(viewMatrix, projectionMatrix);\r\n }\r\n if (useUBO) {\r\n this._scene.getSceneUniformBuffer().unbindEffect();\r\n this._scene.finalizeSceneUbo();\r\n }\r\n });\r\n\r\n this._mrt.onAfterUnbindObservable.add(() => {\r\n if (sceneUBO) {\r\n this._scene.setSceneUniformBuffer(currentSceneUBO);\r\n }\r\n this._scene.updateTransformMatrix(); // restore the view/projection matrices of the active camera\r\n this._light.shadowEnabled = shadowEnabled;\r\n this._counters[0].value = (this._mrt.renderTarget as WebGPURenderTargetWrapper).gpuTimeInFrame?.counter.lastSecAverage ?? 0;\r\n });\r\n\r\n this._customRenderTarget(true);\r\n }\r\n\r\n protected _customRenderTarget(add: boolean) {\r\n const idx = this._scene.customRenderTargets.indexOf(this._mrt);\r\n if (add) {\r\n if (idx === -1) {\r\n this._scene.customRenderTargets.push(this._mrt);\r\n }\r\n } else if (idx !== -1) {\r\n this._scene.customRenderTargets.splice(idx, 1);\r\n }\r\n }\r\n\r\n protected _recomputeLightTransformationMatrix() {\r\n const viewMatrix = this._light.getViewMatrix();\r\n const projectionMatrix = this._light.getProjectionMatrix(viewMatrix || undefined, this._mrt.renderList || undefined);\r\n if (viewMatrix && projectionMatrix) {\r\n viewMatrix.multiplyToRef(projectionMatrix, this._lightTransformMatrix);\r\n }\r\n }\r\n\r\n protected _addMeshToMRT(mesh: AbstractMesh) {\r\n this._mrt.renderList?.push(mesh);\r\n\r\n const material = mesh.material;\r\n if (mesh.getTotalVertices() === 0 || !material) {\r\n return;\r\n }\r\n\r\n let rsmMaterial = this._regularMatToMatWithPlugin.get(material);\r\n if (!rsmMaterial) {\r\n rsmMaterial = material.clone(\"RSMCreate_\" + material.name) || undefined;\r\n if (rsmMaterial) {\r\n // Disable the prepass renderer for this material\r\n Object.defineProperty(rsmMaterial, \"canRenderToMRT\", {\r\n get: function () {\r\n return false;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n (rsmMaterial as any).disableLighting = true;\r\n\r\n const rsmCreatePlugin = new RSMCreatePluginMaterial(rsmMaterial);\r\n\r\n rsmCreatePlugin.isEnabled = true;\r\n rsmCreatePlugin.light = this._light;\r\n\r\n this._regularMatToMatWithPlugin.set(material, rsmMaterial);\r\n }\r\n }\r\n\r\n this._mrt.setMaterialForRendering(mesh, rsmMaterial);\r\n }\r\n\r\n protected _disposeMultiRenderTarget() {\r\n this._customRenderTarget(false);\r\n this._mrt.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass MaterialRSMCreateDefines extends MaterialDefines {\r\n public RSMCREATE = false;\r\n public RSMCREATE_PROJTEXTURE = false;\r\n public RSMCREATE_LIGHT_IS_SPOT = false;\r\n}\r\n\r\n/**\r\n * Plugin that implements the creation of the RSM textures\r\n */\r\nexport class RSMCreatePluginMaterial extends MaterialPluginBase {\r\n private _varAlbedoName: string;\r\n private _lightColor = new Color3();\r\n private _hasProjectionTexture = false;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"RSMCreate\";\r\n\r\n /**\r\n * Defines the light that should be used to generate the RSM textures.\r\n */\r\n @serialize()\r\n public light: DirectionalLight | SpotLight;\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 * Create a new RSMCreatePluginMaterial\r\n * @param material Parent material of the plugin\r\n */\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, RSMCreatePluginMaterial.Name, 300, new MaterialRSMCreateDefines());\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n\r\n this._varAlbedoName = material instanceof PBRBaseMaterial ? \"surfaceAlbedo\" : \"baseColor.rgb\";\r\n }\r\n\r\n public prepareDefines(defines: MaterialRSMCreateDefines) {\r\n defines.RSMCREATE = this._isEnabled;\r\n\r\n this._hasProjectionTexture = false;\r\n\r\n const isSpot = this.light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT;\r\n if (isSpot) {\r\n const spot = this.light as SpotLight;\r\n this._hasProjectionTexture = spot.projectionTexture ? spot.projectionTexture.isReady() : false;\r\n }\r\n\r\n defines.RSMCREATE_PROJTEXTURE = this._hasProjectionTexture;\r\n defines.RSMCREATE_LIGHT_IS_SPOT = isSpot;\r\n }\r\n\r\n public getClassName() {\r\n return \"RSMCreatePluginMaterial\";\r\n }\r\n\r\n public getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"rsmTextureProjectionMatrix\", size: 16, type: \"mat4\" },\r\n { name: \"rsmSpotInfo\", size: 4, type: \"vec4\" },\r\n { name: \"rsmLightColor\", size: 3, type: \"vec3\" },\r\n { name: \"rsmLightPosition\", size: 3, type: \"vec3\" },\r\n ],\r\n fragment: `#ifdef RSMCREATE\r\n uniform mat4 rsmTextureProjectionMatrix;\r\n uniform vec4 rsmSpotInfo;\r\n uniform vec3 rsmLightColor;\r\n unfiorm vec3 rsmLightPosition;\r\n #endif`,\r\n };\r\n }\r\n\r\n public getSamplers(samplers: string[]) {\r\n samplers.push(\"rsmTextureProjectionSampler\");\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n\r\n this.light.diffuse.scaleToRef(this.light.getScaledIntensity(), this._lightColor);\r\n uniformBuffer.updateColor3(\"rsmLightColor\", this._lightColor);\r\n\r\n if (this.light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n const spot = this.light as SpotLight;\r\n\r\n if (this._hasProjectionTexture) {\r\n uniformBuffer.updateMatrix(\"rsmTextureProjectionMatrix\", spot.projectionTextureMatrix);\r\n uniformBuffer.setTexture(\"rsmTextureProjectionSampler\", spot.projectionTexture);\r\n }\r\n\r\n const normalizeDirection = TmpVectors.Vector3[0];\r\n\r\n if (spot.computeTransformedInformation()) {\r\n uniformBuffer.updateFloat3(\"rsmLightPosition\", this.light.transformedPosition.x, this.light.transformedPosition.y, this.light.transformedPosition.z);\r\n spot.transformedDirection.normalizeToRef(normalizeDirection);\r\n } else {\r\n uniformBuffer.updateFloat3(\"rsmLightPosition\", this.light.position.x, this.light.position.y, this.light.position.z);\r\n spot.direction.normalizeToRef(normalizeDirection);\r\n }\r\n\r\n uniformBuffer.updateFloat4(\"rsmSpotInfo\", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, Math.cos(spot.angle * 0.5));\r\n }\r\n }\r\n\r\n public getCustomCode(shaderType: string) {\r\n return shaderType === \"vertex\"\r\n ? null\r\n : {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEGIN: `\r\n #ifdef RSMCREATE\r\n #extension GL_EXT_draw_buffers : require\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RSMCREATE\r\n #ifdef RSMCREATE_PROJTEXTURE\r\n uniform highp sampler2D rsmTextureProjectionSampler; \r\n #endif\r\n layout(location = 0) out highp vec4 glFragData[3];\r\n vec4 glFragColor;\r\n #endif\r\n `,\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\n #ifdef RSMCREATE\r\n vec3 rsmColor = ${this._varAlbedoName} * rsmLightColor;\r\n #ifdef RSMCREATE_PROJTEXTURE\r\n {\r\n vec4 strq = rsmTextureProjectionMatrix * vec4(vPositionW, 1.0);\r\n strq /= strq.w;\r\n rsmColor *= texture2D(rsmTextureProjectionSampler, strq.xy).rgb;\r\n }\r\n #endif\r\n #ifdef RSMCREATE_LIGHT_IS_SPOT\r\n {\r\n float cosAngle = max(0., dot(rsmSpotInfo.xyz, normalize(vPositionW - rsmLightPosition)));\r\n rsmColor = sign(cosAngle - rsmSpotInfo.w) * rsmColor;\r\n }\r\n #endif\r\n glFragData[0] = vec4(vPositionW, 1.);\r\n glFragData[1] = vec4(normalize(normalW) * 0.5 + 0.5, 1.);\r\n glFragData[2] = vec4(rsmColor, 1.);\r\n #endif\r\n `,\r\n };\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.RSMCreatePluginMaterial`, RSMCreatePluginMaterial);\r\n"]}
|
|
@@ -144,7 +144,7 @@ gl_FragColor.rgb=vEmissiveColor.rgb;
|
|
|
144
144
|
#define DEBUGMODE_GAMMA
|
|
145
145
|
#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)
|
|
146
146
|
gl_FragColor.rgb=vec3(seo);
|
|
147
|
-
#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION)
|
|
147
|
+
#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)
|
|
148
148
|
gl_FragColor.rgb=vec3(eho);
|
|
149
149
|
#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)
|
|
150
150
|
gl_FragColor.rgb=vec3(energyConservationFactor);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbrDebug.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrDebug.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsLd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrDebug\";\nconst shader = `#if DEBUGMODE>0\nif (vClipSpacePosition.x/vClipSpacePosition.w>=vDebugMode.x) {\n#if DEBUGMODE==1\ngl_FragColor.rgb=vPositionW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==2 && defined(NORMAL)\ngl_FragColor.rgb=vNormalW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==3 && defined(BUMP) || DEBUGMODE==3 && defined(PARALLAX) || DEBUGMODE==3 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==4 && defined(BUMP) || DEBUGMODE==4 && defined(PARALLAX) || DEBUGMODE==4 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==5\ngl_FragColor.rgb=normalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==6 && defined(MAINUV1)\ngl_FragColor.rgb=vec3(vMainUV1,0.0);\n#elif DEBUGMODE==7 && defined(MAINUV2)\ngl_FragColor.rgb=vec3(vMainUV2,0.0);\n#elif DEBUGMODE==8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==10 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearcoatOut.clearCoatNormalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==11 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicNormal;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==12 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicTangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==13 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicBitangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==20 && defined(ALBEDO)\ngl_FragColor.rgb=albedoTexture.rgb;\n#ifndef GAMMAALBEDO\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==21 && defined(AMBIENT)\ngl_FragColor.rgb=aoOut.ambientOcclusionColorMap.rgb;\n#elif DEBUGMODE==22 && defined(OPACITY)\ngl_FragColor.rgb=opacityMap.rgb;\n#elif DEBUGMODE==23 && defined(EMISSIVE)\ngl_FragColor.rgb=emissiveColorTex.rgb;\n#ifndef GAMMAEMISSIVE\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==24 && defined(LIGHTMAP)\ngl_FragColor.rgb=lightmapColor.rgb;\n#ifndef GAMMALIGHTMAP\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceMetallicColorMap.rgb;\n#elif DEBUGMODE==26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceReflectivityColorMap.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatMapData.rg,0.0);\n#elif DEBUGMODE==28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\ngl_FragColor.rgb=clearcoatOut.clearCoatTintMapData.rgb;\n#elif DEBUGMODE==29 && defined(SHEEN) && defined(SHEEN_TEXTURE)\ngl_FragColor.rgb=sheenOut.sheenMapData.rgb;\n#elif DEBUGMODE==30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)\ngl_FragColor.rgb=anisotropicOut.anisotropyMapData.rgb;\n#elif DEBUGMODE==31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)\ngl_FragColor.rgb=subSurfaceOut.thicknessMap.rgb;\n#elif DEBUGMODE==32 && defined(BUMP)\ngl_FragColor.rgb=texture2D(bumpSampler,vBumpUV).rgb;\n#elif DEBUGMODE==40 && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.environmentRefraction.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==41 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentRadiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==42 && defined(CLEARCOAT) && defined(REFLECTION)\ngl_FragColor.rgb=clearcoatOut.environmentClearCoatRadiance.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==50\ngl_FragColor.rgb=diffuseBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==51 && defined(SPECULARTERM)\ngl_FragColor.rgb=specularBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==52 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearCoatBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==53 && defined(SHEEN)\ngl_FragColor.rgb=sheenBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==54 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentIrradiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==60\ngl_FragColor.rgb=surfaceAlbedo.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==61\ngl_FragColor.rgb=clearcoatOut.specularEnvironmentR0;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==62 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vec3(reflectivityOut.metallicRoughness.r);\n#elif DEBUGMODE==71 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.metallicF0;\n#elif DEBUGMODE==63\ngl_FragColor.rgb=vec3(roughness);\n#elif DEBUGMODE==64\ngl_FragColor.rgb=vec3(alphaG);\n#elif DEBUGMODE==65\ngl_FragColor.rgb=vec3(NdotV);\n#elif DEBUGMODE==66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\ngl_FragColor.rgb=clearcoatOut.clearCoatColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==67 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatRoughness);\n#elif DEBUGMODE==68 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatNdotV);\n#elif DEBUGMODE==69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)\ngl_FragColor.rgb=subSurfaceOut.transmittance;\n#elif DEBUGMODE==70 && defined(SUBSURFACE) && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.refractionTransmittance;\n#elif DEBUGMODE==72\ngl_FragColor.rgb=vec3(microSurface);\n#elif DEBUGMODE==73\ngl_FragColor.rgb=vAlbedoColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==74 && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vReflectivityColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==75\ngl_FragColor.rgb=vEmissiveColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)\ngl_FragColor.rgb=vec3(seo);\n#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION)\ngl_FragColor.rgb=vec3(eho);\n#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)\ngl_FragColor.rgb=vec3(energyConservationFactor);\n#elif DEBUGMODE==83 && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=specularEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=clearcoatOut.clearCoatEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==85 && defined(SHEEN) && defined(REFLECTION)\ngl_FragColor.rgb=sheenOut.sheenEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==86 && defined(ALPHABLEND)\ngl_FragColor.rgb=vec3(luminanceOverAlpha);\n#elif DEBUGMODE==87\ngl_FragColor.rgb=vec3(alpha);\n#elif DEBUGMODE==88 && defined(ALBEDO)\ngl_FragColor.rgb=vec3(albedoTexture.a);\n#else\nfloat stripeWidth=30.;float stripePos=floor((gl_FragCoord.x+gl_FragCoord.y)/stripeWidth);float whichColor=mod(stripePos,2.);vec3 color1=vec3(.6,.2,.2);vec3 color2=vec3(.3,.1,.1);gl_FragColor.rgb=mix(color1,color2,whichColor);\n#endif\ngl_FragColor.rgb*=vDebugMode.y;\n#ifdef DEBUGMODE_NORMALIZE\ngl_FragColor.rgb=normalize(gl_FragColor.rgb)*0.5+0.5;\n#endif\n#ifdef DEBUGMODE_GAMMA\ngl_FragColor.rgb=toGammaSpace(gl_FragColor.rgb);\n#endif\ngl_FragColor.a=1.0;\n#ifdef PREPASS\ngl_FragData[0]=toLinearSpace(gl_FragColor); \ngl_FragData[1]=vec4(0.,0.,0.,0.); \n#endif\n#ifdef DEBUGMODE_FORCERETURN\nreturn;\n#endif\n}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const pbrDebug = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"pbrDebug.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrDebug.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsLd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrDebug\";\nconst shader = `#if DEBUGMODE>0\nif (vClipSpacePosition.x/vClipSpacePosition.w>=vDebugMode.x) {\n#if DEBUGMODE==1\ngl_FragColor.rgb=vPositionW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==2 && defined(NORMAL)\ngl_FragColor.rgb=vNormalW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==3 && defined(BUMP) || DEBUGMODE==3 && defined(PARALLAX) || DEBUGMODE==3 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==4 && defined(BUMP) || DEBUGMODE==4 && defined(PARALLAX) || DEBUGMODE==4 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==5\ngl_FragColor.rgb=normalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==6 && defined(MAINUV1)\ngl_FragColor.rgb=vec3(vMainUV1,0.0);\n#elif DEBUGMODE==7 && defined(MAINUV2)\ngl_FragColor.rgb=vec3(vMainUV2,0.0);\n#elif DEBUGMODE==8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==10 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearcoatOut.clearCoatNormalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==11 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicNormal;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==12 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicTangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==13 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicBitangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==20 && defined(ALBEDO)\ngl_FragColor.rgb=albedoTexture.rgb;\n#ifndef GAMMAALBEDO\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==21 && defined(AMBIENT)\ngl_FragColor.rgb=aoOut.ambientOcclusionColorMap.rgb;\n#elif DEBUGMODE==22 && defined(OPACITY)\ngl_FragColor.rgb=opacityMap.rgb;\n#elif DEBUGMODE==23 && defined(EMISSIVE)\ngl_FragColor.rgb=emissiveColorTex.rgb;\n#ifndef GAMMAEMISSIVE\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==24 && defined(LIGHTMAP)\ngl_FragColor.rgb=lightmapColor.rgb;\n#ifndef GAMMALIGHTMAP\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceMetallicColorMap.rgb;\n#elif DEBUGMODE==26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceReflectivityColorMap.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatMapData.rg,0.0);\n#elif DEBUGMODE==28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\ngl_FragColor.rgb=clearcoatOut.clearCoatTintMapData.rgb;\n#elif DEBUGMODE==29 && defined(SHEEN) && defined(SHEEN_TEXTURE)\ngl_FragColor.rgb=sheenOut.sheenMapData.rgb;\n#elif DEBUGMODE==30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)\ngl_FragColor.rgb=anisotropicOut.anisotropyMapData.rgb;\n#elif DEBUGMODE==31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)\ngl_FragColor.rgb=subSurfaceOut.thicknessMap.rgb;\n#elif DEBUGMODE==32 && defined(BUMP)\ngl_FragColor.rgb=texture2D(bumpSampler,vBumpUV).rgb;\n#elif DEBUGMODE==40 && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.environmentRefraction.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==41 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentRadiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==42 && defined(CLEARCOAT) && defined(REFLECTION)\ngl_FragColor.rgb=clearcoatOut.environmentClearCoatRadiance.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==50\ngl_FragColor.rgb=diffuseBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==51 && defined(SPECULARTERM)\ngl_FragColor.rgb=specularBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==52 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearCoatBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==53 && defined(SHEEN)\ngl_FragColor.rgb=sheenBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==54 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentIrradiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==60\ngl_FragColor.rgb=surfaceAlbedo.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==61\ngl_FragColor.rgb=clearcoatOut.specularEnvironmentR0;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==62 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vec3(reflectivityOut.metallicRoughness.r);\n#elif DEBUGMODE==71 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.metallicF0;\n#elif DEBUGMODE==63\ngl_FragColor.rgb=vec3(roughness);\n#elif DEBUGMODE==64\ngl_FragColor.rgb=vec3(alphaG);\n#elif DEBUGMODE==65\ngl_FragColor.rgb=vec3(NdotV);\n#elif DEBUGMODE==66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\ngl_FragColor.rgb=clearcoatOut.clearCoatColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==67 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatRoughness);\n#elif DEBUGMODE==68 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatNdotV);\n#elif DEBUGMODE==69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)\ngl_FragColor.rgb=subSurfaceOut.transmittance;\n#elif DEBUGMODE==70 && defined(SUBSURFACE) && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.refractionTransmittance;\n#elif DEBUGMODE==72\ngl_FragColor.rgb=vec3(microSurface);\n#elif DEBUGMODE==73\ngl_FragColor.rgb=vAlbedoColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==74 && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vReflectivityColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==75\ngl_FragColor.rgb=vEmissiveColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)\ngl_FragColor.rgb=vec3(seo);\n#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\ngl_FragColor.rgb=vec3(eho);\n#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)\ngl_FragColor.rgb=vec3(energyConservationFactor);\n#elif DEBUGMODE==83 && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=specularEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=clearcoatOut.clearCoatEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==85 && defined(SHEEN) && defined(REFLECTION)\ngl_FragColor.rgb=sheenOut.sheenEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==86 && defined(ALPHABLEND)\ngl_FragColor.rgb=vec3(luminanceOverAlpha);\n#elif DEBUGMODE==87\ngl_FragColor.rgb=vec3(alpha);\n#elif DEBUGMODE==88 && defined(ALBEDO)\ngl_FragColor.rgb=vec3(albedoTexture.a);\n#else\nfloat stripeWidth=30.;float stripePos=floor((gl_FragCoord.x+gl_FragCoord.y)/stripeWidth);float whichColor=mod(stripePos,2.);vec3 color1=vec3(.6,.2,.2);vec3 color2=vec3(.3,.1,.1);gl_FragColor.rgb=mix(color1,color2,whichColor);\n#endif\ngl_FragColor.rgb*=vDebugMode.y;\n#ifdef DEBUGMODE_NORMALIZE\ngl_FragColor.rgb=normalize(gl_FragColor.rgb)*0.5+0.5;\n#endif\n#ifdef DEBUGMODE_GAMMA\ngl_FragColor.rgb=toGammaSpace(gl_FragColor.rgb);\n#endif\ngl_FragColor.a=1.0;\n#ifdef PREPASS\ngl_FragData[0]=toLinearSpace(gl_FragColor); \ngl_FragData[1]=vec4(0.,0.,0.,0.); \n#endif\n#ifdef DEBUGMODE_FORCERETURN\nreturn;\n#endif\n}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const pbrDebug = { name, shader };\n"]}
|
package/Shaders/pbr.vertex.js
CHANGED
|
@@ -207,7 +207,7 @@ vMainUV1=uvUpdated;
|
|
|
207
207
|
#endif
|
|
208
208
|
#ifdef SHEEN
|
|
209
209
|
#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)
|
|
210
|
-
#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,
|
|
210
|
+
#include<samplerVertexImplementation>(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheenRoughness,_INFONAME_,SheenInfos.z)
|
|
211
211
|
#endif
|
|
212
212
|
#ifdef ANISOTROPIC
|
|
213
213
|
#include<samplerVertexImplementation>(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)
|