VNCCS Factory Render
RGB, depth, normals, and per-object IDs
- scene
- rgb
- depth
- normal
- alpha
- object_id
- camera_metadata
- capture
Here's the situation VNCCS Factory Render exists for: you've spent an evening inside the VNCCS 3D Factory widget - arranging gaussian objects, dropping walls, saving cameras - and you have a real, persistent 3D scene. Then you look at your graph and realize nothing in it can see any of that. The scene is trapped inside the widget, and unless you want to screenshot the viewport like it's 1999, you need a bridge.
Factory Render is that bridge - a VNCCS/3D node that turns whatever the 3D Factory scene currently looks like into plain ComfyUI data: RGB, depth, normals, alpha, and a per-object ID map, all ready to wire into whatever comes next. Same author (AHEKOT) as the VNCCS character-sprite suite, so expect the same polish and the same "this is a big pack, install it whole" situation.
What comes out of it
The node takes a VNCCS_FACTORY_SCENE - the second output socket on the VNCCS 3D Factory node - and hands you seven outputs. Six of them are lists, not single images, in the same order: current view first, then each saved scene camera. Save eight cameras and you get eight RGBs, eight depths, eight of everything, in lockstep.
- rgb (
IMAGE) - what the scene looks like from each camera. - depth (
IMAGE) - a preview map. It's inverse-linear, near-white close up, black atdepth_max, which reads more intuitively than raw depth. The actual metric depth in meters is kept separately in Float32, so the preview isn't destroying data. - normal (
IMAGE) - view-space normals. The pass excludes normal maps from materials, so it's the geometry's real surface direction. - alpha (
MASK) - binary foreground coverage. Sky and true background sit at 0; geometry is 1. - object_id (
IMAGE) - the sleeper hit. Every entity (object, wall, room, opening) is rendered with a unique 24-bit ID packed into its RGB color. One render, and you know exactly which pixel belongs to which thing. - camera_metadata (
STRING) - JSON per camera, including theentity_idsmap you'll need later. - capture (
VNCCS_FACTORY_CAPTURE) - a single reusable handle to the whole capture, which is what Factory Mask eats.
The inputs that actually matter
Set the resolution and go. But two choices deserve attention.
profile is the one that'll bite you. Gaussian splat objects have no renderable surface, so for scenes containing them you must explicitly pick "Coarse boxes for Gaussian objects" - the depth, normal, and ID passes then describe approximate bounding boxes, not the splats themselves. The tooltip is blunt: "Gaussian splats require explicit coarse box approval." Pick "Mesh geometry" for imported meshes, architecture, and primitives. RGB always shows the real splats; the boxes only affect the conditioning passes.
depth_min / depth_max (meters) only remap the grayscale depth preview - white at depth_min, black at depth_max. Raw metric depth is stored independently, so feel free to adjust for a readable preview without worrying about corrupting the data. Width/height run 64–2048 per axis, and a request is capped at 32 megapixels across all views.
How a capture actually happens
Hit execute and Factory Render creates a capture job, then sends a request to the 3D Factory node that owns the scene. Fresh captures need that Factory widget open in 3D view on screen - no widget, and you get the "Render host required" error and a five-minute timeout. Editing the scene mid-capture fails cleanly rather than half-writing a capture. The useful corollary: an exact cached capture (same settings, same camera, unchanged scene) replays without a live widget at all, which keeps batch re-runs honest.
Installing it
Factory Render ships in the ComfyUI_VNCCS_Utils pack. Easiest route is ComfyUI Manager → Custom Nodes Manager → search "VNCCS Utils" → Install, then restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/AHEKOT/ComfyUI_VNCCS_Utils.git
cd ComfyUI_VNCCS_Utils
pip install -r requirements.txt
Note the requirements.txt is heavy - av, kornia, transformers, pytorch-lightning, opencv, roma and friends - because the pack bundles several full workspaces (Pose Studio, UniCanvas, 3D Factory). You can't install this one node; it's inseparable from the pack, and it's useless without the VNCCS 3D Factory scene to feed it. It needs no model weights of its own - the TripoSplat weights the README mentions are for generating gaussian objects, not rendering captures.
Common snags
- "Render host required: execute 3D Factory with its widget open in 3D view" - close any fullscreen previews and re-run with the Factory node visible in 3D view.
- Depth looks wrong - check
profilefirst; coarse boxes are approximations by design. Then checkdepth_min/depth_max; a scene at 2 meters deep mapped againstdepth_max: 100looks almost uniformly white. - Lists where you wanted one image - every visual output is a list, one per camera. Use list-aware consumers or index the shot you want.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| scene | VNCCS_FACTORY_SCENE | — | |
| profile | COMBO | Gaussian splats require explicit coarse box approval. Boxes are approximate conditioning geometry. | |
| width | INT | 102464–2048 | — |
| height | INT | 102464–2048 | — |
| depth_min | FLOAT | 0.100–1000000 | Meters; white in the depth preview. |
| depth_max | FLOAT | 100.000.001–1000000 | Meters; black in the preview. Raw metric depth is retained independently. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| rgb | IMAGE | — |
| depth | IMAGE | — |
| normal | IMAGE | — |
| alpha | MASK | — |
| object_id | IMAGE | — |
| camera_metadata | STRING | — |
| capture | VNCCS_FACTORY_CAPTURE | — |