@babylonjs/core 9.3.0 → 9.3.2
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/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.d.ts +49 -1118
- package/FlowGraph/flowGraph.d.ts +11 -0
- package/FlowGraph/flowGraph.js +20 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +30 -0
- package/FlowGraph/flowGraphContext.js +42 -0
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +13 -0
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +16 -0
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/Layers/thinSelectionOutlineLayer.js +25 -1
- package/Layers/thinSelectionOutlineLayer.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.d.ts +1 -0
- package/Lights/Clustered/clusteredLightContainer.js +19 -0
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Lights/light.d.ts +6 -0
- package/Lights/light.js +8 -0
- package/Lights/light.js.map +1 -1
- package/Lights/spotLight.d.ts +2 -0
- package/Lights/spotLight.js +10 -0
- package/Lights/spotLight.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +4 -1
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +18 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +116 -3
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.d.ts +8 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js +16 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +3 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +4 -1
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.js +4 -1
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +4 -1
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +1 -0
- package/Materials/Textures/baseTexture.js +1 -0
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +12 -0
- package/Materials/materialHelper.functions.js +24 -0
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/standardMaterial.js +4 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +18 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +40 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.d.ts +27 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +241 -10
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
- package/Misc/tools.js +1 -1
- package/Misc/tools.js.map +1 -1
- package/Particles/IParticleSystem.d.ts +7 -1
- package/Particles/IParticleSystem.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +18 -2
- package/Particles/baseParticleSystem.js +53 -11
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +16 -0
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +14 -72
- package/Particles/gpuParticleSystem.js +130 -106
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +0 -80
- package/Particles/particleSystem.functions.d.ts +16 -0
- package/Particles/particleSystem.functions.js +18 -0
- package/Particles/particleSystem.functions.js.map +1 -1
- package/Particles/particleSystem.js +0 -114
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +12 -0
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +17 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +10 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +146 -24
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/depthRenderer.d.ts +8 -0
- package/Rendering/depthRenderer.js +48 -13
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/depthRendererSceneComponent.d.ts +1 -0
- package/Rendering/depthRendererSceneComponent.js +26 -0
- package/Rendering/depthRendererSceneComponent.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +2 -0
- package/Rendering/objectRenderer.js +10 -0
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +21 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/gaussianSplattingVoxel.fragment.d.ts +5 -0
- package/Shaders/gaussianSplattingVoxel.fragment.js +27 -0
- package/Shaders/gaussianSplattingVoxel.fragment.js.map +1 -0
- package/Shaders/gaussianSplattingVoxel.vertex.d.ts +8 -0
- package/Shaders/gaussianSplattingVoxel.vertex.js +31 -0
- package/Shaders/gaussianSplattingVoxel.vertex.js.map +1 -0
- package/Shaders/gpuUpdateParticles.vertex.js +13 -0
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +21 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingVoxel.fragment.d.ts +5 -0
- package/ShadersWGSL/gaussianSplattingVoxel.fragment.js +22 -0
- package/ShadersWGSL/gaussianSplattingVoxel.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.d.ts +8 -0
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +42 -0
- package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -0
- package/ShadersWGSL/gpuUpdateParticles.compute.js +19 -0
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/XR/features/WebXRBodyTracking.d.ts +952 -0
- package/XR/features/WebXRBodyTracking.js +2221 -0
- package/XR/features/WebXRBodyTracking.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +7 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/package.json +1 -1
- package/sceneComponent.d.ts +1 -0
- package/sceneComponent.js +1 -0
- package/sceneComponent.js.map +1 -1
|
@@ -118,6 +118,8 @@ export class _IblShadowsVoxelRenderer {
|
|
|
118
118
|
*/
|
|
119
119
|
this.onVoxelizationCompleteObservable = new Observable();
|
|
120
120
|
this._renderTargets = [];
|
|
121
|
+
/** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */
|
|
122
|
+
this._gsVoxelMaterialCache = new Map();
|
|
121
123
|
this._triPlanarVoxelization = true;
|
|
122
124
|
this._voxelizationInProgress = false;
|
|
123
125
|
this._invWorldScaleMatrix = Matrix.Identity();
|
|
@@ -516,6 +518,9 @@ export class _IblShadowsVoxelRenderer {
|
|
|
516
518
|
const rttReady = this._renderTargets[i].isReadyForRendering();
|
|
517
519
|
allReady && (allReady = rttReady);
|
|
518
520
|
}
|
|
521
|
+
for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {
|
|
522
|
+
allReady && (allReady = gsVoxelMat.isReady());
|
|
523
|
+
}
|
|
519
524
|
if (!allReady) {
|
|
520
525
|
return;
|
|
521
526
|
}
|
|
@@ -549,6 +554,98 @@ export class _IblShadowsVoxelRenderer {
|
|
|
549
554
|
this.onVoxelizationCompleteObservable.notifyObservers();
|
|
550
555
|
}
|
|
551
556
|
}
|
|
557
|
+
/**
|
|
558
|
+
* Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render
|
|
559
|
+
* (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.
|
|
560
|
+
* @param rtt - the render target texture to install the custom render function on
|
|
561
|
+
*/
|
|
562
|
+
_installVoxelMixedCustomRender(rtt) {
|
|
563
|
+
const scene = this._scene;
|
|
564
|
+
const engine = scene.getEngine();
|
|
565
|
+
const renderGsSplat = (sm) => {
|
|
566
|
+
const renderingMesh = sm.getRenderingMesh();
|
|
567
|
+
const effectiveMesh = sm.getEffectiveMesh();
|
|
568
|
+
const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);
|
|
569
|
+
if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
const drawWrapper = gsVoxelMaterial._getDrawWrapper();
|
|
573
|
+
if (!drawWrapper?.effect) {
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
const effect = drawWrapper.effect;
|
|
577
|
+
const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());
|
|
578
|
+
if (batch.mustReturn) {
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
const hardwareInstancedRendering = engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);
|
|
582
|
+
const fillMode = sm.getMaterial()?.fillMode ?? 0;
|
|
583
|
+
engine.enableEffect(drawWrapper);
|
|
584
|
+
renderingMesh._bind(sm, effect, fillMode);
|
|
585
|
+
gsVoxelMaterial._preBind(drawWrapper);
|
|
586
|
+
gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);
|
|
587
|
+
// If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.
|
|
588
|
+
if (!effectiveMesh.rotationsATexture) {
|
|
589
|
+
gsVoxelMaterial.unbind();
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
if (engine.isWebGPU) {
|
|
593
|
+
// A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid
|
|
594
|
+
// we rasterize three planar cross-section quads — one per principal axis — each
|
|
595
|
+
// spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered
|
|
596
|
+
// edge-on produces zero fragments, so we draw once per world axis: each draw lets
|
|
597
|
+
// computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,
|
|
598
|
+
// guaranteeing every splat is captured face-on from at least one direction.
|
|
599
|
+
const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;
|
|
600
|
+
for (let axisIdx = 0; axisIdx < 3; axisIdx++) {
|
|
601
|
+
effect.setMatrix("viewMatrix", viewMatrices[axisIdx]);
|
|
602
|
+
renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {
|
|
603
|
+
effect.setMatrix("world", world);
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix("world", world));
|
|
609
|
+
}
|
|
610
|
+
gsVoxelMaterial.unbind();
|
|
611
|
+
};
|
|
612
|
+
const processBucket = (subMeshes, enableAlphaMode) => {
|
|
613
|
+
for (let i = 0; i < subMeshes.length; i++) {
|
|
614
|
+
const sm = subMeshes.data[i];
|
|
615
|
+
const effective = sm.getEffectiveMesh();
|
|
616
|
+
if (effective.getClassName() === "GaussianSplattingMesh") {
|
|
617
|
+
renderGsSplat(sm);
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
sm.render(enableAlphaMode);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
rtt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {
|
|
625
|
+
if (depthOnlySubMeshes.length) {
|
|
626
|
+
engine.setColorWrite(false);
|
|
627
|
+
processBucket(depthOnlySubMeshes, false);
|
|
628
|
+
engine.setColorWrite(true);
|
|
629
|
+
}
|
|
630
|
+
processBucket(opaqueSubMeshes, false);
|
|
631
|
+
processBucket(alphaTestSubMeshes, false);
|
|
632
|
+
processBucket(transparentSubMeshes, true);
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
_addGsMeshToVoxelRT(mrt, mesh) {
|
|
636
|
+
let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);
|
|
637
|
+
if (!gsVoxelMaterial) {
|
|
638
|
+
const gsMaterial = mesh.material;
|
|
639
|
+
if (!gsMaterial) {
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
const shaderLanguage = this._engine.isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */;
|
|
643
|
+
gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);
|
|
644
|
+
this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);
|
|
645
|
+
}
|
|
646
|
+
mrt.renderList?.push(mesh);
|
|
647
|
+
mrt.setMaterialForRendering(mesh, gsVoxelMaterial);
|
|
648
|
+
}
|
|
552
649
|
_addRTsForRender(mrts, includedMeshes, axis) {
|
|
553
650
|
const slabSize = 1.0 / this._computeNumberOfSlabs();
|
|
554
651
|
const voxelMaterial = this._voxelMaterial;
|
|
@@ -576,21 +673,10 @@ export class _IblShadowsVoxelRenderer {
|
|
|
576
673
|
const nearPlane = mrtIndex * slabSize;
|
|
577
674
|
const farPlane = (mrtIndex + 1) * slabSize;
|
|
578
675
|
const stepSize = slabSize / this._maxDrawBuffers;
|
|
579
|
-
const
|
|
580
|
-
let targetPosition = new Vector3(0, 0, 1);
|
|
581
|
-
if (axis === 0) {
|
|
582
|
-
targetPosition = new Vector3(1, 0, 0);
|
|
583
|
-
}
|
|
584
|
-
else if (axis === 1) {
|
|
585
|
-
targetPosition = new Vector3(0, 1, 0);
|
|
586
|
-
}
|
|
587
|
-
let upDirection = new Vector3(0, 1, 0);
|
|
588
|
-
if (axis === 1) {
|
|
589
|
-
upDirection = new Vector3(1, 0, 0);
|
|
590
|
-
}
|
|
676
|
+
const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];
|
|
591
677
|
mrt.onBeforeRenderObservable.clear();
|
|
592
678
|
mrt.onBeforeRenderObservable.add(() => {
|
|
593
|
-
voxelMaterial.setMatrix("viewMatrix",
|
|
679
|
+
voxelMaterial.setMatrix("viewMatrix", viewMatrix);
|
|
594
680
|
voxelMaterial.setMatrix("invWorldScale", this._invWorldScaleMatrix);
|
|
595
681
|
voxelMaterial.setFloat("nearPlane", nearPlane);
|
|
596
682
|
voxelMaterial.setFloat("farPlane", farPlane);
|
|
@@ -599,26 +685,53 @@ export class _IblShadowsVoxelRenderer {
|
|
|
599
685
|
this._voxelMaterial.useVertexPulling = true;
|
|
600
686
|
this._voxelMaterial.setTexture("voxel_storage", this.getVoxelGrid());
|
|
601
687
|
}
|
|
688
|
+
// Push per-slab uniforms to each GS voxel material in this MRT's render list.
|
|
689
|
+
for (const m of mrt.renderList ?? []) {
|
|
690
|
+
if (m.getClassName() === "GaussianSplattingMesh") {
|
|
691
|
+
const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);
|
|
692
|
+
if (gsVoxelMat) {
|
|
693
|
+
gsVoxelMat.setMatrix("invWorldScale", this._invWorldScaleMatrix);
|
|
694
|
+
if (this._engine.isWebGPU) {
|
|
695
|
+
// WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.
|
|
696
|
+
gsVoxelMat.setTexture("voxel_storage", this.getVoxelGrid());
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
gsVoxelMat.setMatrix("viewMatrix", viewMatrix);
|
|
700
|
+
gsVoxelMat.setFloat("nearPlane", nearPlane);
|
|
701
|
+
gsVoxelMat.setFloat("farPlane", farPlane);
|
|
702
|
+
gsVoxelMat.setFloat("stepSize", stepSize);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
602
707
|
});
|
|
603
708
|
// Set this material on every mesh in the scene (for this RT)
|
|
604
709
|
if (includedMeshes.length === 0) {
|
|
605
710
|
return;
|
|
606
711
|
}
|
|
607
712
|
for (const mesh of includedMeshes) {
|
|
608
|
-
if (mesh) {
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
713
|
+
if (!mesh) {
|
|
714
|
+
continue;
|
|
715
|
+
}
|
|
716
|
+
if (mesh.getClassName() === "GaussianSplattingMesh") {
|
|
717
|
+
this._addGsMeshToVoxelRT(mrt, mesh);
|
|
718
|
+
}
|
|
719
|
+
else if (mesh.subMeshes && mesh.subMeshes.length > 0) {
|
|
720
|
+
mrt.renderList?.push(mesh);
|
|
721
|
+
mrt.setMaterialForRendering(mesh, voxelMaterial);
|
|
722
|
+
}
|
|
723
|
+
const meshes = mesh.getChildMeshes();
|
|
724
|
+
for (const childMesh of meshes) {
|
|
725
|
+
if (childMesh.getClassName() === "GaussianSplattingMesh") {
|
|
726
|
+
this._addGsMeshToVoxelRT(mrt, childMesh);
|
|
612
727
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
mrt.renderList?.push(childMesh);
|
|
617
|
-
mrt.setMaterialForRendering(childMesh, voxelMaterial);
|
|
618
|
-
}
|
|
728
|
+
else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {
|
|
729
|
+
mrt.renderList?.push(childMesh);
|
|
730
|
+
mrt.setMaterialForRendering(childMesh, voxelMaterial);
|
|
619
731
|
}
|
|
620
732
|
}
|
|
621
733
|
}
|
|
734
|
+
this._installVoxelMixedCustomRender(mrt);
|
|
622
735
|
}
|
|
623
736
|
this._renderTargets = this._renderTargets.concat(mrts);
|
|
624
737
|
}
|
|
@@ -631,7 +744,16 @@ export class _IblShadowsVoxelRenderer {
|
|
|
631
744
|
*/
|
|
632
745
|
dispose() {
|
|
633
746
|
this._disposeVoxelTextures();
|
|
634
|
-
|
|
747
|
+
for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {
|
|
748
|
+
mat.dispose();
|
|
749
|
+
}
|
|
750
|
+
this._gsVoxelMaterialCache.clear();
|
|
635
751
|
}
|
|
636
752
|
}
|
|
753
|
+
// View matrices for the three voxelization axes.
|
|
754
|
+
_IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES = [
|
|
755
|
+
Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),
|
|
756
|
+
Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),
|
|
757
|
+
Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),
|
|
758
|
+
];
|
|
637
759
|
//# sourceMappingURL=iblShadowsVoxelRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblShadowsVoxelRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\nimport { type Mesh } from \"../../Meshes/mesh\";\nimport { type Scene } from \"../../scene\";\nimport { Texture } from \"../../Materials/Textures/texture\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\nimport { type RenderTargetWrapper } from \"core/Engines\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport \"../../Engines/Extensions/engine.multiRender\";\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 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 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 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 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 mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n const buckets = [depthOnlySubMeshes, opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes];\n for (const bucket of buckets) {\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\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const cameraPosition = new Vector3(0, 0, 0);\n let targetPosition = new Vector3(0, 0, 1);\n if (axis === 0) {\n targetPosition = new Vector3(1, 0, 0);\n } else if (axis === 1) {\n targetPosition = new Vector3(0, 1, 0);\n }\n let upDirection = new Vector3(0, 1, 0);\n if (axis === 1) {\n upDirection = new Vector3(1, 0, 0);\n }\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));\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 });\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 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.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n }\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 // TODO - dispose all created voxel materials.\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\nimport { type Mesh } from \"../../Meshes/mesh\";\nimport { type SubMesh } from \"../../Meshes/subMesh\";\nimport { type Scene } from \"../../scene\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial\";\nimport \"../../Engines/Extensions/engine.multiRender\";\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 mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n const buckets = [depthOnlySubMeshes, opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes];\n for (const bucket of buckets) {\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\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"]}
|
|
@@ -67,6 +67,14 @@ export declare class DepthRenderer {
|
|
|
67
67
|
* @param material material to use by the depth render when rendering the mesh(es). If undefined is passed, the specific material created by the depth renderer will be used.
|
|
68
68
|
*/
|
|
69
69
|
setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material): void;
|
|
70
|
+
/**
|
|
71
|
+
* Ensures the GaussianSplatting depth material exists and is up to date for the given mesh.
|
|
72
|
+
* Creates the material on first call, and recreates it when alphaBlendedDepth changes.
|
|
73
|
+
* @param mesh the GaussianSplatting mesh
|
|
74
|
+
* @param renderPassId the render pass ID to look up the per-pass material
|
|
75
|
+
* @returns the current depth rendering material, or null if the mesh has no GS material
|
|
76
|
+
*/
|
|
77
|
+
private _ensureGaussianSplattingDepthMaterial;
|
|
70
78
|
/**
|
|
71
79
|
* Instantiates a depth renderer
|
|
72
80
|
* @param scene The scene the renderer belongs to
|
|
@@ -45,6 +45,28 @@ export class DepthRenderer {
|
|
|
45
45
|
setMaterialForRendering(mesh, material) {
|
|
46
46
|
this._depthMap.setMaterialForRendering(mesh, material);
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Ensures the GaussianSplatting depth material exists and is up to date for the given mesh.
|
|
50
|
+
* Creates the material on first call, and recreates it when alphaBlendedDepth changes.
|
|
51
|
+
* @param mesh the GaussianSplatting mesh
|
|
52
|
+
* @param renderPassId the render pass ID to look up the per-pass material
|
|
53
|
+
* @returns the current depth rendering material, or null if the mesh has no GS material
|
|
54
|
+
*/
|
|
55
|
+
_ensureGaussianSplattingDepthMaterial(mesh, renderPassId) {
|
|
56
|
+
let renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId];
|
|
57
|
+
const cachedAlphaBlendedDepth = this._alphaBlendedDepthMaterialCache.get(mesh.uniqueId);
|
|
58
|
+
if (renderingMaterial === undefined || cachedAlphaBlendedDepth !== this.alphaBlendedDepth) {
|
|
59
|
+
const gsMaterial = mesh.material;
|
|
60
|
+
if (!gsMaterial) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const compoundMesh = mesh.isCompound;
|
|
64
|
+
renderingMaterial = gsMaterial.makeDepthRenderingMaterial(this._scene, this._shaderLanguage, this.alphaBlendedDepth, compoundMesh);
|
|
65
|
+
this.setMaterialForRendering(mesh, renderingMaterial);
|
|
66
|
+
this._alphaBlendedDepthMaterialCache.set(mesh.uniqueId, this.alphaBlendedDepth);
|
|
67
|
+
}
|
|
68
|
+
return renderingMaterial;
|
|
69
|
+
}
|
|
48
70
|
/**
|
|
49
71
|
* Instantiates a depth renderer
|
|
50
72
|
* @param scene The scene the renderer belongs to
|
|
@@ -171,22 +193,26 @@ export class DepthRenderer {
|
|
|
171
193
|
const camera = this._camera || scene.activeCamera;
|
|
172
194
|
if (this.isReady(subMesh, hardwareInstancedRendering) && camera) {
|
|
173
195
|
subMesh._renderId = scene.getRenderId();
|
|
174
|
-
let renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];
|
|
175
196
|
const gsClassName = effectiveMesh.getClassName();
|
|
176
197
|
if (gsClassName === "GaussianSplattingMesh") {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
198
|
+
const gsMaterial = this._ensureGaussianSplattingDepthMaterial(effectiveMesh, engine.currentRenderPassId);
|
|
199
|
+
if (gsMaterial && !gsMaterial.isReadyForSubMesh(effectiveMesh, subMesh, hardwareInstancedRendering)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// Alpha blending for transparent materials
|
|
203
|
+
if (this.alphaBlendedDepth && material.needAlphaBlendingForMesh(effectiveMesh)) {
|
|
204
|
+
engine.setAlphaMode(2);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
engine.setAlphaMode(0);
|
|
188
208
|
}
|
|
209
|
+
// Delegate to the GS mesh's render() which properly routes through camera meshes
|
|
210
|
+
// with the correct thin instance data. The depth material is already set as the
|
|
211
|
+
// render pass material and will be propagated to the camera mesh.
|
|
212
|
+
effectiveMesh.render(subMesh, false);
|
|
213
|
+
return;
|
|
189
214
|
}
|
|
215
|
+
const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];
|
|
190
216
|
let drawWrapper = subMesh._getDrawWrapper();
|
|
191
217
|
if (!drawWrapper && renderingMaterial) {
|
|
192
218
|
drawWrapper = renderingMaterial._getDrawWrapper();
|
|
@@ -314,7 +340,16 @@ export class DepthRenderer {
|
|
|
314
340
|
const engine = this._scene.getEngine();
|
|
315
341
|
const mesh = subMesh.getMesh();
|
|
316
342
|
const scene = mesh.getScene();
|
|
317
|
-
|
|
343
|
+
// Use the depth map's render pass ID to look up per-pass materials,
|
|
344
|
+
// since isReady can be called outside of the depth renderer's render pass
|
|
345
|
+
// (e.g. from the scene's isReady check).
|
|
346
|
+
const renderPassId = this._depthMap.renderPassId;
|
|
347
|
+
let renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId] ?? null;
|
|
348
|
+
// For GaussianSplatting meshes, eagerly create the depth material so that
|
|
349
|
+
// the scene's isReady check properly blocks until it is compiled.
|
|
350
|
+
if (mesh.getClassName() === "GaussianSplattingMesh") {
|
|
351
|
+
renderingMaterial = this._ensureGaussianSplattingDepthMaterial(mesh, renderPassId);
|
|
352
|
+
}
|
|
318
353
|
if (renderingMaterial) {
|
|
319
354
|
return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);
|
|
320
355
|
}
|