Skip to content

Repository files navigation

SplatStylize — real-time Gaussian splat stylizer

Panel-driven stylization for the WorldLabs / aras-p Gaussian Splatting renderer. Open it from Window → Splat Stylizer.

The panel

  • Splat Object dropdown — switch between splats in the scene; every setting below is stored per-splat (on a SplatStylizeController added automatically).
  • Style Mode — Off / Painterly / Comic. Off = stock rendering + grading only.
  • Analyze / Regenerate — reads splat positions+colours from the GPU and computes colour groups, object ids, and the luminance histogram. Run once per splat (and again after changing group count / loading objects).

Objects tab (splat_analyzer integration)

Run nigelhartman/splat_analyzer on the source .ply/.spz (Python: pip install -r requirements.txt, then point it at the file with a prompt like "chair, table, plant"). Load the resulting interactions.json here.

  • Objects appear as a selectable list (label + splat count).
  • Selecting one highlights its splats in the scene (others dim), draws its box, and frames it in the Scene view.
  • In painterly mode, Edge Stop keeps paint from smearing across strong colour boundaries — object boxes refine this by grouping each object's splats.

Color Groups tab

K-means (Oklab colour space + optional spatial adjacency) over the splat's own colours.

  • Group Count = the adjustable minimum number of groups (2–32); Regenerate re-runs.
  • Each group shows a swatch + splat count; selecting one highlights exactly those splats in the scene so you can see the group's extent/outline.
  • The palette feeds comic dots, acrylic palette-snap, and watercolor edges.

Comic tab

  • Dot art — every splat becomes a hard dot; dot sizes randomize per colour group (Re-roll changes the pattern), colours flatten toward the group palette.
  • RGB offset — two tinted ghosts (pick both colours) offset by distance + angle.
  • Black shading — ink fills the darkest X% of the scene, where X uses the splat's own luminance histogram (run Analyze), not a blind threshold.

Painterly tab

Three presets — Oil / Watercolor / Acrylic — each sets a distinct recipe, then every parameter stays editable:

  • Watercolor: small smear, strong Edge Strength (pigment pooling at colour edges), granulation + paper wash, soft strokes.
  • Acrylic: big smear + strong Palette Snap = flat, defined colour groups.
  • Oil: long bristled strokes; assign a Stroke Texture whose alpha channel shapes each stroke (alpha preview shown in the panel).

Grading tab

Full chain: white balance → exposure → contrast → hue → saturation/vibrance → lift/gamma/gain → split toning. Applies in every mode, including Off.

One-time setup

Add Painterly Render Feature to your URP Renderer asset (Project Settings → Graphics → URP asset → Renderer → Add Renderer Feature). Without it, only splat-level styling (brush strokes / dots) shows; with it you get smear, comic post, and grading.

Notes & limits

  • The window drives ONE splat at a time (the dropdown selection = "active"); other splats render with the stock look. Post/grading follows the active splat's profile.
  • Keep URP Compatibility Mode (non-Render-Graph) — same requirement as the splat renderer itself.
  • Analysis allocates a transient GPU buffer of ~248 B/splat (2M splats ≈ 500 MB) for one frame during Analyze — fine on desktop GPUs, avoid on 500k+ mobile targets.
  • Object separation in paint is approximate (edge-stopped smear), not a hard per-object mask; a per-pixel object-ID pass is the natural next step if you need strict borders.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages