Nodes/ComfyUI-BCNodes/Skin Texture
ComfyUI Node

Skin Texture

Skin Texture — Pores, Because 'Glossy Skin' Is Still the Number One AI Tell

By 0xBeycan·Created 23 days ago·Updated 3 days ago· 2
Skin Texture
  • image
  • mask
  • exclude_mask
  • image
  • skin_mask
◄sam3_modelsam3.1_multiplex_fp16.safetensors►
◄texture0.35►
◄detail0.45►
◄pore_scale1.00►
◄feather8►
◄seed0►
◄threshold0.50►

The tell that outlived four model generations

Ask anyone how they spot an AI portrait and the first answer is skin: too smooth, no pores, no micro-wrinkles, that beauty-filter sheen. The KB has been watching this list stay unchanged since 2023 - the models got dramatically better at hands and text, and the plastic face is still the thing people complain about. Grain on top of smooth skin reads as noise over plastic, which is why a texture pass belongs under the grain, not instead of it.

This node does that one job. Inside a skin mask it boosts the fine detail the model actually rendered, then multiplies a synthetic pore field on top, both in linear light and both as ratios - so colour and brightness don't move, only the surface.

How it works

Two operations, applied only where the mask says skin:

  • detail - a 2 px high-pass on luminance (scaled with the image, so it means the same thing at 1024 px as at 4K), which pulls the fine structure that's already there out of the flat. It's a ratio, so it can't shift your exposure.
  • texture - two band-passed noise octaves at pore scale plus sparse darker pits, unit variance, where 1.0 is roughly ±6% luminance modulation. pore_scale sizes the pores: 1 is about one pixel at a 1024 px long edge, scaled with the image.

Highlights get 30% of the effect and pure black gets none, which is what stops the pores reading as a film of grit on a bright face.

Then the mask. By default that's SAM 3: sam3_model is a checkpoint under models/checkpoints and the default, sam3.1_multiplex_fp16.safetensors, is fetched from Comfy-Org's repo on first use - not at import, so a missing model doesn't break the pack at startup. The detection is prompted with skin minus eyes, eyebrows, lips, teeth, and a face detection sets how strong the effect lands: full when the face spans about a third of the frame height, fading as it shrinks, because pore-scale detail has nowhere to live on a small face.

You can skip all of that by wiring mask - a body mask from your own SAM 3 prompts works fine. exclude_mask is subtracted either way, and feather softens the mask edge. threshold is the SAM 3 detection threshold and does nothing when you supply the mask yourself.

Two outputs: image, and skin_mask, which is the mask it actually used. That second one is more useful than it looks - it's how you find out whether SAM 3 agreed with you about where the skin was.

Where it belongs in the pipeline

Order matters, and the author's own advice is the one I'd follow: Skin Texture → upscale → grain last. Texture before upscaling so the upscaler sharpens real structure instead of enlarging a pore field into craters; grain last because grain over texture is what looks photographed, and texture over grain is what looks retouched.

Keep the clean image too. Texture and grain are for the published still; anything heading into I2V starts from the least-noisy version you have.

Install

Manager: search ComfyUI-BCNodes, install, restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/0xBeycan/ComfyUI-BCNodes

No pip install needed for this node specifically - the pack's requirements.txt covers only PostFx and Caption Audit. The SAM 3 checkpoint downloads itself into ComfyUI/models/checkpoints/ on the node's first run, so budget a minute and a few GB for the first execution, not for the install.

Where people get burned

The model dropdown shares the checkpoints folder. sam3_model lists everything in models/checkpoints, which is where your SDXL and Flux checkpoints live too. The default SAM 3 file is always offered, so you can't get stuck - but picking your favourite anime checkpoint in that dropdown will not do what you hoped.

You need a face of a certain size. If the subject fills a tenth of the frame, the face-based strength falloff drops the effect to nearly nothing, and it will look like the node did nothing. That's deliberate, not broken - either crop in, or supply your own mask and take control.

Turn texture to zero before you turn detail up. detail amplifies what's there, and on an image with compression artifacts or an aggressive denoise pass it amplifies those too. Diagnose them one at a time: texture off, detail at 0.5, then bring the pores back in.

It is not a skin-smoothing node. It adds. If your problem is blotchy skin you want a bilateral or guided filter, or a generative detail pass - different tool, different job.

CategoryBCNodes/image

Inputs (10)

NameTypeDefaultDescription
imageIMAGE—
sam3_modelCOMBOsam3.1_multiplex_fp16.safetensorsSAM 3 checkpoint under models/checkpoints; the default is downloaded when missing. Unused when a mask is connected.
textureFLOAT0.350–1Synthetic pore field strength. 0 = off; 1 = ±6% luminance modulation.
detailFLOAT0.450–2Gain on the image's own fine detail inside the mask (0 = off).
pore_scaleFLOAT1.000.5–4Pore size multiplier. 1 = ~1 px pores at a 1024 px long edge, scaled with the image.
featherINT80–64Mask edge softness in px (at a 1024 px long edge).
seedINT00–18446744073709550000—
thresholdFLOAT0.500–1SAM 3 detection threshold.
maskoptMASKWhere to texture. Connected, it replaces the SAM 3 skin detection.
exclude_maskoptMASKSubtracted from the skin mask (added to the eyes / lips exclusion).

Outputs (2)

NameTypeDescription
imageIMAGE—
skin_maskMASK—