DOGMA Phase3Render 1.0.22
One masked pass per region, master image preserved
- prepared
- model
- clip
- vae
- sampler
- image
- render_report
This is the business end of the DOGMA pipeline. Everything before it - the VLM inventory, the SAM masks, the category chooser, the crop preparation - exists to produce a bundle of jobs. Phase3Render takes that bundle and loops over it: encode the crop's masked latent, sample it, decode it tiled, and composite the result back into the master image. One inference per region, each with its own prompt and denoise.
Why you would reach for this over a stock inpaint graph: it is the automation layer. The KB's description of automatic detailing is exactly the shape of this node - detect, crop, re-render, paste back - and the whole reason that category exists is that doing it by hand across dozens of regions does not scale. What this node adds over the Impact Pack's detailer nodes is the crop-and-stitch discipline: it never re-renders the whole frame to fix a small region, so sampling cost stays proportional to what actually changed.
How it works
The node receives prepared, a bundle containing the source image plus a list of jobs. Each job carries the crop image, an inpaint mask, a blend mask, the geometry metadata needed to put it back, and a denoise value. For every job that is actually renderable - it has a prompt and a denoise above zero - the node:
- Builds the sigmas for that denoise from a
BasicScheduler, cached per distinct denoise value in the run. - Encodes the positive prompt from the job and the negative prompt once, reusing it across jobs.
- Encodes a masked latent via the pack's own masked-denoise encoder, at your
vae_tile_sizeandvae_overlap. - Samples with
SamplerCustom, using a per-job seed derived from the base seed plus the job ID. - Decodes tiled, then composites with the pack's soft-stitch routine at
low_frequency_strength.
Jobs that are not renderable are reported as preserved with a reason and skipped - no encode, no sampling. If nothing is renderable at all, the node returns your input image, and it says so in the report rather than pretending it did work. The lazy inputs (model, clip, vae, sampler) are only demanded when at least one job will actually run, which is why a bypassed phase 3 does not pull a model into VRAM.
Inputs that matter
prepared (DOGMA_RENDER_JOBS) comes from a phase-3 crop/describe stage. Then the usual suspects: model, clip, vae, and sampler - note that the sampler is a SAMPLER object, so you need a sampler-select node feeding it, not a dropdown name. negative_prompt is empty by default, and for an edit-model style base that is usually correct.
steps (12) and cfg (1.0) default to a distilled-flow setup. scheduler is a standard ComfyUI scheduler list. seed (1976) is the base; each job is offset from it. vae_tile_size (1024) and vae_overlap (128) control the tiled decode - lower tile size when a big crop OOMs. low_frequency_strength (0.15) is the color-protection dial; DOGMAColorProtectionV124 exists to set it in words. save_reports writes a JSON run document into output/DOGMA_PHASE3_RENDER/.
Outputs: image and render_report (STRING), a per-job line of ID, category, status, denoise, and reason.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/axior/ComfyUI-DOGMA-Nodes
Or Manager → DOGMA Nodes, then restart. scipy>=1.10 is the pack's only pip dependency. Worth knowing before you start: the README on GitHub documents the WAN VACE and sampler nodes, not this pipeline, and the pack's own changelogs admit the phase-3 line has CPU regression tests but no GPU benchmark. Treat it as a power-user tool that you tune yourself.
Also note what the node assumes exists in your ComfyUI: it drives core nodes internally, including the pack's masked-latent and stitch classes. Keep the pack and ComfyUI up to date together - the changelog tells you to update through Manager and restart.
Where people get burned
Wrong generation of nodes. DOGMAPhase3RenderV122 expects a prepared bundle whose schema says so; the node raises "regenerate isolated target jobs" when it sees an older bundle, which is the pack being helpful.
Denoise is per-category, and it comes from the chooser, not from this node. There is no global denoise widget here on purpose. If a region looks untouched, check the report for preserved before you go looking for a sampling bug.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| prepared | DOGMA_RENDER_JOBS | — | |
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| sampler | SAMPLER | — | |
| negative_prompt | STRING | — | |
| steps | INT | 121–10000 | — |
| cfg | FLOAT | 1.00–100 | — |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| seed | INT | 19760–18446744073709550000 | — |
| vae_tile_size | INT | 1024512–4096 | — |
| vae_overlap | INT | 12864–512 | — |
| low_frequency_strength | FLOAT | 0.150–1 | — |
| save_reports | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| render_report | STRING | — |