This live walkthrough is new. Please report bugs or issues to max1@mit.edu.

VisiPrint: Previewing 3D-Print Appearance from Real Material Samples

ACM CHI Conference on Human Factors in Computing Systems (CHI) 2026

Maxine Perroni-Scharf · Faraz Faruqi · SooYeon Ahn · Raul Eduardo Hernandez · Szymon Rusinkiewicz · William Freeman · Stefanie Mueller

MIT CSAIL · Princeton University · Gwangju Institute of Science and Technology

Live demo · the full VisiPrint interface, running the released pipeline on a GPU Full screen · Open on Hugging Face ↗
Pick an example and a filament, or upload your own slicer screenshot and filament photo, then press Generate. If the demo reports that the free GPU allowance is used up, open it on Hugging Face while signed in.

The paper, step by step. Below, the live figures run VisiPrint's released Python in your browser, with the code under each figure.

  1. Adaptive Canny edges · not run yet
  2. Colour correction · not run yet
Object Filament
Slicer screenshotSlicer screenshot
VisiPrint previewVisiPrint preview
Photo of the real printReal print (photo)
From a slicer screenshot to a preview of the print. Pick an object and a filament. The middle column is VisiPrint's output, generated by the released pipeline on a GPU from the screenshot on the left and a photo of a small sample printed in that filament. The right column is a photo of the object actually printed in that filament, aligned to the preview's framing (photographed separately, so the viewpoint differs a little).

Abstract. Slicers show you how a printer will move, not what the result will look like: every part is drawn in the same flat yellow, whatever filament you load. Given a screenshot of your sliced model from any slicer and a photo of the filament you plan to use, VisiPrint produces a preview of the print that keeps the slicing pattern (layer lines, seams, infill showing through) while taking on the colour, gloss, translucency and texture of the real material. In a user study, participants completed every preview task with VisiPrint within the time limit, compared with 63% using Cura and 13% using Blender.

The sections below go through each stage of VisiPrint. See the paper for the full method and evaluation. Figures marked live run the released code in your browser; the diffusion outputs were generated with the released code on a GPU at its default settings (30 steps, depth ControlNet weight 0.8). The experiments in the paper (Section 4.8) used 70 steps, ControlNet weights of 0.9 and a contrast weight of 0.5.
  1. Why slicer previews mislead
  2. Two images in, one preview out
  3. Keeping the geometry: depth and adaptive edges
  4. Painting the material in: diffusion with an image prompt
  5. Getting the colour right
  6. Optional: teaching SDXL what prints look like
  7. Does it help people?
  8. Try it

1Why slicer previews mislead

Before a print, the only picture most people see is the slicer's. It shows the toolpaths accurately, but its colours are only a display convention. Real filaments differ in ways that change how a part reads: a metallic filament catches highlights on every layer line, a translucent one lets the inside of the part show through, a dark matte one hides small features. Today these differences only become visible once the part is printed.

Physically based rendering could in principle predict this, but it needs a 3D model of the material (a BRDF or a volumetric scattering model), careful lighting, and it does not reproduce the slicing pattern unless you also reconstruct every toolpath. VisiPrint takes a different route: treat the preview as an image-to-image problem, with the slicer screenshot carrying the geometry and slicing pattern and a photo carrying the material.

Drag to compare
Slicer screenshot of the Benchy boat
VisiPrint preview in silver PLA
⇆
Slicer (Cura)VisiPrint, silver PLA
Slicer view and preview. The slicer view and VisiPrint's preview for silver PLA share every layer line, the brim and the hollow cabin; only the appearance differs.

2Two images in, one preview out

The inputs are deliberately simple so that VisiPrint works with any slicer: a screenshot of the sliced model, which fixes the shape, the viewpoint and the slicing pattern, and a material exemplar, a photo of something printed in the filament you want (a small sphere works well). The pipeline then prepares three kinds of guidance from the screenshot before any image is generated. Step through them below.

Object
Pipeline stageSlicer screenshot
Preparing the guidance. Intermediate images produced by the released pipeline for the example screenshots.

3Keeping the geometry: depth and adaptive edges

Without guidance, a diffusion model changes the shape of the object along with its material. VisiPrint therefore conditions generation on two complementary signals through ControlNets. Depth carries the overall form, and on its own it produces smooth objects that have lost their layer lines. Edges carry what makes a print look printed: the stack of layers, the seam, vents and holes. VisiPrint uses both.

The difficulty with edges is choosing the threshold. Slicer screenshots vary a lot: a dark or low-contrast view gives weak gradients, while dense details and infill give too many. A fixed Canny threshold either loses the layer lines or drowns the image in noise. VisiPrint instead searches for a threshold. It measures gradient magnitudes inside the object, then bisects over percentiles of that distribution until the fraction of edge pixels inside the mask falls in a target band (12 to 25% by default).Outside the mask the image is filled with the median grey of the object first, so the silhouette itself does not count as a slicing edge.

