Skip to content

Experiment: Gaussian Splat Stochastic#13202

Draft
danielzhong wants to merge 14 commits intomainfrom
DanielZ/Splat_FIX_stochastic
Draft

Experiment: Gaussian Splat Stochastic#13202
danielzhong wants to merge 14 commits intomainfrom
DanielZ/Splat_FIX_stochastic

Conversation

@danielzhong
Copy link
Contributor

@danielzhong danielzhong commented Feb 11, 2026

Description

image
Sandcastle_._.CesiumJS.-.Google.Chrome.2026-02-11.18-10-48.mp4

This PR experiments with stochastic transparency for Gaussian splats (inspired by Spark), and adds Temporal Anti-Aliasing (TAA) to stabilize the result

The idea is Instead of requiring fully precise transparent compositing for every overlapping splat, stochastic rendering treats alpha as probabilistic coverage. Each fragment uses a hash-based accept/discard test, so the image becomes an approximation that converges visually over space/time.

Why this can be faster:

  • Reduces dependence on strict transparent ordering in dense overlap cases.
  • Lowers blending/overdraw pressure by replacing full contribution with cheaper stochastic sampling.
  • Shifts work from exact per-fragment compositing to a simpler probabilistic path.

Issue number and link

https://github.com/iTwin/platform-engineering/issues/368

Testing plan

Please host LOD GS data, then run following code in local build:

const viewer = new Cesium.Viewer("cesiumContainer");
viewer.scene.debugShowFramesPerSecond = true;

const taa = Cesium.PostProcessStageLibrary.createTemporalAntiAliasingStage({
  feedback: 0.9,
  resetDistance: 0.001,
  resetDot: 0.999,
});
viewer.scene.postProcessStages.add(taa);

const url = "http://localhost:8081/CoStarWithSH/tileset.json";
const tileset = await Cesium.Cesium3DTileset.fromUrl(url, { maximumScreenSpaceError: 16 });
window.tileset = tileset;

tileset._gaussianSplatStochastic = true;
tileset._gaussianSplatStochasticSteady = false;

viewer.scene.primitives.add(tileset);
viewer.zoomTo(tileset);

Author checklist

  • I have submitted a Contributor License Agreement
  • I have added my name to CONTRIBUTORS.md
  • I have updated CHANGES.md with a short summary of my change
  • I have added or updated unit tests to ensure consistent code coverage
  • I have updated the inline documentation, and included code examples where relevant
  • I have performed a self-review of my code

@github-actions
Copy link

Thank you for the pull request, @danielzhong!

✅ We can confirm we have a CLA on file for you.

@danielzhong danielzhong self-assigned this Feb 11, 2026
@weegeekps
Copy link
Contributor

This is very promising, but the noise is really bad. The additional TAA definitely helps, but it has to be configured so aggressively to do so that any sort of movement causes ghosting that goes far beyond the line of acceptability, since it impacts the user experience so heavily.

I think the only way this could work is if we could reduce the noise to about half as bad as it is and make it opt-in. The TAA also can't cause ghosting that is so bad that it impacts accurately moving the camera.

Realistically, the only way I see that being possible at the moment is through a deep learning denoiser. I know I have seen a couple experimental ones in the past built on TensorFlow.js, but I don't think any of them went very far beyond brief experiments.

Maybe @lilleyse or @donmccurdy have some ideas.

@danielzhong
Copy link
Contributor Author

danielzhong commented Feb 13, 2026

This is very promising, but the noise is really bad. The additional TAA definitely helps, but it has to be configured so aggressively to do so that any sort of movement causes ghosting that goes far beyond the line of acceptability, since it impacts the user experience so heavily.

I think the only way this could work is if we could reduce the noise to about half as bad as it is and make it opt-in. The TAA also can't cause ghosting that is so bad that it impacts accurately moving the camera.

Realistically, the only way I see that being possible at the moment is through a deep learning denoiser. I know I have seen a couple experimental ones in the past built on TensorFlow.js, but I don't think any of them went very far beyond brief experiments.

Maybe @lilleyse or @donmccurdy have some ideas.

The current TAA implementation is not a motion vector based TAA. It is essentially a simple temporal accumulation that blends the current frame with the previous one. Because of this, ghosting is expected with this approach, A full motion vector based TAA implementation would likely provide improved visual quality.

Update:
I added motion vectors to the TAA implementation, and the ghosting artifacts are now largely eliminated. However, the result is still somewhat noisy, and due to this noise, the visual quality is not yet as good as the original implementation.

@weegeekps
Copy link
Contributor

I added motion vectors to the TAA implementation, and the ghosting artifacts are now largely eliminated. However, the result is still somewhat noisy, and due to this noise, the visual quality is not yet as good as the original implementation.

Yeah, I did look closely and see that you weren't using motion vectors with your TAA implementation but didn't mention anything because I expected that their introduction would lessen the effect against the noise.

If I have time at the end of the day today, I may look closer at this and see if there's something we can do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants