@babylonjs/core 9.12.1 → 9.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/runtimeAnimation.js +11 -0
- package/Animations/runtimeAnimation.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSound.d.ts +2 -1
- package/AudioV2/abstractAudio/abstractSound.js +3 -2
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundInstance.d.ts +1 -1
- package/AudioV2/abstractAudio/abstractSoundInstance.js.map +1 -1
- package/AudioV2/abstractAudio/staticSound.d.ts +6 -0
- package/AudioV2/abstractAudio/staticSound.js +9 -1
- package/AudioV2/abstractAudio/staticSound.js.map +1 -1
- package/AudioV2/abstractAudio/streamingSound.d.ts +6 -0
- package/AudioV2/abstractAudio/streamingSound.js +9 -1
- package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.d.ts +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +6 -3
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.d.ts +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +7 -4
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.js +9 -3
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Cameras/targetCamera.pure.js +18 -18
- package/Cameras/targetCamera.pure.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +111 -4
- package/Collisions/gpuPicker.js +696 -119
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +4 -2
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +3 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +24 -1
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.videoTexture.pure.js +16 -3
- package/Engines/WebGPU/Extensions/engine.videoTexture.pure.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +8 -1
- package/Engines/abstractEngine.pure.js +4 -3
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.d.ts +113 -0
- package/Engines/nullEngine.pure.js +5 -1
- package/Engines/nullEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +5 -0
- package/Engines/thinNativeEngine.pure.js +158 -13
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/FlowGraph/flowGraph.js +9 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.pure.d.ts +14 -0
- package/FlowGraph/flowGraphDataConnection.pure.js +38 -1
- package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +11 -0
- package/FlowGraph/serialization.js +11 -1
- package/FlowGraph/serialization.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +2 -2
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +43 -51
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.d.ts +0 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +63 -35
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.d.ts +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.js +2 -2
- package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
- package/Lights/areaLight.pure.js +5 -0
- package/Lights/areaLight.pure.js.map +1 -1
- package/Lights/light.d.ts +4 -2
- package/Lights/light.js +10 -4
- package/Lights/light.js.map +1 -1
- package/Lights/rectAreaLight.pure.d.ts +17 -0
- package/Lights/rectAreaLight.pure.js +67 -0
- package/Lights/rectAreaLight.pure.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.pure.js +1 -1
- package/Loading/Plugins/babylonFileLoader.pure.js.map +1 -1
- package/Loading/sceneLoader.d.ts +5 -1
- package/Loading/sceneLoader.js +298 -401
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.d.ts +15 -0
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +34 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +9 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +26 -2
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +3 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +43 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +64 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -0
- package/Materials/Textures/HTML/htmlInteractionManager.d.ts +69 -0
- package/Materials/Textures/HTML/htmlInteractionManager.js +130 -0
- package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.d.ts +84 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.js +246 -0
- package/Materials/Textures/HTML/htmlRaycastInteractionManager.js.map +1 -0
- package/Materials/Textures/HTML/htmlTexture.d.ts +148 -0
- package/Materials/Textures/HTML/htmlTexture.js +455 -0
- package/Materials/Textures/HTML/htmlTexture.js.map +1 -0
- package/Materials/Textures/HTML/index.d.ts +4 -0
- package/Materials/Textures/HTML/index.js +5 -0
- package/Materials/Textures/HTML/index.js.map +1 -0
- package/Materials/Textures/HTML/pure.d.ts +5 -0
- package/Materials/Textures/HTML/pure.js +6 -0
- package/Materials/Textures/HTML/pure.js.map +1 -0
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -1
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/pure.d.ts +1 -0
- package/Materials/Textures/pure.js +1 -0
- package/Materials/Textures/pure.js.map +1 -1
- package/Materials/Textures/videoTexture.pure.d.ts +3 -0
- package/Materials/Textures/videoTexture.pure.js +30 -0
- package/Materials/Textures/videoTexture.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +36 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +56 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.d.ts +3 -1
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js +210 -48
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +34 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +1 -0
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/gaussianSplatting.fragment.js +17 -1
- package/Shaders/gaussianSplatting.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +1 -1
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
- package/Shaders/picking.fragment.js +39 -3
- package/Shaders/picking.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +3 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +4 -3
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js +14 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/picking.fragment.js +22 -1
- package/ShadersWGSL/picking.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsVoxelRenderer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine.pure\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget.pure\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture.pure\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color.pure\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector.pure\";\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\nimport { type Scene } from \"../../scene.pure\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture.pure\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer.pure\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline.pure\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n // View matrices for the three voxelization axes.\n private static readonly _VOXEL_VIEW_MATRICES = [\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),\n ];\n\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */\n private _gsVoxelMaterialCache: Map<number, ShaderMaterial> = new Map();\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._triPlanarVoxelization = enabled;\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {\n allReady &&= gsVoxelMat.isReady();\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n // Clear the voxel grid storage texture.\n // Need to clear each layer individually.\n // Would a compute shader be faster here to clear all layers in one go?\n if (this._voxelGrid && this._voxelGrid.renderTarget) {\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._triPlanarVoxelization && !this._engine.isWebGPU) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n /**\n * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render\n * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.\n * @param rtt - the render target texture to install the custom render function on\n */\n private _installVoxelMixedCustomRender(rtt: RenderTargetTexture): void {\n const scene = this._scene;\n const engine = scene.getEngine();\n\n const renderGsSplat = (sm: SubMesh): void => {\n const renderingMesh = sm.getRenderingMesh();\n const effectiveMesh = sm.getEffectiveMesh();\n const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);\n if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {\n return;\n }\n\n const drawWrapper = gsVoxelMaterial._getDrawWrapper();\n if (!drawWrapper?.effect) {\n return;\n }\n const effect = drawWrapper.effect;\n\n const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());\n if (batch.mustReturn) {\n return;\n }\n\n const hardwareInstancedRendering =\n engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);\n\n const fillMode = sm.getMaterial()?.fillMode ?? Constants.MATERIAL_TriangleFillMode;\n engine.enableEffect(drawWrapper);\n renderingMesh._bind(sm, effect, fillMode);\n gsVoxelMaterial._preBind(drawWrapper);\n gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);\n // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.\n if (!(effectiveMesh as GaussianSplattingMesh).rotationsATexture) {\n gsVoxelMaterial.unbind();\n return;\n }\n if (engine.isWebGPU) {\n // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid\n // we rasterize three planar cross-section quads — one per principal axis — each\n // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered\n // edge-on produces zero fragments, so we draw once per world axis: each draw lets\n // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,\n // guaranteeing every splat is captured face-on from at least one direction.\n const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;\n for (let axisIdx = 0; axisIdx < 3; axisIdx++) {\n effect.setMatrix(\"viewMatrix\", viewMatrices[axisIdx]);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {\n effect.setMatrix(\"world\", world);\n });\n }\n } else {\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix(\"world\", world));\n }\n gsVoxelMaterial.unbind();\n };\n\n const processBucket = (subMeshes: SmartArray<SubMesh>, enableAlphaMode: boolean): void => {\n for (let i = 0; i < subMeshes.length; i++) {\n const sm = subMeshes.data[i];\n const effective = sm.getEffectiveMesh();\n if (effective.getClassName() === \"GaussianSplattingMesh\") {\n renderGsSplat(sm);\n } else {\n sm.render(enableAlphaMode);\n }\n }\n };\n\n rtt.customRenderFunction = (\n opaqueSubMeshes: SmartArray<SubMesh>,\n alphaTestSubMeshes: SmartArray<SubMesh>,\n transparentSubMeshes: SmartArray<SubMesh>,\n depthOnlySubMeshes: SmartArray<SubMesh>\n ): void => {\n if (depthOnlySubMeshes.length) {\n engine.setColorWrite(false);\n processBucket(depthOnlySubMeshes, false);\n engine.setColorWrite(true);\n }\n processBucket(opaqueSubMeshes, false);\n processBucket(alphaTestSubMeshes, false);\n processBucket(transparentSubMeshes, true);\n };\n }\n\n private _addGsMeshToVoxelRT(mrt: RenderTargetTexture, mesh: GaussianSplattingMesh): void {\n let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);\n if (!gsVoxelMaterial) {\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\n if (!gsMaterial) {\n return;\n }\n const shaderLanguage = this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);\n this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);\n }\n mrt.renderList?.push(mesh as Mesh);\n mrt.setMaterialForRendering(mesh as Mesh, gsVoxelMaterial);\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n const renderBucket = (bucket: SmartArray<SubMesh>) => {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n };\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n renderBucket(depthOnlySubMeshes);\n renderBucket(opaqueSubMeshes);\n renderBucket(alphaTestSubMeshes);\n renderBucket(transparentSubMeshes);\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", viewMatrix);\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n }\n // Push per-slab uniforms to each GS voxel material in this MRT's render list.\n for (const m of mrt.renderList ?? []) {\n if (m.getClassName() === \"GaussianSplattingMesh\") {\n const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);\n if (gsVoxelMat) {\n gsVoxelMat.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n if (this._engine.isWebGPU) {\n // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.\n gsVoxelMat.setTexture(\"voxel_storage\", this.getVoxelGrid());\n } else {\n gsVoxelMat.setMatrix(\"viewMatrix\", viewMatrix);\n gsVoxelMat.setFloat(\"nearPlane\", nearPlane);\n gsVoxelMat.setFloat(\"farPlane\", farPlane);\n gsVoxelMat.setFloat(\"stepSize\", stepSize);\n }\n }\n }\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (!mesh) {\n continue;\n }\n if (mesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, mesh as GaussianSplattingMesh);\n } else if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (childMesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, childMesh as GaussianSplattingMesh);\n } else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n\n this._installVoxelMixedCustomRender(mrt);\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {\n mat.dispose();\n }\n this._gsVoxelMaterialCache.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelRenderer.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine.pure\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget.pure\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture.pure\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color.pure\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector.pure\";\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\nimport { type Scene } from \"../../scene.pure\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable.pure\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture.pure\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer.pure\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline.pure\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\n\n// Max frames _renderVoxelGrid waits for splat depth sorts to settle before voxelizing anyway\n// (~3s at 60fps). Bounds the wait so a continuously re-sorting (orbiting) splat can't block it.\nconst _MaxSortSettleWaitFrames = 180;\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n // View matrices for the three voxelization axes.\n private static readonly _VOXEL_VIEW_MATRICES = [\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),\n ];\n\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */\n private _gsVoxelMaterialCache: Map<number, ShaderMaterial> = new Map();\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._triPlanarVoxelization = enabled;\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n // Frames spent waiting for shadow-casting splats' depth sort to settle before voxelizing; see\n // _renderVoxelGrid. Capped so a continuously re-sorting (e.g. orbiting) splat can't starve it.\n private _sortSettleWaitFrames: number = 0;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n // Wait for shadow-casting GaussianSplatting meshes' depth sort to settle before\n // rasterizing. Voxelization is order-independent — the order splats are drawn never\n // affects the grid — but the GS voxel draw still *indexes* each splat through the\n // `splatIndex` thin-instance buffer, and that buffer is (re)sized, filled and rebound by\n // the sort worker's callback (the same callback that flips `_isDepthSortSettled`). After\n // addPart() merges a splat, `forcedInstanceCount` jumps to the new total synchronously\n // but the index buffer is only finalized when the sort lands; rasterizing in between\n // indexes a stale/mismatched buffer and writes an empty grid (no IBL shadow until a\n // later refresh). Frame-capped so a continuously re-sorting (orbiting) splat still\n // voxelizes eventually rather than blocking forever.\n let gsSortPending = false;\n for (let i = 0; i < this._renderTargets.length && !gsSortPending; i++) {\n const renderList = this._renderTargets[i].renderList;\n if (!renderList) {\n continue;\n }\n for (const mesh of renderList) {\n if (mesh.getClassName() === \"GaussianSplattingMesh\" && !(mesh as GaussianSplattingMesh)._isDepthSortSettled) {\n gsSortPending = true;\n break;\n }\n }\n }\n if (gsSortPending && this._sortSettleWaitFrames < _MaxSortSettleWaitFrames) {\n this._sortSettleWaitFrames++;\n return;\n }\n this._sortSettleWaitFrames = 0;\n\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {\n allReady &&= gsVoxelMat.isReady();\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n // Clear the voxel grid storage texture.\n // Need to clear each layer individually.\n // Would a compute shader be faster here to clear all layers in one go?\n if (this._voxelGrid && this._voxelGrid.renderTarget) {\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._triPlanarVoxelization && !this._engine.isWebGPU) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n /**\n * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render\n * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.\n * @param rtt - the render target texture to install the custom render function on\n */\n private _installVoxelMixedCustomRender(rtt: RenderTargetTexture): void {\n const scene = this._scene;\n const engine = scene.getEngine();\n\n const renderGsSplat = (sm: SubMesh): void => {\n const renderingMesh = sm.getRenderingMesh();\n const effectiveMesh = sm.getEffectiveMesh();\n const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);\n if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {\n return;\n }\n\n const drawWrapper = gsVoxelMaterial._getDrawWrapper();\n if (!drawWrapper?.effect) {\n return;\n }\n const effect = drawWrapper.effect;\n\n const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());\n if (batch.mustReturn) {\n return;\n }\n\n const hardwareInstancedRendering =\n engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);\n\n const fillMode = sm.getMaterial()?.fillMode ?? Constants.MATERIAL_TriangleFillMode;\n engine.enableEffect(drawWrapper);\n renderingMesh._bind(sm, effect, fillMode);\n gsVoxelMaterial._preBind(drawWrapper);\n gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);\n // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.\n if (!(effectiveMesh as GaussianSplattingMesh).rotationsATexture) {\n gsVoxelMaterial.unbind();\n return;\n }\n if (engine.isWebGPU) {\n // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid\n // we rasterize three planar cross-section quads — one per principal axis — each\n // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered\n // edge-on produces zero fragments, so we draw once per world axis: each draw lets\n // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,\n // guaranteeing every splat is captured face-on from at least one direction.\n const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;\n for (let axisIdx = 0; axisIdx < 3; axisIdx++) {\n effect.setMatrix(\"viewMatrix\", viewMatrices[axisIdx]);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {\n effect.setMatrix(\"world\", world);\n });\n }\n } else {\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix(\"world\", world));\n }\n gsVoxelMaterial.unbind();\n };\n\n const processBucket = (subMeshes: SmartArray<SubMesh>, enableAlphaMode: boolean): void => {\n for (let i = 0; i < subMeshes.length; i++) {\n const sm = subMeshes.data[i];\n const effective = sm.getEffectiveMesh();\n if (effective.getClassName() === \"GaussianSplattingMesh\") {\n renderGsSplat(sm);\n } else {\n sm.render(enableAlphaMode);\n }\n }\n };\n\n rtt.customRenderFunction = (\n opaqueSubMeshes: SmartArray<SubMesh>,\n alphaTestSubMeshes: SmartArray<SubMesh>,\n transparentSubMeshes: SmartArray<SubMesh>,\n depthOnlySubMeshes: SmartArray<SubMesh>\n ): void => {\n if (depthOnlySubMeshes.length) {\n engine.setColorWrite(false);\n processBucket(depthOnlySubMeshes, false);\n engine.setColorWrite(true);\n }\n processBucket(opaqueSubMeshes, false);\n processBucket(alphaTestSubMeshes, false);\n processBucket(transparentSubMeshes, true);\n };\n }\n\n private _addGsMeshToVoxelRT(mrt: RenderTargetTexture, mesh: GaussianSplattingMesh): void {\n let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);\n if (!gsVoxelMaterial) {\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\n if (!gsMaterial) {\n return;\n }\n const shaderLanguage = this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);\n this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);\n }\n mrt.renderList?.push(mesh as Mesh);\n mrt.setMaterialForRendering(mesh as Mesh, gsVoxelMaterial);\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n const renderBucket = (bucket: SmartArray<SubMesh>) => {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n };\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n renderBucket(depthOnlySubMeshes);\n renderBucket(opaqueSubMeshes);\n renderBucket(alphaTestSubMeshes);\n renderBucket(transparentSubMeshes);\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", viewMatrix);\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n }\n // Push per-slab uniforms to each GS voxel material in this MRT's render list.\n for (const m of mrt.renderList ?? []) {\n if (m.getClassName() === \"GaussianSplattingMesh\") {\n const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);\n if (gsVoxelMat) {\n gsVoxelMat.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n if (this._engine.isWebGPU) {\n // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.\n gsVoxelMat.setTexture(\"voxel_storage\", this.getVoxelGrid());\n } else {\n gsVoxelMat.setMatrix(\"viewMatrix\", viewMatrix);\n gsVoxelMat.setFloat(\"nearPlane\", nearPlane);\n gsVoxelMat.setFloat(\"farPlane\", farPlane);\n gsVoxelMat.setFloat(\"stepSize\", stepSize);\n }\n }\n }\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (!mesh) {\n continue;\n }\n if (mesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, mesh as GaussianSplattingMesh);\n } else if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (childMesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, childMesh as GaussianSplattingMesh);\n } else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n\n this._installVoxelMixedCustomRender(mrt);\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {\n mat.dispose();\n }\n this._gsVoxelMaterialCache.clear();\n }\n}\n"]}
|
|
@@ -221,6 +221,7 @@ vec3 c2d=vec3(cov2d[0][0],c01,cov2d[1][1]);float detBlur=c2d.x*c2d.z-c2d.y*c2d.y
|
|
|
221
221
|
#endif
|
|
222
222
|
float mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float epsilon=0.0001;float lambda1=mid+radius+epsilon,lambda2=mid-radius+epsilon;if (lambda2<0.0)
|
|
223
223
|
{return vec4(0.0,0.0,2.0,1.0);}
|
|
224
|
+
if (minPixelSize>0.0) {float l1=2.0*min(sqrt(2.0*lambda1),1024.0);float l2=2.0*min(sqrt(2.0*lambda2),1024.0);if (max(l1,l2)<minPixelSize) {return vec4(0.0,0.0,2.0,1.0);}}
|
|
224
225
|
vec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vec2 vCenter=vec2(pos2d);float scaleFactor=isOrtho ? 1.0 : pos2d.w;return vec4(
|
|
225
226
|
vCenter
|
|
226
227
|
+ ((meshPos.x*majorAxis
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplatting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/gaussianSplatting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Od,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"gaussianSplatting\";\nconst shader = `#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\n#if SH_DEGREE>0 || IS_COMPOUND\nivec2 getDataUVint(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return ivec2(uint(x+0.5),uint(y+0.5));}\n#endif\nstruct Splat {vec4 center;vec4 color;vec4 covA;vec4 covB;\n#if SH_DEGREE>0\nuvec4 sh0; \n#endif\n#if SH_DEGREE>1\nuvec4 sh1;\n#endif\n#if SH_DEGREE>2\nuvec4 sh2;\n#endif\n#if SH_DEGREE>3\nuvec4 sh3;uvec4 sh4;\n#endif\n#if IS_COMPOUND\nuint partIndex;\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nvec4 rotationA;vec4 rotationB;vec4 rotationScale;\n#endif\n#ifdef USE_SOG\nfloat splatIndex;\n#endif\n};float getSplatIndex(int localIndex)\n{float splatIndex;switch (localIndex)\n{case 0: splatIndex=splatIndex0.x; break;case 1: splatIndex=splatIndex0.y; break;case 2: splatIndex=splatIndex0.z; break;case 3: splatIndex=splatIndex0.w; break;case 4: splatIndex=splatIndex1.x; break;case 5: splatIndex=splatIndex1.y; break;case 6: splatIndex=splatIndex1.z; break;case 7: splatIndex=splatIndex1.w; break;case 8: splatIndex=splatIndex2.x; break;case 9: splatIndex=splatIndex2.y; break;case 10: splatIndex=splatIndex2.z; break;case 11: splatIndex=splatIndex2.w; break;case 12: splatIndex=splatIndex3.x; break;case 13: splatIndex=splatIndex3.y; break;case 14: splatIndex=splatIndex3.z; break;case 15: splatIndex=splatIndex3.w; break;}\nreturn splatIndex;}\nSplat readSplat(float splatIndex)\n{Splat splat;vec2 splatUV=getDataUV(splatIndex,dataTextureSize);\n#ifdef USE_SOG\nivec2 sogUVi=ivec2(int(splatUV.x*dataTextureSize.x),int(splatUV.y*dataTextureSize.y));vec4 mL=texelFetch(centersTexture,sogUVi,0); \nvec4 mU=texelFetch(covariancesATexture,sogUVi,0); \nvec4 sRaw=texelFetch(covariancesBTexture,sogUVi,0); \nvec4 qRaw=texelFetch(sogQuatsTexture,sogUVi,0); \nvec4 c0=texelFetch(colorsTexture,sogUVi,0); \nvec3 q16=(mU.xyz*256.0+mL.xyz)*(255.0/65535.0);vec3 nPos=mix(sogMeansMin,sogMeansMax,q16);vec3 center=sign(nPos)*(exp(abs(nPos))-vec3(1.0));splat.center=vec4(center,1.0);\n#ifdef USE_SOG_V2\nvec3 sIdx=floor(sRaw.xyz*255.0+0.5);vec3 splatScale;splatScale.x=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.x),0),0).r);splatScale.y=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.y),0),0).r);splatScale.z=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.z),0),0).r);\n#else\nvec3 splatScale=exp(mix(sogScalesMin,sogScalesMax,sRaw.xyz));\n#endif\nconst float invSqrt2=0.70710678118;vec3 qabc=(qRaw.xyz-vec3(0.5))*2.0*invSqrt2;int qMode=int(qRaw.w*255.0+0.5)-252;float qd=sqrt(max(0.0,1.0-dot(qabc,qabc)));vec4 quat;if (qMode==0) quat=vec4(qd,qabc.x,qabc.y,qabc.z);else if (qMode==1) quat=vec4(qabc.x,qd,qabc.y,qabc.z);else if (qMode==2) quat=vec4(qabc.x,qabc.y,qd,qabc.z);else quat=vec4(qabc.x,qabc.y,qabc.z,qd);float qw=quat.x,qx=quat.y,qy=quat.z,qz=quat.w;mat3 R=mat3(\n1.0-2.0*(qy*qy+qz*qz),2.0*(qx*qy+qw*qz), 2.0*(qx*qz-qw*qy),\n2.0*(qx*qy-qw*qz), 1.0-2.0*(qx*qx+qz*qz),2.0*(qy*qz+qw*qx),\n2.0*(qx*qz+qw*qy), 2.0*(qy*qz-qw*qx), 1.0-2.0*(qx*qx+qy*qy)\n);mat3 S2=mat3(4.0*splatScale.x*splatScale.x,0.0,0.0,\n0.0,4.0*splatScale.y*splatScale.y,0.0,\n0.0,0.0,4.0*splatScale.z*splatScale.z);mat3 Sigma=R*S2*transpose(R);splat.covA=vec4(Sigma[0][0],Sigma[0][1],Sigma[0][2],Sigma[1][1]);splat.covB=vec4(Sigma[1][2],Sigma[2][2],0.0,0.0);const float SH_C0=0.28209479177387814;\n#ifdef USE_SOG_V2\nvec3 c3;c3.x=texelFetch(sogCodebookTexture,ivec2(256+int(c0.x*255.0+0.5),0),0).r;c3.y=texelFetch(sogCodebookTexture,ivec2(256+int(c0.y*255.0+0.5),0),0).r;c3.z=texelFetch(sogCodebookTexture,ivec2(256+int(c0.z*255.0+0.5),0),0).r;vec3 colRgb=vec3(0.5)+c3*SH_C0;float colA=c0.w; \n#else\nvec4 cLerp=mix(sogSh0Min,sogSh0Max,c0);vec3 colRgb=vec3(0.5)+cLerp.xyz*SH_C0;float colA=1.0/(1.0+exp(-cLerp.w));\n#endif\nsplat.color=vec4(colRgb,colA);splat.splatIndex=splatIndex;\n#else\nsplat.center=texture2D(centersTexture,splatUV);splat.color=texture2D(colorsTexture,splatUV);\n#if !defined(IS_FOR_VOXELIZATION)\nsplat.covA=texture2D(covariancesATexture,splatUV)*splat.center.w;splat.covB=texture2D(covariancesBTexture,splatUV)*splat.center.w;\n#endif\n#endif\n#if SH_DEGREE>0 || IS_COMPOUND\nivec2 splatUVint=getDataUVint(splatIndex,dataTextureSize);\n#endif\n#if SH_DEGREE>0 && !defined(USE_SOG)\nsplat.sh0=texelFetch(shTexture0,splatUVint,0);\n#endif\n#if SH_DEGREE>1 && !defined(USE_SOG)\nsplat.sh1=texelFetch(shTexture1,splatUVint,0);\n#endif\n#if SH_DEGREE>2 && !defined(USE_SOG)\nsplat.sh2=texelFetch(shTexture2,splatUVint,0);\n#endif\n#if SH_DEGREE>3 && !defined(USE_SOG)\nsplat.sh3=texelFetch(shTexture3,splatUVint,0);splat.sh4=texelFetch(shTexture4,splatUVint,0);\n#endif\n#if IS_COMPOUND\nsplat.partIndex=uint(texture2D(partIndicesTexture,splatUV).r*255.0+0.5);\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nsplat.rotationA=texture2D(rotationsATexture,splatUV);splat.rotationB=texture2D(rotationsBTexture,splatUV);splat.rotationScale=texture2D(rotationScaleTexture,splatUV);\n#endif\nreturn splat;}\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nvec3 computeColorFromSHDegree(vec3 dir,const vec3 sh[25],float _so1,float _so2,float _so3,float _so4)\n{const float SH_C0=0.28209479;const float SH_C1=0.48860251;float SH_C2[5];SH_C2[0]=1.092548430;SH_C2[1]=-1.09254843;SH_C2[2]=0.315391565;SH_C2[3]=-1.09254843;SH_C2[4]=0.546274215;float SH_C3[7];SH_C3[0]=-0.59004358;SH_C3[1]=2.890611442;SH_C3[2]=-0.45704579;SH_C3[3]=0.373176332;SH_C3[4]=-0.45704579;SH_C3[5]=1.445305721;SH_C3[6]=-0.59004358;float SH_C4[9];SH_C4[0]= 2.5033429418;SH_C4[1]=-1.7701307698;SH_C4[2]= 0.9461746958;SH_C4[3]=-0.6690465436;SH_C4[4]= 0.1057855469;SH_C4[5]=-0.6690465436;SH_C4[6]= 0.4730873479;SH_C4[7]=-1.7701307698;SH_C4[8]= 0.6258357354;vec3 result=/*SH_C0**/sh[0];\n#if SH_DEGREE>0\nfloat x=dir.x;float y=dir.y;float z=dir.z;result+=_so1*(- SH_C1*y*sh[1]+SH_C1*z*sh[2]-SH_C1*x*sh[3]);\n#if SH_DEGREE>1\nfloat xx=x*x,yy=y*y,zz=z*z;float xy=x*y,yz=y*z,xz=x*z;result+=_so2*(\nSH_C2[0]*xy*sh[4] +\nSH_C2[1]*yz*sh[5] +\nSH_C2[2]*(2.0*zz-xx-yy)*sh[6] +\nSH_C2[3]*xz*sh[7] +\nSH_C2[4]*(xx-yy)*sh[8]);\n#if SH_DEGREE>2\nresult+=_so3*(\nSH_C3[0]*y*(3.0*xx-yy)*sh[9] +\nSH_C3[1]*xy*z*sh[10] +\nSH_C3[2]*y*(4.0*zz-xx-yy)*sh[11] +\nSH_C3[3]*z*(2.0*zz-3.0*xx-3.0*yy)*sh[12] +\nSH_C3[4]*x*(4.0*zz-xx-yy)*sh[13] +\nSH_C3[5]*z*(xx-yy)*sh[14] +\nSH_C3[6]*x*(xx-3.0*yy)*sh[15]);\n#if SH_DEGREE>3\nresult+=_so4*(\nSH_C4[0]*x*y*(xx-yy)*sh[16] +\nSH_C4[1]*y*z*(3.0*xx-yy)*sh[17] +\nSH_C4[2]*x*y*(7.0*zz-1.0)*sh[18] +\nSH_C4[3]*y*z*(7.0*zz-3.0)*sh[19] +\nSH_C4[4]*(zz*(35.0*zz-30.0)+3.0)*sh[20] +\nSH_C4[5]*x*z*(7.0*zz-3.0)*sh[21] +\nSH_C4[6]*(xx-yy)*(7.0*zz-1.0)*sh[22] +\nSH_C4[7]*x*z*(xx-3.0*yy)*sh[23] +\nSH_C4[8]*(xx*(xx-3.0*yy)-yy*(3.0*xx-yy))*sh[24]);\n#endif\n#endif\n#endif\n#endif\nreturn result;}\nvec4 decompose(uint value)\n{vec4 components=vec4(\nfloat((value ) & 255u),\nfloat((value>>uint( 8)) & 255u),\nfloat((value>>uint(16)) & 255u),\nfloat((value>>uint(24)) & 255u));return components*vec4(2./255.)-vec4(1.);}\n#ifdef USE_SOG\nvec3 computeSH(Splat splat,vec3 dir)\n{\n#if SH_DEGREE>0\nvec3 sh[25];sh[0]=vec3(0.,0.,0.);ivec2 labelSize=textureSize(sogShNLabelsTexture,0);int idx=int(splat.splatIndex+0.5);int lx=idx-(idx/labelSize.x)*labelSize.x;int ly=idx/labelSize.x;vec4 labelRaw=texelFetch(sogShNLabelsTexture,ivec2(lx,ly),0);int n=int(labelRaw.r*255.0+0.5)+int(labelRaw.g*255.0+0.5)*256;int coeffs=int(sogShCoeffCount+0.5);int u=(n-(n/64)*64)*coeffs;int v=n/64;for (int k=0; k<24; k++) {if (k>=coeffs) break;vec4 centroidRaw=texelFetch(sogShNCentroidsTexture,ivec2(u+k,v),0);vec3 shCoeff;\n#ifdef USE_SOG_V2\nint rIdx=int(centroidRaw.r*255.0+0.5);int gIdx=int(centroidRaw.g*255.0+0.5);int bIdx=int(centroidRaw.b*255.0+0.5);shCoeff.r=texelFetch(sogCodebookTexture,ivec2(512+rIdx,0),0).r;shCoeff.g=texelFetch(sogCodebookTexture,ivec2(512+gIdx,0),0).r;shCoeff.b=texelFetch(sogCodebookTexture,ivec2(512+bIdx,0),0).r;\n#else\nshCoeff=mix(vec3(sogShnMin),vec3(sogShnMax),centroidRaw.rgb);\n#endif\nsh[k+1]=shCoeff;}\nreturn computeColorFromSHDegree(dir,sh,1.,1.,1.,1.);\n#else\nreturn vec3(0.,0.,0.);\n#endif\n}\n#else\nvec3 computeSHWeighted(Splat splat,vec3 dir,float _so1,float _so2,float _so3,float _so4)\n{vec3 sh[25];sh[0]=vec3(0.,0.,0.);\n#if SH_DEGREE>0\nvec4 sh00=decompose(splat.sh0.x);vec4 sh01=decompose(splat.sh0.y);vec4 sh02=decompose(splat.sh0.z);sh[1]=vec3(sh00.x,sh00.y,sh00.z);sh[2]=vec3(sh00.w,sh01.x,sh01.y);sh[3]=vec3(sh01.z,sh01.w,sh02.x);\n#endif\n#if SH_DEGREE>1\nvec4 sh03=decompose(splat.sh0.w);vec4 sh04=decompose(splat.sh1.x);vec4 sh05=decompose(splat.sh1.y);sh[4]=vec3(sh02.y,sh02.z,sh02.w);sh[5]=vec3(sh03.x,sh03.y,sh03.z);sh[6]=vec3(sh03.w,sh04.x,sh04.y);sh[7]=vec3(sh04.z,sh04.w,sh05.x);sh[8]=vec3(sh05.y,sh05.z,sh05.w);\n#endif\n#if SH_DEGREE>2\nvec4 sh06=decompose(splat.sh1.z);vec4 sh07=decompose(splat.sh1.w);vec4 sh08=decompose(splat.sh2.x);vec4 sh09=decompose(splat.sh2.y);vec4 sh10=decompose(splat.sh2.z);vec4 sh11=decompose(splat.sh2.w);sh[9]=vec3(sh06.x,sh06.y,sh06.z);sh[10]=vec3(sh06.w,sh07.x,sh07.y);sh[11]=vec3(sh07.z,sh07.w,sh08.x);sh[12]=vec3(sh08.y,sh08.z,sh08.w);sh[13]=vec3(sh09.x,sh09.y,sh09.z);sh[14]=vec3(sh09.w,sh10.x,sh10.y);sh[15]=vec3(sh10.z,sh10.w,sh11.x);\n#endif\n#if SH_DEGREE>3\nvec4 sh12=decompose(splat.sh3.x);vec4 sh13=decompose(splat.sh3.y);vec4 sh14=decompose(splat.sh3.z);vec4 sh15=decompose(splat.sh3.w);vec4 sh16=decompose(splat.sh4.x);vec4 sh17=decompose(splat.sh4.y);sh[16]=vec3(sh11.y,sh11.z,sh11.w);sh[17]=vec3(sh12.x,sh12.y,sh12.z);sh[18]=vec3(sh12.w,sh13.x,sh13.y);sh[19]=vec3(sh13.z,sh13.w,sh14.x);sh[20]=vec3(sh14.y,sh14.z,sh14.w);sh[21]=vec3(sh15.x,sh15.y,sh15.z);sh[22]=vec3(sh15.w,sh16.x,sh16.y);sh[23]=vec3(sh16.z,sh16.w,sh17.x);sh[24]=vec3(sh17.y,sh17.z,sh17.w);\n#endif\nreturn computeColorFromSHDegree(dir,sh,_so1,_so2,_so3,_so4);}\nvec3 computeSH(Splat splat,vec3 dir)\n{\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER1==1\nfloat _w1=1.0;\n#else\nfloat _w1=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER2==1\nfloat _w2=1.0;\n#else\nfloat _w2=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER3==1\nfloat _w3=1.0;\n#else\nfloat _w3=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER4==1\nfloat _w4=1.0;\n#else\nfloat _w4=0.0;\n#endif\nreturn computeSHWeighted(splat,dir,_w1,_w2,_w3,_w4);}\n#endif\n#else\nvec3 computeSH(Splat splat,vec3 dir)\n{return vec3(0.,0.,0.);}\n#endif\n#if !defined(IS_FOR_VOXELIZATION)\nvec4 gaussianSplatting(vec2 meshPos,vec3 worldPos,vec2 scale,vec3 covA,vec3 covB,mat4 worldMatrix,mat4 viewMatrix,mat4 projectionMatrix)\n{mat4 modelView=viewMatrix*worldMatrix;vec4 camspace=viewMatrix*vec4(worldPos,1.);vec4 pos2d=projectionMatrix*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {return vec4(0.0,0.0,2.0,1.0);}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);bool isOrtho=abs(projectionMatrix[3][3]-1.0)<0.001;mat3 J;if (isOrtho) {J=mat3(\nfocal.x,0.,0.,\n0.,focal.y,0.,\n0.,0.,0.\n);} else {J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);}\nmat3 T=transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;\n#if COMPENSATION\nfloat c00=cov2d[0][0];float c11=cov2d[1][1];float c01=cov2d[0][1];float detOrig=c00*c11-c01*c01;\n#endif\ncov2d[0][0]+=kernelSize;cov2d[1][1]+=kernelSize;\n#if COMPENSATION\nvec3 c2d=vec3(cov2d[0][0],c01,cov2d[1][1]);float detBlur=c2d.x*c2d.z-c2d.y*c2d.y;float compensation=sqrt(max(0.,detOrig/detBlur));vColor.w*=compensation;\n#endif\nfloat mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float epsilon=0.0001;float lambda1=mid+radius+epsilon,lambda2=mid-radius+epsilon;if (lambda2<0.0)\n{return vec4(0.0,0.0,2.0,1.0);}\nvec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vec2 vCenter=vec2(pos2d);float scaleFactor=isOrtho ? 1.0 : pos2d.w;return vec4(\nvCenter \n+ ((meshPos.x*majorAxis\n+ meshPos.y*minorAxis)*invViewport*scaleFactor)*scale,pos2d.zw);}\n#endif\n#if IS_COMPOUND\nmat4 getPartWorld(uint partIndex) {return partWorld[partIndex];}\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nvec4 computeVoxelSplatWorldPos(vec4 rotationA,vec4 rotationB,vec4 rotationScale,vec3 center,mat4 splatWorld,mat4 viewMatrix,mat4 invWorldScale,vec2 quadPos) {mat3 splatRotation=mat3(\nvec3(rotationA.x,rotationA.y,rotationA.z),\nvec3(rotationA.w,rotationB.x,rotationB.y),\nvec3(rotationB.z,rotationB.w,rotationScale.x)\n);vec3 splatScale=vec3(rotationScale.y,rotationScale.z,rotationScale.w);mat3 rotToView=mat3(viewMatrix)*mat3(invWorldScale)*mat3(splatWorld)*splatRotation;vec3 axisLengthInViewZ=abs(vec3(rotToView[0][2],rotToView[1][2],rotToView[2][2]));float gaussianSplatCutoffStddev=1.4142135624/2.0; \nvec3 offsetSplatSpace;if (axisLengthInViewZ.x>axisLengthInViewZ.y && axisLengthInViewZ.x>axisLengthInViewZ.z) {offsetSplatSpace=vec3(0.0,quadPos.x,quadPos.y)*splatScale*gaussianSplatCutoffStddev;} else if (axisLengthInViewZ.y>axisLengthInViewZ.z) {offsetSplatSpace=vec3(quadPos.x,0.0,quadPos.y)*splatScale*gaussianSplatCutoffStddev;} else {offsetSplatSpace=vec3(quadPos.x,quadPos.y,0.0)*splatScale*gaussianSplatCutoffStddev;}\nvec3 vertexObjectSpace=center+splatRotation*offsetSplatSpace;return splatWorld*vec4(vertexObjectSpace,1.0);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const gaussianSplatting = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplatting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/gaussianSplatting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Od,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nconst name = \"gaussianSplatting\";\nconst shader = `#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\n#if SH_DEGREE>0 || IS_COMPOUND\nivec2 getDataUVint(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return ivec2(uint(x+0.5),uint(y+0.5));}\n#endif\nstruct Splat {vec4 center;vec4 color;vec4 covA;vec4 covB;\n#if SH_DEGREE>0\nuvec4 sh0; \n#endif\n#if SH_DEGREE>1\nuvec4 sh1;\n#endif\n#if SH_DEGREE>2\nuvec4 sh2;\n#endif\n#if SH_DEGREE>3\nuvec4 sh3;uvec4 sh4;\n#endif\n#if IS_COMPOUND\nuint partIndex;\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nvec4 rotationA;vec4 rotationB;vec4 rotationScale;\n#endif\n#ifdef USE_SOG\nfloat splatIndex;\n#endif\n};float getSplatIndex(int localIndex)\n{float splatIndex;switch (localIndex)\n{case 0: splatIndex=splatIndex0.x; break;case 1: splatIndex=splatIndex0.y; break;case 2: splatIndex=splatIndex0.z; break;case 3: splatIndex=splatIndex0.w; break;case 4: splatIndex=splatIndex1.x; break;case 5: splatIndex=splatIndex1.y; break;case 6: splatIndex=splatIndex1.z; break;case 7: splatIndex=splatIndex1.w; break;case 8: splatIndex=splatIndex2.x; break;case 9: splatIndex=splatIndex2.y; break;case 10: splatIndex=splatIndex2.z; break;case 11: splatIndex=splatIndex2.w; break;case 12: splatIndex=splatIndex3.x; break;case 13: splatIndex=splatIndex3.y; break;case 14: splatIndex=splatIndex3.z; break;case 15: splatIndex=splatIndex3.w; break;}\nreturn splatIndex;}\nSplat readSplat(float splatIndex)\n{Splat splat;vec2 splatUV=getDataUV(splatIndex,dataTextureSize);\n#ifdef USE_SOG\nivec2 sogUVi=ivec2(int(splatUV.x*dataTextureSize.x),int(splatUV.y*dataTextureSize.y));vec4 mL=texelFetch(centersTexture,sogUVi,0); \nvec4 mU=texelFetch(covariancesATexture,sogUVi,0); \nvec4 sRaw=texelFetch(covariancesBTexture,sogUVi,0); \nvec4 qRaw=texelFetch(sogQuatsTexture,sogUVi,0); \nvec4 c0=texelFetch(colorsTexture,sogUVi,0); \nvec3 q16=(mU.xyz*256.0+mL.xyz)*(255.0/65535.0);vec3 nPos=mix(sogMeansMin,sogMeansMax,q16);vec3 center=sign(nPos)*(exp(abs(nPos))-vec3(1.0));splat.center=vec4(center,1.0);\n#ifdef USE_SOG_V2\nvec3 sIdx=floor(sRaw.xyz*255.0+0.5);vec3 splatScale;splatScale.x=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.x),0),0).r);splatScale.y=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.y),0),0).r);splatScale.z=exp(texelFetch(sogCodebookTexture,ivec2(int(sIdx.z),0),0).r);\n#else\nvec3 splatScale=exp(mix(sogScalesMin,sogScalesMax,sRaw.xyz));\n#endif\nconst float invSqrt2=0.70710678118;vec3 qabc=(qRaw.xyz-vec3(0.5))*2.0*invSqrt2;int qMode=int(qRaw.w*255.0+0.5)-252;float qd=sqrt(max(0.0,1.0-dot(qabc,qabc)));vec4 quat;if (qMode==0) quat=vec4(qd,qabc.x,qabc.y,qabc.z);else if (qMode==1) quat=vec4(qabc.x,qd,qabc.y,qabc.z);else if (qMode==2) quat=vec4(qabc.x,qabc.y,qd,qabc.z);else quat=vec4(qabc.x,qabc.y,qabc.z,qd);float qw=quat.x,qx=quat.y,qy=quat.z,qz=quat.w;mat3 R=mat3(\n1.0-2.0*(qy*qy+qz*qz),2.0*(qx*qy+qw*qz), 2.0*(qx*qz-qw*qy),\n2.0*(qx*qy-qw*qz), 1.0-2.0*(qx*qx+qz*qz),2.0*(qy*qz+qw*qx),\n2.0*(qx*qz+qw*qy), 2.0*(qy*qz-qw*qx), 1.0-2.0*(qx*qx+qy*qy)\n);mat3 S2=mat3(4.0*splatScale.x*splatScale.x,0.0,0.0,\n0.0,4.0*splatScale.y*splatScale.y,0.0,\n0.0,0.0,4.0*splatScale.z*splatScale.z);mat3 Sigma=R*S2*transpose(R);splat.covA=vec4(Sigma[0][0],Sigma[0][1],Sigma[0][2],Sigma[1][1]);splat.covB=vec4(Sigma[1][2],Sigma[2][2],0.0,0.0);const float SH_C0=0.28209479177387814;\n#ifdef USE_SOG_V2\nvec3 c3;c3.x=texelFetch(sogCodebookTexture,ivec2(256+int(c0.x*255.0+0.5),0),0).r;c3.y=texelFetch(sogCodebookTexture,ivec2(256+int(c0.y*255.0+0.5),0),0).r;c3.z=texelFetch(sogCodebookTexture,ivec2(256+int(c0.z*255.0+0.5),0),0).r;vec3 colRgb=vec3(0.5)+c3*SH_C0;float colA=c0.w; \n#else\nvec4 cLerp=mix(sogSh0Min,sogSh0Max,c0);vec3 colRgb=vec3(0.5)+cLerp.xyz*SH_C0;float colA=1.0/(1.0+exp(-cLerp.w));\n#endif\nsplat.color=vec4(colRgb,colA);splat.splatIndex=splatIndex;\n#else\nsplat.center=texture2D(centersTexture,splatUV);splat.color=texture2D(colorsTexture,splatUV);\n#if !defined(IS_FOR_VOXELIZATION)\nsplat.covA=texture2D(covariancesATexture,splatUV)*splat.center.w;splat.covB=texture2D(covariancesBTexture,splatUV)*splat.center.w;\n#endif\n#endif\n#if SH_DEGREE>0 || IS_COMPOUND\nivec2 splatUVint=getDataUVint(splatIndex,dataTextureSize);\n#endif\n#if SH_DEGREE>0 && !defined(USE_SOG)\nsplat.sh0=texelFetch(shTexture0,splatUVint,0);\n#endif\n#if SH_DEGREE>1 && !defined(USE_SOG)\nsplat.sh1=texelFetch(shTexture1,splatUVint,0);\n#endif\n#if SH_DEGREE>2 && !defined(USE_SOG)\nsplat.sh2=texelFetch(shTexture2,splatUVint,0);\n#endif\n#if SH_DEGREE>3 && !defined(USE_SOG)\nsplat.sh3=texelFetch(shTexture3,splatUVint,0);splat.sh4=texelFetch(shTexture4,splatUVint,0);\n#endif\n#if IS_COMPOUND\nsplat.partIndex=uint(texture2D(partIndicesTexture,splatUV).r*255.0+0.5);\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nsplat.rotationA=texture2D(rotationsATexture,splatUV);splat.rotationB=texture2D(rotationsBTexture,splatUV);splat.rotationScale=texture2D(rotationScaleTexture,splatUV);\n#endif\nreturn splat;}\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nvec3 computeColorFromSHDegree(vec3 dir,const vec3 sh[25],float _so1,float _so2,float _so3,float _so4)\n{const float SH_C0=0.28209479;const float SH_C1=0.48860251;float SH_C2[5];SH_C2[0]=1.092548430;SH_C2[1]=-1.09254843;SH_C2[2]=0.315391565;SH_C2[3]=-1.09254843;SH_C2[4]=0.546274215;float SH_C3[7];SH_C3[0]=-0.59004358;SH_C3[1]=2.890611442;SH_C3[2]=-0.45704579;SH_C3[3]=0.373176332;SH_C3[4]=-0.45704579;SH_C3[5]=1.445305721;SH_C3[6]=-0.59004358;float SH_C4[9];SH_C4[0]= 2.5033429418;SH_C4[1]=-1.7701307698;SH_C4[2]= 0.9461746958;SH_C4[3]=-0.6690465436;SH_C4[4]= 0.1057855469;SH_C4[5]=-0.6690465436;SH_C4[6]= 0.4730873479;SH_C4[7]=-1.7701307698;SH_C4[8]= 0.6258357354;vec3 result=/*SH_C0**/sh[0];\n#if SH_DEGREE>0\nfloat x=dir.x;float y=dir.y;float z=dir.z;result+=_so1*(- SH_C1*y*sh[1]+SH_C1*z*sh[2]-SH_C1*x*sh[3]);\n#if SH_DEGREE>1\nfloat xx=x*x,yy=y*y,zz=z*z;float xy=x*y,yz=y*z,xz=x*z;result+=_so2*(\nSH_C2[0]*xy*sh[4] +\nSH_C2[1]*yz*sh[5] +\nSH_C2[2]*(2.0*zz-xx-yy)*sh[6] +\nSH_C2[3]*xz*sh[7] +\nSH_C2[4]*(xx-yy)*sh[8]);\n#if SH_DEGREE>2\nresult+=_so3*(\nSH_C3[0]*y*(3.0*xx-yy)*sh[9] +\nSH_C3[1]*xy*z*sh[10] +\nSH_C3[2]*y*(4.0*zz-xx-yy)*sh[11] +\nSH_C3[3]*z*(2.0*zz-3.0*xx-3.0*yy)*sh[12] +\nSH_C3[4]*x*(4.0*zz-xx-yy)*sh[13] +\nSH_C3[5]*z*(xx-yy)*sh[14] +\nSH_C3[6]*x*(xx-3.0*yy)*sh[15]);\n#if SH_DEGREE>3\nresult+=_so4*(\nSH_C4[0]*x*y*(xx-yy)*sh[16] +\nSH_C4[1]*y*z*(3.0*xx-yy)*sh[17] +\nSH_C4[2]*x*y*(7.0*zz-1.0)*sh[18] +\nSH_C4[3]*y*z*(7.0*zz-3.0)*sh[19] +\nSH_C4[4]*(zz*(35.0*zz-30.0)+3.0)*sh[20] +\nSH_C4[5]*x*z*(7.0*zz-3.0)*sh[21] +\nSH_C4[6]*(xx-yy)*(7.0*zz-1.0)*sh[22] +\nSH_C4[7]*x*z*(xx-3.0*yy)*sh[23] +\nSH_C4[8]*(xx*(xx-3.0*yy)-yy*(3.0*xx-yy))*sh[24]);\n#endif\n#endif\n#endif\n#endif\nreturn result;}\nvec4 decompose(uint value)\n{vec4 components=vec4(\nfloat((value ) & 255u),\nfloat((value>>uint( 8)) & 255u),\nfloat((value>>uint(16)) & 255u),\nfloat((value>>uint(24)) & 255u));return components*vec4(2./255.)-vec4(1.);}\n#ifdef USE_SOG\nvec3 computeSH(Splat splat,vec3 dir)\n{\n#if SH_DEGREE>0\nvec3 sh[25];sh[0]=vec3(0.,0.,0.);ivec2 labelSize=textureSize(sogShNLabelsTexture,0);int idx=int(splat.splatIndex+0.5);int lx=idx-(idx/labelSize.x)*labelSize.x;int ly=idx/labelSize.x;vec4 labelRaw=texelFetch(sogShNLabelsTexture,ivec2(lx,ly),0);int n=int(labelRaw.r*255.0+0.5)+int(labelRaw.g*255.0+0.5)*256;int coeffs=int(sogShCoeffCount+0.5);int u=(n-(n/64)*64)*coeffs;int v=n/64;for (int k=0; k<24; k++) {if (k>=coeffs) break;vec4 centroidRaw=texelFetch(sogShNCentroidsTexture,ivec2(u+k,v),0);vec3 shCoeff;\n#ifdef USE_SOG_V2\nint rIdx=int(centroidRaw.r*255.0+0.5);int gIdx=int(centroidRaw.g*255.0+0.5);int bIdx=int(centroidRaw.b*255.0+0.5);shCoeff.r=texelFetch(sogCodebookTexture,ivec2(512+rIdx,0),0).r;shCoeff.g=texelFetch(sogCodebookTexture,ivec2(512+gIdx,0),0).r;shCoeff.b=texelFetch(sogCodebookTexture,ivec2(512+bIdx,0),0).r;\n#else\nshCoeff=mix(vec3(sogShnMin),vec3(sogShnMax),centroidRaw.rgb);\n#endif\nsh[k+1]=shCoeff;}\nreturn computeColorFromSHDegree(dir,sh,1.,1.,1.,1.);\n#else\nreturn vec3(0.,0.,0.);\n#endif\n}\n#else\nvec3 computeSHWeighted(Splat splat,vec3 dir,float _so1,float _so2,float _so3,float _so4)\n{vec3 sh[25];sh[0]=vec3(0.,0.,0.);\n#if SH_DEGREE>0\nvec4 sh00=decompose(splat.sh0.x);vec4 sh01=decompose(splat.sh0.y);vec4 sh02=decompose(splat.sh0.z);sh[1]=vec3(sh00.x,sh00.y,sh00.z);sh[2]=vec3(sh00.w,sh01.x,sh01.y);sh[3]=vec3(sh01.z,sh01.w,sh02.x);\n#endif\n#if SH_DEGREE>1\nvec4 sh03=decompose(splat.sh0.w);vec4 sh04=decompose(splat.sh1.x);vec4 sh05=decompose(splat.sh1.y);sh[4]=vec3(sh02.y,sh02.z,sh02.w);sh[5]=vec3(sh03.x,sh03.y,sh03.z);sh[6]=vec3(sh03.w,sh04.x,sh04.y);sh[7]=vec3(sh04.z,sh04.w,sh05.x);sh[8]=vec3(sh05.y,sh05.z,sh05.w);\n#endif\n#if SH_DEGREE>2\nvec4 sh06=decompose(splat.sh1.z);vec4 sh07=decompose(splat.sh1.w);vec4 sh08=decompose(splat.sh2.x);vec4 sh09=decompose(splat.sh2.y);vec4 sh10=decompose(splat.sh2.z);vec4 sh11=decompose(splat.sh2.w);sh[9]=vec3(sh06.x,sh06.y,sh06.z);sh[10]=vec3(sh06.w,sh07.x,sh07.y);sh[11]=vec3(sh07.z,sh07.w,sh08.x);sh[12]=vec3(sh08.y,sh08.z,sh08.w);sh[13]=vec3(sh09.x,sh09.y,sh09.z);sh[14]=vec3(sh09.w,sh10.x,sh10.y);sh[15]=vec3(sh10.z,sh10.w,sh11.x);\n#endif\n#if SH_DEGREE>3\nvec4 sh12=decompose(splat.sh3.x);vec4 sh13=decompose(splat.sh3.y);vec4 sh14=decompose(splat.sh3.z);vec4 sh15=decompose(splat.sh3.w);vec4 sh16=decompose(splat.sh4.x);vec4 sh17=decompose(splat.sh4.y);sh[16]=vec3(sh11.y,sh11.z,sh11.w);sh[17]=vec3(sh12.x,sh12.y,sh12.z);sh[18]=vec3(sh12.w,sh13.x,sh13.y);sh[19]=vec3(sh13.z,sh13.w,sh14.x);sh[20]=vec3(sh14.y,sh14.z,sh14.w);sh[21]=vec3(sh15.x,sh15.y,sh15.z);sh[22]=vec3(sh15.w,sh16.x,sh16.y);sh[23]=vec3(sh16.z,sh16.w,sh17.x);sh[24]=vec3(sh17.y,sh17.z,sh17.w);\n#endif\nreturn computeColorFromSHDegree(dir,sh,_so1,_so2,_so3,_so4);}\nvec3 computeSH(Splat splat,vec3 dir)\n{\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER1==1\nfloat _w1=1.0;\n#else\nfloat _w1=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER2==1\nfloat _w2=1.0;\n#else\nfloat _w2=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER3==1\nfloat _w3=1.0;\n#else\nfloat _w3=0.0;\n#endif\n#if !defined(GS_DBG_ENABLED) || GS_DBG_SH_ORDER4==1\nfloat _w4=1.0;\n#else\nfloat _w4=0.0;\n#endif\nreturn computeSHWeighted(splat,dir,_w1,_w2,_w3,_w4);}\n#endif\n#else\nvec3 computeSH(Splat splat,vec3 dir)\n{return vec3(0.,0.,0.);}\n#endif\n#if !defined(IS_FOR_VOXELIZATION)\nvec4 gaussianSplatting(vec2 meshPos,vec3 worldPos,vec2 scale,vec3 covA,vec3 covB,mat4 worldMatrix,mat4 viewMatrix,mat4 projectionMatrix)\n{mat4 modelView=viewMatrix*worldMatrix;vec4 camspace=viewMatrix*vec4(worldPos,1.);vec4 pos2d=projectionMatrix*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {return vec4(0.0,0.0,2.0,1.0);}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);bool isOrtho=abs(projectionMatrix[3][3]-1.0)<0.001;mat3 J;if (isOrtho) {J=mat3(\nfocal.x,0.,0.,\n0.,focal.y,0.,\n0.,0.,0.\n);} else {J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);}\nmat3 T=transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;\n#if COMPENSATION\nfloat c00=cov2d[0][0];float c11=cov2d[1][1];float c01=cov2d[0][1];float detOrig=c00*c11-c01*c01;\n#endif\ncov2d[0][0]+=kernelSize;cov2d[1][1]+=kernelSize;\n#if COMPENSATION\nvec3 c2d=vec3(cov2d[0][0],c01,cov2d[1][1]);float detBlur=c2d.x*c2d.z-c2d.y*c2d.y;float compensation=sqrt(max(0.,detOrig/detBlur));vColor.w*=compensation;\n#endif\nfloat mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float epsilon=0.0001;float lambda1=mid+radius+epsilon,lambda2=mid-radius+epsilon;if (lambda2<0.0)\n{return vec4(0.0,0.0,2.0,1.0);}\nif (minPixelSize>0.0) {float l1=2.0*min(sqrt(2.0*lambda1),1024.0);float l2=2.0*min(sqrt(2.0*lambda2),1024.0);if (max(l1,l2)<minPixelSize) {return vec4(0.0,0.0,2.0,1.0);}}\nvec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vec2 vCenter=vec2(pos2d);float scaleFactor=isOrtho ? 1.0 : pos2d.w;return vec4(\nvCenter \n+ ((meshPos.x*majorAxis\n+ meshPos.y*minorAxis)*invViewport*scaleFactor)*scale,pos2d.zw);}\n#endif\n#if IS_COMPOUND\nmat4 getPartWorld(uint partIndex) {return partWorld[partIndex];}\n#endif\n#if defined(IS_FOR_VOXELIZATION)\nvec4 computeVoxelSplatWorldPos(vec4 rotationA,vec4 rotationB,vec4 rotationScale,vec3 center,mat4 splatWorld,mat4 viewMatrix,mat4 invWorldScale,vec2 quadPos) {mat3 splatRotation=mat3(\nvec3(rotationA.x,rotationA.y,rotationA.z),\nvec3(rotationA.w,rotationB.x,rotationB.y),\nvec3(rotationB.z,rotationB.w,rotationScale.x)\n);vec3 splatScale=vec3(rotationScale.y,rotationScale.z,rotationScale.w);mat3 rotToView=mat3(viewMatrix)*mat3(invWorldScale)*mat3(splatWorld)*splatRotation;vec3 axisLengthInViewZ=abs(vec3(rotToView[0][2],rotToView[1][2],rotToView[2][2]));float gaussianSplatCutoffStddev=1.4142135624/2.0; \nvec3 offsetSplatSpace;if (axisLengthInViewZ.x>axisLengthInViewZ.y && axisLengthInViewZ.x>axisLengthInViewZ.z) {offsetSplatSpace=vec3(0.0,quadPos.x,quadPos.y)*splatScale*gaussianSplatCutoffStddev;} else if (axisLengthInViewZ.y>axisLengthInViewZ.z) {offsetSplatSpace=vec3(quadPos.x,0.0,quadPos.y)*splatScale*gaussianSplatCutoffStddev;} else {offsetSplatSpace=vec3(quadPos.x,quadPos.y,0.0)*splatScale*gaussianSplatCutoffStddev;}\nvec3 vertexObjectSpace=center+splatRotation*offsetSplatSpace;return splatWorld*vec4(vertexObjectSpace,1.0);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const gaussianSplatting = { name, shader };\n"]}
|
|
@@ -3,6 +3,7 @@ import { ShaderStore } from "../Engines/shaderStore.js";
|
|
|
3
3
|
import { clipPlaneFragmentDeclaration } from "./ShadersInclude/clipPlaneFragmentDeclaration.js";
|
|
4
4
|
import { logDepthDeclaration } from "./ShadersInclude/logDepthDeclaration.js";
|
|
5
5
|
import { fogFragmentDeclaration } from "./ShadersInclude/fogFragmentDeclaration.js";
|
|
6
|
+
import { packingFunctions } from "./ShadersInclude/packingFunctions.js";
|
|
6
7
|
import { logDepthFragment } from "./ShadersInclude/logDepthFragment.js";
|
|
7
8
|
import { fogFragment } from "./ShadersInclude/fogFragment.js";
|
|
8
9
|
import { gaussianSplattingFragmentDeclaration } from "./ShadersInclude/gaussianSplattingFragmentDeclaration.js";
|
|
@@ -11,6 +12,12 @@ const name = "gaussianSplattingPixelShader";
|
|
|
11
12
|
const shader = `#include<clipPlaneFragmentDeclaration>
|
|
12
13
|
#include<logDepthDeclaration>
|
|
13
14
|
#include<fogFragmentDeclaration>
|
|
15
|
+
#ifdef GPUPICKER_DEPTH
|
|
16
|
+
layout(location=0) out highp vec4 glFragData[2];
|
|
17
|
+
#endif
|
|
18
|
+
#ifdef GPUPICKER_PACK_DEPTH
|
|
19
|
+
#include<packingFunctions>
|
|
20
|
+
#endif
|
|
14
21
|
varying vec4 vColor;varying vec2 vPosition;
|
|
15
22
|
#define CUSTOM_FRAGMENT_DEFINITIONS
|
|
16
23
|
#include<gaussianSplattingFragmentDeclaration>
|
|
@@ -19,7 +26,16 @@ void main () {
|
|
|
19
26
|
#include<clipPlaneFragment>
|
|
20
27
|
vec4 finalColor=gaussianColor(vColor);
|
|
21
28
|
#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR
|
|
29
|
+
#ifdef GPUPICKER_DEPTH
|
|
30
|
+
glFragData[0]=finalColor;
|
|
31
|
+
#ifdef GPUPICKER_PACK_DEPTH
|
|
32
|
+
glFragData[1]=pack(gl_FragCoord.z);
|
|
33
|
+
#else
|
|
34
|
+
glFragData[1]=vec4(gl_FragCoord.z,0.0,0.0,1.0);
|
|
35
|
+
#endif
|
|
36
|
+
#else
|
|
22
37
|
gl_FragColor=finalColor;
|
|
38
|
+
#endif
|
|
23
39
|
#define CUSTOM_FRAGMENT_MAIN_END
|
|
24
40
|
}
|
|
25
41
|
`;
|
|
@@ -27,7 +43,7 @@ gl_FragColor=finalColor;
|
|
|
27
43
|
if (!ShaderStore.ShadersStore[name]) {
|
|
28
44
|
ShaderStore.ShadersStore[name] = shader;
|
|
29
45
|
}
|
|
30
|
-
const includes = [clipPlaneFragmentDeclaration, logDepthDeclaration, fogFragmentDeclaration, logDepthFragment, fogFragment, gaussianSplattingFragmentDeclaration, clipPlaneFragment];
|
|
46
|
+
const includes = [clipPlaneFragmentDeclaration, logDepthDeclaration, fogFragmentDeclaration, packingFunctions, logDepthFragment, fogFragment, gaussianSplattingFragmentDeclaration, clipPlaneFragment];
|
|
31
47
|
for (const inc of includes) {
|
|
32
48
|
if (!ShaderStore.IncludesShadersStore[inc.name]) {
|
|
33
49
|
ShaderStore.IncludesShadersStore[inc.name] = inc.shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplatting.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"gaussianSplatting.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,oCAAoC,EAAE,iBAAiB,CAAC,CAAC;AACvM,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport { clipPlaneFragmentDeclaration } from \"./ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclaration } from \"./ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclaration } from \"./ShadersInclude/fogFragmentDeclaration\";\nimport { packingFunctions } from \"./ShadersInclude/packingFunctions\";\nimport { logDepthFragment } from \"./ShadersInclude/logDepthFragment\";\nimport { fogFragment } from \"./ShadersInclude/fogFragment\";\nimport { gaussianSplattingFragmentDeclaration } from \"./ShadersInclude/gaussianSplattingFragmentDeclaration\";\nimport { clipPlaneFragment } from \"./ShadersInclude/clipPlaneFragment\";\n\nconst name = \"gaussianSplattingPixelShader\";\nconst shader = `#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#ifdef GPUPICKER_DEPTH\nlayout(location=0) out highp vec4 glFragData[2];\n#endif\n#ifdef GPUPICKER_PACK_DEPTH\n#include<packingFunctions>\n#endif\nvarying vec4 vColor;varying vec2 vPosition;\n#define CUSTOM_FRAGMENT_DEFINITIONS\n#include<gaussianSplattingFragmentDeclaration>\nvoid main () {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvec4 finalColor=gaussianColor(vColor);\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef GPUPICKER_DEPTH\nglFragData[0]=finalColor;\n#ifdef GPUPICKER_PACK_DEPTH\nglFragData[1]=pack(gl_FragCoord.z);\n#else\nglFragData[1]=vec4(gl_FragCoord.z,0.0,0.0,1.0);\n#endif\n#else\ngl_FragColor=finalColor;\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclaration, logDepthDeclaration, fogFragmentDeclaration, packingFunctions, logDepthFragment, fogFragment, gaussianSplattingFragmentDeclaration, clipPlaneFragment];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gaussianSplattingPixelShader = { name, shader };\n"]}
|
|
@@ -21,7 +21,7 @@ const shader = `#include<__decl__gaussianSplattingVertex>
|
|
|
21
21
|
#include<fogVertexDeclaration>
|
|
22
22
|
#include<logDepthDeclaration>
|
|
23
23
|
#include<helperFunctions>
|
|
24
|
-
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform float alpha;
|
|
24
|
+
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float minPixelSize;uniform vec3 eyePosition;uniform float alpha;
|
|
25
25
|
#if IS_COMPOUND
|
|
26
26
|
uniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];
|
|
27
27
|
#endif
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplatting.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACvR,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport { gaussianSplattingVertexDeclaration } from \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport { sceneUboDeclaration } from \"./ShadersInclude/sceneUboDeclaration\";\nimport { meshUboDeclaration } from \"./ShadersInclude/meshUboDeclaration\";\nimport { gaussianSplattingUboDeclaration } from \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport { clipPlaneVertexDeclaration } from \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport { fogVertexDeclaration } from \"./ShadersInclude/fogVertexDeclaration\";\nimport { logDepthDeclaration } from \"./ShadersInclude/logDepthDeclaration\";\nimport { helperFunctions } from \"./ShadersInclude/helperFunctions\";\nimport { gaussianSplatting } from \"./ShadersInclude/gaussianSplatting\";\nimport { clipPlaneVertex } from \"./ShadersInclude/clipPlaneVertex\";\nimport { fogVertex } from \"./ShadersInclude/fogVertex\";\nimport { logDepthVertex } from \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gaussianSplattingVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#include<helperFunctions>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform float alpha;\n#if IS_COMPOUND\nuniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];\n#endif\nuniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;\n#ifdef USE_SOG\nuniform sampler2D sogQuatsTexture;uniform vec3 sogMeansMin;uniform vec3 sogMeansMax;\n#ifdef USE_SOG_V2\nuniform sampler2D sogCodebookTexture; \n#else\nuniform vec3 sogScalesMin;uniform vec3 sogScalesMax;uniform vec4 sogSh0Min;uniform vec4 sogSh0Max;uniform float sogShnMin;uniform float sogShnMax;\n#endif\n#if SH_DEGREE>0\nuniform sampler2D sogShNCentroidsTexture;uniform sampler2D sogShNLabelsTexture;uniform float sogShCoeffCount;\n#endif\n#endif\n#if SH_DEGREE>0 && !defined(USE_SOG)\nuniform highp usampler2D shTexture0;\n#endif\n#if SH_DEGREE>1 && !defined(USE_SOG)\nuniform highp usampler2D shTexture1;\n#endif\n#if SH_DEGREE>2 && !defined(USE_SOG)\nuniform highp usampler2D shTexture2;\n#endif\n#if SH_DEGREE>3 && !defined(USE_SOG)\nuniform highp usampler2D shTexture3;uniform highp usampler2D shTexture4;\n#endif\n#if IS_COMPOUND\nuniform sampler2D partIndicesTexture;\n#endif\nvarying vec4 vColor;varying vec2 vPosition;\n#define CUSTOM_VERTEX_DEFINITIONS\n#include<gaussianSplatting>\nvoid main () {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nfloat splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);\n#if IS_COMPOUND\nmat4 splatWorld=getPartWorld(splat.partIndex);\n#else\nmat4 splatWorld=world;\n#endif\nvec4 worldPos=splatWorld*vec4(splat.center.xyz,1.0);vColor=splat.color;vPosition=position.xy;\n#if SH_DEGREE>0\nmat3 worldRot=mat3(splatWorld);mat3 normWorldRot=inverseMat3(worldRot);vec3 eyeToSplatLocalSpace=normalize(normWorldRot*(worldPos.xyz-eyePosition));\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n{vec4 _row3=texelFetch(dbgPartData,ivec2(int(splat.partIndex),3),0);\n#if SH_DEGREE>3\nfloat _so4=texelFetch(dbgPartData,ivec2(int(splat.partIndex),4),0).x;\n#else\nfloat _so4=1.0;\n#endif\nvColor.xyz=_row3.x*splat.color.xyz+computeSHWeighted(splat,eyeToSplatLocalSpace,_row3.y,_row3.z,_row3.w,_so4);}\n#elif defined(GS_DBG_ENABLED) && GS_DBG_SH_DC==0\nvColor.xyz=computeSH(splat,eyeToSplatLocalSpace);\n#else\nvColor.xyz=splat.color.xyz+computeSH(splat,eyeToSplatLocalSpace);\n#endif\n#else\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n{float _shDc=texelFetch(dbgPartData,ivec2(int(splat.partIndex),3),0).x;vColor.xyz=_shDc*splat.color.xyz;}\n#elif defined(GS_DBG_ENABLED) && GS_DBG_SH_DC==0\nvColor.xyz=vec3(0.0);\n#endif\n#endif\nvColor.w*=alpha;\n#if IS_COMPOUND\nvColor.w*=partVisibility[splat.partIndex];\n#endif\nvec2 scale=vec2(1.,1.);\n#define CUSTOM_VERTEX_UPDATE\ngl_Position=gaussianSplatting(position.xy,worldPos.xyz,scale,covA,covB,splatWorld,view,projection);\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [gaussianSplattingVertexDeclaration, sceneUboDeclaration, meshUboDeclaration, gaussianSplattingUboDeclaration, clipPlaneVertexDeclaration, fogVertexDeclaration, logDepthDeclaration, helperFunctions, gaussianSplatting, clipPlaneVertex, fogVertex, logDepthVertex];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gaussianSplattingVertexShader = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplatting.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACvR,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport { gaussianSplattingVertexDeclaration } from \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport { sceneUboDeclaration } from \"./ShadersInclude/sceneUboDeclaration\";\nimport { meshUboDeclaration } from \"./ShadersInclude/meshUboDeclaration\";\nimport { gaussianSplattingUboDeclaration } from \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport { clipPlaneVertexDeclaration } from \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport { fogVertexDeclaration } from \"./ShadersInclude/fogVertexDeclaration\";\nimport { logDepthDeclaration } from \"./ShadersInclude/logDepthDeclaration\";\nimport { helperFunctions } from \"./ShadersInclude/helperFunctions\";\nimport { gaussianSplatting } from \"./ShadersInclude/gaussianSplatting\";\nimport { clipPlaneVertex } from \"./ShadersInclude/clipPlaneVertex\";\nimport { fogVertex } from \"./ShadersInclude/fogVertex\";\nimport { logDepthVertex } from \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gaussianSplattingVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#include<helperFunctions>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float minPixelSize;uniform vec3 eyePosition;uniform float alpha;\n#if IS_COMPOUND\nuniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];\n#endif\nuniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;\n#ifdef USE_SOG\nuniform sampler2D sogQuatsTexture;uniform vec3 sogMeansMin;uniform vec3 sogMeansMax;\n#ifdef USE_SOG_V2\nuniform sampler2D sogCodebookTexture; \n#else\nuniform vec3 sogScalesMin;uniform vec3 sogScalesMax;uniform vec4 sogSh0Min;uniform vec4 sogSh0Max;uniform float sogShnMin;uniform float sogShnMax;\n#endif\n#if SH_DEGREE>0\nuniform sampler2D sogShNCentroidsTexture;uniform sampler2D sogShNLabelsTexture;uniform float sogShCoeffCount;\n#endif\n#endif\n#if SH_DEGREE>0 && !defined(USE_SOG)\nuniform highp usampler2D shTexture0;\n#endif\n#if SH_DEGREE>1 && !defined(USE_SOG)\nuniform highp usampler2D shTexture1;\n#endif\n#if SH_DEGREE>2 && !defined(USE_SOG)\nuniform highp usampler2D shTexture2;\n#endif\n#if SH_DEGREE>3 && !defined(USE_SOG)\nuniform highp usampler2D shTexture3;uniform highp usampler2D shTexture4;\n#endif\n#if IS_COMPOUND\nuniform sampler2D partIndicesTexture;\n#endif\nvarying vec4 vColor;varying vec2 vPosition;\n#define CUSTOM_VERTEX_DEFINITIONS\n#include<gaussianSplatting>\nvoid main () {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nfloat splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);\n#if IS_COMPOUND\nmat4 splatWorld=getPartWorld(splat.partIndex);\n#else\nmat4 splatWorld=world;\n#endif\nvec4 worldPos=splatWorld*vec4(splat.center.xyz,1.0);vColor=splat.color;vPosition=position.xy;\n#if SH_DEGREE>0\nmat3 worldRot=mat3(splatWorld);mat3 normWorldRot=inverseMat3(worldRot);vec3 eyeToSplatLocalSpace=normalize(normWorldRot*(worldPos.xyz-eyePosition));\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n{vec4 _row3=texelFetch(dbgPartData,ivec2(int(splat.partIndex),3),0);\n#if SH_DEGREE>3\nfloat _so4=texelFetch(dbgPartData,ivec2(int(splat.partIndex),4),0).x;\n#else\nfloat _so4=1.0;\n#endif\nvColor.xyz=_row3.x*splat.color.xyz+computeSHWeighted(splat,eyeToSplatLocalSpace,_row3.y,_row3.z,_row3.w,_so4);}\n#elif defined(GS_DBG_ENABLED) && GS_DBG_SH_DC==0\nvColor.xyz=computeSH(splat,eyeToSplatLocalSpace);\n#else\nvColor.xyz=splat.color.xyz+computeSH(splat,eyeToSplatLocalSpace);\n#endif\n#else\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n{float _shDc=texelFetch(dbgPartData,ivec2(int(splat.partIndex),3),0).x;vColor.xyz=_shDc*splat.color.xyz;}\n#elif defined(GS_DBG_ENABLED) && GS_DBG_SH_DC==0\nvColor.xyz=vec3(0.0);\n#endif\n#endif\nvColor.w*=alpha;\n#if IS_COMPOUND\nvColor.w*=partVisibility[splat.partIndex];\n#endif\nvec2 scale=vec2(1.,1.);\n#define CUSTOM_VERTEX_UPDATE\ngl_Position=gaussianSplatting(position.xy,worldPos.xyz,scale,covA,covB,splatWorld,view,projection);\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [gaussianSplattingVertexDeclaration, sceneUboDeclaration, meshUboDeclaration, gaussianSplattingUboDeclaration, clipPlaneVertexDeclaration, fogVertexDeclaration, logDepthDeclaration, helperFunctions, gaussianSplatting, clipPlaneVertex, fogVertex, logDepthVertex];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gaussianSplattingVertexShader = { name, shader };\n"]}
|
|
@@ -7,7 +7,7 @@ import { gaussianSplattingUboDeclaration } from "./ShadersInclude/gaussianSplatt
|
|
|
7
7
|
import { gaussianSplatting } from "./ShadersInclude/gaussianSplatting.js";
|
|
8
8
|
const name = "gaussianSplattingDepthVertexShader";
|
|
9
9
|
const shader = `#include<__decl__gaussianSplattingVertex>
|
|
10
|
-
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;
|
|
10
|
+
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float minPixelSize;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;
|
|
11
11
|
#if IS_COMPOUND
|
|
12
12
|
uniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];uniform sampler2D partIndicesTexture;
|
|
13
13
|
#endif
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplattingDepth.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplattingDepth.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,MAAM,IAAI,GAAG,oCAAoC,CAAC;AAClD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4Bb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,iBAAiB,CAAC,CAAC;AACnJ,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport { gaussianSplattingVertexDeclaration } from \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport { sceneUboDeclaration } from \"./ShadersInclude/sceneUboDeclaration\";\nimport { meshUboDeclaration } from \"./ShadersInclude/meshUboDeclaration\";\nimport { gaussianSplattingUboDeclaration } from \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport { gaussianSplatting } from \"./ShadersInclude/gaussianSplatting\";\n\nconst name = \"gaussianSplattingDepthVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;\n#if IS_COMPOUND\nuniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];uniform sampler2D partIndicesTexture;\n#endif\nvarying vec2 vPosition;varying vec4 vColor;\n#include<gaussianSplatting>\n#ifdef DEPTH_RENDER\nuniform vec2 depthValues;varying float vDepthMetric;\n#endif\nvoid main(void) {float splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);\n#if IS_COMPOUND\nmat4 splatWorld=getPartWorld(splat.partIndex);\n#else\nmat4 splatWorld=world;\n#endif\nvec4 worldPosGS=splatWorld*vec4(splat.center.xyz,1.0);vPosition=position.xy;vColor=splat.color;vColor.w*=alpha;\n#if IS_COMPOUND\nvColor.w*=partVisibility[splat.partIndex];\n#endif\ngl_Position=gaussianSplatting(position.xy,worldPosGS.xyz,vec2(1.,1.),covA,covB,splatWorld,view,projection);\n#ifdef DEPTH_RENDER\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetric=((-gl_Position.z+depthValues.x)/(depthValues.y));\n#else\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));\n#endif\n#endif\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [gaussianSplattingVertexDeclaration, sceneUboDeclaration, meshUboDeclaration, gaussianSplattingUboDeclaration, gaussianSplatting];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gaussianSplattingDepthVertexShader = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplattingDepth.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplattingDepth.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,MAAM,IAAI,GAAG,oCAAoC,CAAC;AAClD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4Bb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,iBAAiB,CAAC,CAAC;AACnJ,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport { gaussianSplattingVertexDeclaration } from \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport { sceneUboDeclaration } from \"./ShadersInclude/sceneUboDeclaration\";\nimport { meshUboDeclaration } from \"./ShadersInclude/meshUboDeclaration\";\nimport { gaussianSplattingUboDeclaration } from \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport { gaussianSplatting } from \"./ShadersInclude/gaussianSplatting\";\n\nconst name = \"gaussianSplattingDepthVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform float minPixelSize;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;\n#if IS_COMPOUND\nuniform mat4 partWorld[MAX_PART_COUNT];uniform float partVisibility[MAX_PART_COUNT];uniform sampler2D partIndicesTexture;\n#endif\nvarying vec2 vPosition;varying vec4 vColor;\n#include<gaussianSplatting>\n#ifdef DEPTH_RENDER\nuniform vec2 depthValues;varying float vDepthMetric;\n#endif\nvoid main(void) {float splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);\n#if IS_COMPOUND\nmat4 splatWorld=getPartWorld(splat.partIndex);\n#else\nmat4 splatWorld=world;\n#endif\nvec4 worldPosGS=splatWorld*vec4(splat.center.xyz,1.0);vPosition=position.xy;vColor=splat.color;vColor.w*=alpha;\n#if IS_COMPOUND\nvColor.w*=partVisibility[splat.partIndex];\n#endif\ngl_Position=gaussianSplatting(position.xy,worldPosGS.xyz,vec2(1.,1.),covA,covB,splatWorld,view,projection);\n#ifdef DEPTH_RENDER\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetric=((-gl_Position.z+depthValues.x)/(depthValues.y));\n#else\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));\n#endif\n#endif\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [gaussianSplattingVertexDeclaration, sceneUboDeclaration, meshUboDeclaration, gaussianSplattingUboDeclaration, gaussianSplatting];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gaussianSplattingDepthVertexShader = { name, shader };\n"]}
|