Render NLF Poses
Turn a 3D pose prediction into an actual image
- nlf_poses
- dw_poses
- ref_dw_pose
- image
- mask
3D pose data is invisible until something draws it. RenderNLFPoses is that something - it takes the pose prediction out of NLFPredictPoses and turns it into an actual IMAGE and MASK you can look at, sanity-check, or wire straight into a pose-conditioned generation. It's the node that makes kijai's ComfyUI-SCAIL-Pose pipeline useful for anything beyond raw numbers: extract a pose in 3D with NLF, render it back down to 2D, feed that into your workflow (the "SCAIL pose control" example in ComfyUI-WanVideoWrapper does exactly this).
How it works
This isn't a simple stick-figure line drawer - it's a real renderer, built on Taichi, a Python framework for parallel/GPU compute, with a plain PyTorch fallback if Taichi isn't set up. You give it a canvas size and it projects the pose data onto it. The genuinely interesting part is the alignment machinery: you can optionally hand it dw_poses and ref_dw_pose, DWPose-format keypoints from this same pack's converter nodes, to align the NLF-based render against a 2D reference. That's a direct callback to the pack's own README: it swaps DWPose's face/hand detector for ViTPose but still outputs DWPose-format keypoints "for the optional alignment" - this is where that alignment actually happens.
The inputs and outputs that matter
nlf_poses(required,NLFPRED) - your pose prediction fromNLFPredictPoses. The tooltip is short and to the point: "Input poses for the model".width/height(required, default 512 each) - the output canvas size.dw_poses/ref_dw_pose(optional,DWPOSES) - the tooltips explain the split: "Optional DW pose model for 2D drawing" and "Optional reference DW pose model for alignment" respectively. Feed these fromPoseDetectionVitPoseToDWPoseorConvertOpenPoseKeypointsToDWPoseif you want the render calibrated against a known 2D skeleton.draw_face/draw_hands(default true, true) - straightforward toggles for whether face and hand keypoints get drawn.scale_hands(default true) - "Whether to scale hand keypoints when aligning DW poses", so it only matters if you're actually using the alignment inputs above.render_device(defaultgpu, choicesgpu/cpu/opengl/cuda/vulkan/metal) - the tooltip is explicit that this is "Taichi device to use for rendering." These are Taichi backend targets, not a generic GPU-vendor picker, so match it to your actual hardware and OS rather than assumingcudais always right.render_backend(defaulttaichi, choicestaichi/torch) - which rendering engine runs the draw.- Outputs:
imageandmask- the rendered pose and its alpha, ready to feed into a conditioning branch or just to look at.
How to install it
Via ComfyUI Manager: search ComfyUI-SCAIL-Pose, install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/kijai/ComfyUI-SCAIL-Pose, then pip install -r ComfyUI-SCAIL-Pose/requirements.txt, restart. This node is the one that actually exercises the taichi>=1.7.4 dependency in that requirements file - the loader and predictor don't touch it, but this one does the real GPU rendering work.
Common issues & troubleshooting
Taichi fails to install or init. Taichi is a less common dependency than a typical pip package and can be pickier about matching your GPU driver setup than opencv-python or pillow ever will be. If it won't build or errors on startup, switch render_backend to torch - the node ships that fallback specifically for this case, so you don't need to fight Taichi's build to get a usable render.
The render comes out blank. Check upstream first: if NLFPredictPoses didn't find anyone in the frame (usually a detector_threshold set too high), there's nothing here for RenderNLFPoses to draw - this node can't invent a pose that wasn't detected.
Face or hands are missing from the output. Confirm draw_face/draw_hands are actually on. If they are and the render still looks incomplete, that traces back to a weak detection upstream - complex or occluded poses are a known soft spot for the NLF detector, per the SCAIL developer's own advice to segment the subject before extraction.
render_device set to cuda does nothing on a non-Nvidia box. Remember these choices pick a Taichi backend, not "your GPU" in the abstract - metal on a Mac, vulkan as the cross-platform option, or just leave it on gpu and let Taichi figure out the right backend itself.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| nlf_poses | NLFPRED | Input poses for the model | |
| width | INT | 512 | — |
| height | INT | 512 | — |
| dw_posesopt | DWPOSES | Optional DW pose model for 2D drawing | |
| ref_dw_poseopt | DWPOSES | Optional reference DW pose model for alignment | |
| draw_faceopt | BOOLEAN | true | Whether to draw face keypoints |
| draw_handsopt | BOOLEAN | true | Whether to draw hand keypoints |
| render_deviceopt | COMBO | gpu | Taichi device to use for rendering |
| scale_handsopt | BOOLEAN | true | Whether to scale hand keypoints when aligning DW poses |
| render_backendopt | COMBO | taichi | Rendering backend to use |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |