Nodes/ComfyUI-IG2MV/Diffusers IG MV Sampler
ComfyUI Node

Diffusers IG MV Sampler

Turning position and normal maps into a consistent six-view texture

By hunzmusic·Created about a year ago·Updated about a year ago· 43
Diffusers IG MV Sampler
  • pipeline
  • position_map
  • normal_map
  • reference_image
  • IMAGE
prompthigh quality texture
negative_promptwatermark, ugly, deformed, noisy, blurry, low contrast
width768
height768
steps30
cfg3.0
reference_conditioning_scale1.0
seed0
lora_scale1.00

This is the node that actually does the work. DiffusersIGMVSampler takes the prepared pipeline from its sibling DiffusersIGMVModelMakeup, plus a batch of position maps and a batch of normal maps, and generates a multi-view image set that's consistent across all views. In practice that means: a texture for a 3D model that doesn't crawl with seams when you wrap it back around the mesh. It's the payoff step of the whole IG2MV ("image-guided to multi-view") pipeline.

If you've used ControlNet, the shape of this will feel familiar - you're conditioning a diffusion model on geometric maps. The difference is the maps aren't steering one image's composition; they're pinning the geometry of six views at once while a special attention processor makes the views agree with each other. Position maps say "where each surface point is in space," normal maps say "which way each surface faces," and the model uses both to know exactly what geometry it's painting onto.

How it works

The node (in nodes.py) is thin on ceremony, heavy on correctness:

  1. It checks the two map batches have the same number of images, then flips them from ComfyUI's BHWC layout to BCHW.
  2. It concatenates position and normal maps along the channel dimension, giving one six-channel control image per view - that's the "IG" in IG2MV, and it's why the maps must line up view-for-view.
  3. It runs the pipeline with control_conditioning_scale=1.0, num_images_per_prompt=num_views (one image per map), and the DecoupledMVRowColSelfAttnProcessor2_0 attention doing cross-view consistency. That processor is the reason for the 6-view rule: it's hardcoded for exactly six.

The output is a single IMAGE tensor - a batch of six generated views, ready for a preview node or the upscaler.

The inputs that matter

  • position_map / normal_map - the whole point. Each must be exactly 6 images, and both batches must match. The code throws a ValueError if they don't. Feed them straight from ComfyUI-Hunyuan3DWrapper.
  • width / height (default 768×768) - the maps come out of the 3D wrapper at a given size; match it. And know that 768 is low. The classic community complaint about these MV-Adapter workflows is "768x768 is so loooow resolution" - the answer is to upscale after, not to crank this past the adapter's comfort zone.
  • cfg (default 3.0) - this is SDXL-adjacent territory, and 3.0 is a sane start. Low CFG, negative prompt doing the cleanup. Don't reach for the old 7.0 muscle memory.
  • steps (default 30) - fine as-is; MV-Adapter isn't a distillation model, so it wants real steps.
  • reference_conditioning_scale (default 1.0) - only matters if you plug in a reference_image (optional). That image feeds a reference cross-attention path in the processor, the same "keep this identity/style" idea you know from IP-Adapter and Reference ControlNet. 0.0 turns it off.
  • lora_scale (optional, default 1.0) - applies to LoRAs you loaded via ComfyUI-MVAdapter's LoraModelLoader. Leave at 1.0 unless you loaded one.
  • seed - standard; the generator is manual-seeded on your device, so you can actually reproduce runs.

Installing it

Same pack as the makeup node - ComfyUI Manager (search "ComfyUI-IG2MV") or:

cd ComfyUI/custom_nodes
git clone https://github.com/hunzmusic/ComfyUI-IG2MV

Restart, and make sure ComfyUI-MVAdapter (the pipeline) and ComfyUI-Hunyuan3DWrapper (the maps) are installed - the pack ships no requirements.txt of its own, so its Python deps (diffusers, einops, PyTorch 2.0+) come from the parent pack.

Gotchas

The 6-view limit is the one that bites everyone: the README calls it out explicitly, the attention processor is built for it, and any other count errors out or produces garbage. And if you're new to the whole 3D-texture rabbit hole, budget for the resolution ladder - generate at 768, upscale to 2–4K, and let the maps do the geometric heavy lifting rather than fighting for more pixels at the source.

CategoryMV-Adapter/IG2MV

Inputs (13)

NameTypeDefaultDescription
pipelinePIPELINE
position_mapIMAGE
normal_mapIMAGE
promptSTRINGhigh quality texture
negative_promptSTRINGwatermark, ugly, deformed, noisy, blurry, low contrast
widthINT7681–2048
heightINT7681–2048
stepsINT301–2000
cfgFLOAT3.00–100
reference_conditioning_scaleFLOAT1.00–2
seedINT00–18446744073709550000
reference_imageoptIMAGE
lora_scaleoptFLOAT1.00-10–10

Outputs (1)

NameTypeDescription
IMAGEIMAGE