Character Render
The All-in-One SDXL Pose Generator (and Why It's Now the Legacy Path)
- character
- pose_image
- model
- clip
- vae
- control_net
- ipadapter
- clip_vision
- image
- latent
CP_CharacterRender is a whole SDXL pipeline squeezed into one node: identity injection via IP-Adapter, pose lock via ControlNet OpenPose, a full sampler run, and a VAE decode - with the character and a pose skeleton in, a finished image out. If you want to see what this pack does end-to-end without building a single intermediate step by hand, this is the node that does it.
Fair warning up front: this is the classic path, and the README is candid that the fast path moved on. Since Flux.2 Klein and Qwen-Image-Edit arrived, the recommended flow is "Klein + CP_PoseTransferPrep" or "Qwen-Edit + ControlNet Union." Those are instruction-edit models that re-emit your sprite in a new pose, and they made the "encode identity + IP-Adapter + ControlNet + full KSampler" dance mostly obsolete. This node still works, still runs fully local on an SDXL checkpoint, and is a great way to understand the machinery - but if you're starting fresh, start with the Klein workflow instead.
How it works
It does three things in sequence. First, it applies IP-Adapter with your character's reference image and ipadapter_weight (default 0.75) to inject identity. Then it applies the ControlNet OpenPose condition from pose_image at controlnet_strength (0.85) to lock the pose. Then it runs a KSampler from an empty latent at your width/height and decodes.
The inputs that matter
- character - from
CP_CharacterEncodeorLoad Character. Its reference image drives the IP-Adapter. - pose_image - the skeleton image the pose gets locked to. From
CP_ApplyPose, a sheet node, orCP_WarpToPose. - model / clip / vae - an SDXL checkpoint loaded the normal ComfyUI way.
- control_net - required, and it must be an SDXL-architecture OpenPose ControlNet. This is a common footgun: a FLUX ControlNet here fails silently-ish, because the architecture is entirely different.
- positive / negative - plain strings, sensible sprite-oriented defaults already filled in.
- seed / steps / cfg / sampler_name / scheduler - a standard KSampler panel (steps 28, cfg 6.5 by default).
- ipadapter / clip_vision - optional; pass them and identity injection turns on. Without them the node still runs, but it's generating a pose with no idea who the character is, which defeats the purpose.
Outputs: image and latent (the pre-decode latent, if you want to do something with it).
Installing
It's part of Spit8/_ComfyUI_CharacterPose:
cd ComfyUI/custom_nodes
git clone https://github.com/Spit8/_ComfyUI_CharacterPose
pip install -r _ComfyUI_CharacterPose/requirements.txt
For IP-Adapter you also need ComfyUI_IPAdapter_plus installed - the node finds it dynamically and errors politely if it's missing. Restart ComfyUI; it lands under CharacterPose/Render.
Gotchas
- The ControlNet and the checkpoint must be the same architecture. SDXL checkpoint + SDXL OpenPose ControlNet. This trips up more people than anything else in this pack.
- IP-Adapter at 0.75 is strong - the reference wins over the prompt, which is what you want for identity. Drop it if the pose starts fighting the character.
- It's an SDXL full-render node, so it's slow compared to the ~4-step Klein path. Use it when you want the classic pipeline, not when you want speed.
Honest verdict: great node, legacy timing. If you're here to actually ship sprite sheets in 2026, the Klein path in PoseTransferPrep is where the pack wants you. Come back to this one when you want to see the old machinery up close.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| character | CHARACTER | — | |
| pose_image | IMAGE | — | |
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| control_net | CONTROL_NET | — | |
| positive | STRING | same character, full body sprite, clean lines, consistent outfit, high quality | — |
| negative | STRING | blurry, deformed hands, extra limbs, different character, watermark, text | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 281–100 | — |
| cfg | FLOAT | 6.50–30 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| width | INT | 102464–4096 | — |
| height | INT | 102464–4096 | — |
| controlnet_strength | FLOAT | 0.850–2 | — |
| ipadapter_weight | FLOAT | 0.750–2 | — |
| ipadapteropt | IPADAPTER | — | |
| clip_visionopt | CLIP_VISION | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| latent | LATENT | — |