Live · runs in your browser
Input (decoloured)
Adaptive edges
Adaptive Canny, live. The figure runs get_adaptive_canny_edges() from the public release (Gaussian blur σ = 0.8, Sobel gradients, Canny with L2 gradients and a low/high ratio of 0.25, removal of specks smaller than 3 pixels, up to 8 bisection steps) on a 512 px copy of the screenshot.1 Switch between one fixed threshold (200 on a 0–255 scale, which suits the boat) and VisiPrint's adaptive search: with the fixed value the darker octopus loses most of its slicing detail, while the search picks a threshold for each screenshot. The Python under the figure is what runs: edit the call or the function and press Run. Until Python has loaded in your browser (about 21 MB, once), a JavaScript copy of the same steps draws the figure.

4Painting the material in: diffusion with an image prompt

With the guidance ready, VisiPrint repaints the decoloured object using Stable Diffusion XL in inpainting mode, so only the masked object changes and the build plate stays as it was in the screenshot. Two things steer the result. The material exemplar enters through an IP-Adapter: an image encoder turns the photo into tokens that the diffusion model attends to alongside the text prompt, so "what the material looks like" is specified by a picture rather than words. The depth and edge maps enter through two ControlNets, which constrain the layout at every denoising step. This material-transfer setup builds on ZeST2, adding the slicing (edge) guidance and the steps around it.

The text prompt is kept minimal on purpose: an image captioner (BLIP) names the object and the prompt becomes "A 3D printed noun".The captions are often generic (the boat becomes "model", the whistle "object"); the image prompt and the ControlNets determine the result, so the previews are unaffected. Users can override it, but strong prompts trade away faithfulness to the slicer image, so the interface warns about this and exposes the prompt's weight against the image prompt.

For printed parts, the most important control is Slicing Influence, the weight on the edge ControlNet. Too low and the layer lines melt into a smooth, moulded-looking object; too high and the edges dominate the material.

Slicing influence
Whistle previewSlicing influence 0.8
Edge map used as guidanceEdge guidance
Live 0.60
Trading material for slicing detail. The silver whistle generated at four edge weights (depth weight fixed at 0.8, 30 steps, seed 42). Pick any other value and press the button to run the real pipeline through the live demo's GPU; it takes about 10 to 20 seconds.

5Getting the colour right

Diffusion models are good at texture and gloss but loose with exact colour: the generated pink is often a little too light or too saturated. VisiPrint finishes with a statistical colour transfer inside the object mask. For each RGB channel it matches the mean of the generated object to the mean of the exemplar, and moves the spread of values part of the way toward the exemplar's:

c′ = (c − μgen) · [1 + (σex/σgen − 1) · wlum] + μex,    out = (1 − wcol) · c + wcol · c′

The two weights are the interface's Color Influence (wcol, default 0.8) and Luminance Influence (wlum, default 0.6). Try them on a real, uncorrected output:

Live · runs in your browser
Color influence0.80
Luminance influence0.60
Pink exemplarExemplar
Raw diffusion outputBefore correction
After correction
Colour correction, live. The middle image is the diffusion output before correction (generated with Color Influence 0). The right image is match_color_profile() from the public release, run in your browser with your settings; the Python is under the figure.3

6Optional: teaching SDXL what prints look like

Prompted with "a 3D printed cup", SDXL alone produces a glossy product render. VisiPrint optionally applies a small LoRA fine-tune trained on 100 Creative Commons photos of real 3D prints, which pulls the model toward the look of actual FDM parts: visible layers, filament sheen, imperfect surfaces. It is switched off by default and exposed as Use Fine-Tuned Model in the interface.

SDXL outputs for 'A 3D printed cup' before and after fine-tuning
Before and after fine-tuning (paper, Figure 11): SDXL alone versus with the LoRA, prompted with "A 3D printed cup".

7Does it help people?

We compared VisiPrint with the two things people do today: inspecting the slicer preview (Cura) and building a render (Blender). Participants were asked to produce previews of how prints would look within a time limit.

Preview tasks completed within the time limit
VisiPrint
100%
Cura
63%
Blender
13%
User study. Participants also rated VisiPrint as significantly faster, easier to use and more faithful than both alternatives; the paper reports the workload (NASA-TLX) results and a perception study comparing previews with real prints.

Limitations. VisiPrint predicts appearance, not printability, strength or tolerances, and a preview assumes lighting similar to that of the exemplar photo. Translucent filaments remain the hardest case.

8Try it

The full interface from the paper is at the top of this page. Pick an example and a material, or upload your own slicer screenshot and filament photo; each preview takes about 10 to 20 seconds on the GPU.

·Citation

@inproceedings{PerroniScharf2026VisiPrint,
  author    = {Maxine Perroni-Scharf and Faraz Faruqi and SooYeon Ahn and Raul Eduardo Hernandez and Szymon Rusinkiewicz and William Freeman and Stefanie Mueller},
  title     = {VisiPrint: Previewing 3D-Print Appearance from Real Material Samples},
  booktitle = {Proceedings of the 2026 CHI Conference on Human Factors in Computing Systems (CHI '26)},
  year      = {2026},
  address   = {Barcelona, Spain},
  publisher = {ACM},
  doi       = {10.1145/3772318.3790851}
}