SHARP Predict (Image to PLY)
Turn one photo into a 3D Gaussian point cloud
- model
- image
- extrinsics
- intrinsics
- ply_path
- extrinsics
- intrinsics
- layer_0_refined_depth
- layer_1_refined_depth
This is the node people actually mean when they say "run SHARP." One photo goes in, a .ply file of 3D Gaussians comes out - a point cloud you can rotate and view from angles the original camera never saw. It's Apple's SHARP model (arXiv 2512.10685) doing monocular 3D Gaussian Splatting, and the whole pitch is speed: the paper claims under a second of pure inference, and real end-to-end runs people posted (image load, encode, decode, save) landed around 3.5–4 seconds on an M-series Mac. This node is an output node - it writes a file to disk, the same role Save Image plays for a normal generation graph.
If you've come from image-generation nodes, this is a genuinely different category: nothing here diffuses pixels. It reconstructs geometry from a single 2D photo, the same job depth estimation does for ControlNet, just taken all the way to a full 3D representation instead of a flat grayscale map.
How it works
SHARP predicts two depth layers per pixel rather than one: a "layer 0" for the visible front surface, and a hallucinated "layer 1" for what's plausibly behind it. That second layer is why the result looks like an actual scene with volume instead of a flat cardboard cutout warped into 3D - when you rotate the view slightly, there's something there to reveal instead of a black hole. Each depth value gets decoded into a full Gaussian (position, scale, rotation, color, opacity), and both layers get written into the output PLY together.
The inputs and outputs that matter
- model (required) - from
LoadSharpModel. - image (required) - your photo.
- focal_length_mm (default 30, 0 = auto/30mm) - how wide the lens was. Get this from
LoadImageWithExifif you have real photo metadata; guess conservatively otherwise. Ignored the momentintrinsicsis wired in. - extrinsics / intrinsics (optional) - real camera matrices, typically from
SamplePanoramawhen you're inside a multi-view or panorama pipeline rather than a single standalone photo. - output_prefix (default
sharp) - filename or batch-folder prefix.
Outputs: ply_path (the file itself - this is what you feed a viewer or MergeGaussians), extrinsics/intrinsics (passed straight through for chaining), and layer_0_refined_depth / layer_1_refined_depth - the two depth layers as viewable images, handy for a quick Preview Image sanity check before you bother opening a point-cloud viewer.
Installing it
Manager: search "Sharp," install the highest version listed (try nightly if it misbehaves). Or Manager → Install via Git URL: https://github.com/PozzettiAndrea/ComfyUI-Sharp.git. Manual: clone into custom_nodes, pip install -r requirements.txt --upgrade, python install.py, restart. The model weights auto-download on first run.
One thing the README doesn't lead with but you'll need immediately: viewing the result inside ComfyUI requires a separate pack, ComfyUI-GeometryPack (same author). This node only writes the file - the PreviewGaussian node that actually renders it lives in that other repo. Enough people hit "missing node" on release day that the author added the link to the README afterward, but it's easy to miss if you installed via Manager and skipped straight to the graph.
Common issues
"Missing GeomPackPreviewGaussian node" - you need ComfyUI-GeometryPack installed alongside this pack; it's not bundled.
Blank or textureless-white point cloud in the preview - a real, reported issue specifically on Apple Silicon/MPS. The .ply file itself is often completely fine even when the in-graph viewer shows nothing useful. Drag it into superspl.at/editor - a free browser-based Gaussian Splat viewer the community landed on partly because ComfyUI's own preview also can't save screenshots.
OOM, or the server just hangs with no error - reported on 8GB VRAM cards. If your run stalls silently rather than crashing loudly, that's consistent with running out of headroom rather than a broken install.
Warped-looking geometry - almost always a wrong focal_length_mm. Use LoadImageWithExif when you have a real photo, and remember it silently falls back to a default if EXIF was stripped (screenshots, most re-saved/downloaded images) - check the actual value flowing in before blaming the model.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | SHARP_MODEL_CONFIG | — | |
| image | IMAGE | — | |
| focal_length_mmopt | FLOAT | 30.00–500 | Focal length in mm (35mm equivalent). 0 = auto (defaults to 30mm). Ignored if intrinsics provided. |
| output_prefixopt | STRING | sharp | Prefix for output PLY filename or folder name for batches. |
| extrinsicsopt | EXTRINSICS | Camera extrinsics (from SamplePanorama). If batched, must match image batch size. | |
| intrinsicsopt | INTRINSICS | Camera intrinsics (from SamplePanorama). Overrides focal_length_mm if provided. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| ply_path | STRING | — |
| extrinsics | EXTRINSICS | — |
| intrinsics | INTRINSICS | — |
| layer_0_refined_depth | IMAGE | — |
| layer_1_refined_depth | IMAGE | — |