Tech15 min read

Comparing SnapRef v2a with v1b Using a Single Character Reference on M1 Max

IkesanContents

SnapRef is a reference weight and ComfyUI node package for Anima that extracts character visual features from a single reference image and injects them during generation steps.
About a week after publishing my previous article testing SnapRef v1b on M1 Max, the next release, v2a, arrived.
According to its README, quantitative benchmark numbers for v2a remain roughly on par with v1a, but visual alignment with references improved noticeably.
The repository comparison table only lists v1a and v2a, leaving out direct numbers against v1b.

In my previous test of v1b, using Kana’s full-body standing pose turned Base’s running scene into a rear view across all five seeds.
When providing multiple references, the upper-body blazer consistently won out, and on Apple Silicon (MPS), certain reference dimensions yielded completely black images.
I tested v2a with the exact same reference images, prompts, and seeds to see what changed.

Overview of SnapRef v2a

ItemDetails
Author0ppxnhximxr on Hugging Face, ArcAnima on GitHub
ReleasedNovember 8, 2026
Weight Filesnapref_v2a.safetensors (381,821,960 bytes)
Base ModelAnima base v1.0
LicenseCircleStone Labs Non-Commercial License v1.2
DownloadHugging Face (v2a), GitHub

The file size is virtually identical to v1a’s 381,822,008 bytes (about 382 MB).
The underlying mechanism is unchanged: the reference image passes through the model once, caching key/value pairs across each block’s attention mechanism to feed into every step during generation.
See my previous article on v1b for architecture details.

The comparison table in the README reflects a fixed benchmark of 64 cases across 2 seeds. SigLIP and DINO evaluate visual feature similarity, while CCIP measures character identity consistency.

Metricv1av2a
Visual tag recall (higher is better)0.87220.8727
Redundant visual tags (lower is better)0.13410.1401
Head SigLIP similarity (higher is better)0.89890.8903
Head DINO similarity (higher is better)0.74310.7407
Head CCIP distance (lower is better)0.06840.0715
Full-image CCIP distance (lower is better)0.07250.0757

Quantitatively, v2a only leads in visual tag recall, and only by a tiny margin.
However, the README notes that visual inspection shows significantly better reference following.
New sample workflows highlight using mode char to alter art styles via prompts and supplying multiple reference images with customized weights.

Recommended settings from the README are as follows:

SettingValue
Samplereuler / simple
cfg4.5
fidelity1.0
Workflow832×1216, 28 steps, seed 20261029

Node Changes

v2a includes updated custom node code for ComfyUI.
Diffing it against the node script used with v1b reveals two main changes:

ChangeDetails
Automatic 2.9B supportAutomatically reassigns 28 blocks of weights to the 28 native blocks among Anima-2.9B’s 40 blocks, avoiding the 12 inserted blocks (indices 2, 5, 8, …, 36)
Cache keyingIdentifies reference caches with dedicated IDs rather than Python’s id(model). Comments note this avoids collisions when reloaded models reuse object IDs

When testing v1b, I wrote a custom script to reassign weight tensor keys for 2.9B.
With v2a’s node, that step is no longer required.

However, the .double() call in the APG correction that crashes on MPS, along with the -inf mask handling behind black output, remain unmodified.

Test Environment

Anima Base (anima-base-v1.0) is the standard full model running at around 30 steps, while Turbo (anima-turbo-v1.1) is a lightweight distilled model running at 8 steps. I tested SnapRef across both.

ItemDetails
HardwareMacBook Pro M1 Max 64GB (MPS)
UIComfyUI v0.33.3 (--bf16-vae --bf16-unet)
SnapRefNode and weights from Hugging Face commit 2ca5eca (sha256 verified)
Reference ImageFull-body standing illustration of Kana (832×1216); added upper-body crop for multi-reference tests
Output Resolution896×1152 (matching v1b tests); 832×1216 for official settings section
Baseanima-base-v1.0, 30 steps, cfg 4.5, euler / simple
Turboanima-turbo-v1.1, 8 steps, cfg 1.0, euler / simple
Seeds20261027 (expanded to 20261028–20261031 for seed comparisons)
v1b OutputsSourced from previous article data

As in the previous test, I changed two lines of .double() in the APG correction to .float().
All other custom node code remained as distributed.

I also verified whether the updated node altered v1b outputs.
Running v1b under the new node produced pixel-identical outputs for Turbo’s running scene (seed 20261027) and Base’s running scene (seed 20261030) compared to previous records.
Any differences observed between v1b and v2a stem from model weight changes, not node logic.

Running Default Official Settings

Matching the v1b article, I ran Base using the README prompt, workflow negative prompt, 832×1216 resolution, 28 steps, and cfg 4.5.

VersionTimeResult
v2a280.7sSitting crossed-legged on a bench with cheek on hand, smiling under night streetlamps. Ahoge, scrunchie side-ponytail, white shirt, red necktie, black tights, and loafers intact
v1b (previous)289.9sNearly identical composition, neutral facial expression
v2a
SnapRef v2a using README prompt with Kana sitting on a bench
v1b (previous)
SnapRef v1b using README prompt with Kana sitting on a bench
Prompt
masterpiece, best quality, score_7, safe, 1girl, solo, full body, sitting, crossed legs, bench, street, night

Negative:

worst quality, low quality, score_1, score_2, score_3, artist name, blurry, jpeg artifacts, chromatic aberration

Base Running Pose

In my previous v1b tests, Base’s running scene stood out most.
v1b yielded a rear view across all five seeds, which matched unreferenced Base outputs and suggested a baseline bias in the model for that prompt.
I generated the same five seeds with v2a.

Seedv2av1b (previous)Unreferenced (previous)
20261027Front viewRear view—
20261028Front view, smaller subjectRear view, smaller subject—
20261029Front viewRear view—
20261030Front viewRear viewRear view
20261031Oblique rear view, turning back with open mouthRear viewRear view
v2a s20261027
SnapRef v2a applied to Base running scene, seed 20261027, front view
v2a s20261028
SnapRef v2a applied to Base running scene, seed 20261028, front view with smaller subject
v2a s20261029
SnapRef v2a applied to Base running scene, seed 20261029, front view
v2a s20261030
SnapRef v2a applied to Base running scene, seed 20261030, front view
v2a s20261031
SnapRef v2a applied to Base running scene, seed 20261031, looking back
v1b s20261027 (previous)
SnapRef v1b applied to Base running scene, seed 20261027, rear view
v1b s20261030 (previous)
SnapRef v1b applied to Base running scene, seed 20261030, rear view
Unreferenced s20261030 (previous)
Unreferenced Base running scene, seed 20261030, rear view

v2a produced front views on 4 out of 5 seeds, with the remaining seed facing the viewer while turning back.
Across all five outputs, the side-ponytail, white shirt, red necktie, and black tights adhered to the reference.

While v1b resisted adopting the reference image’s forward orientation and preserved Base’s native rear-view composition, v2a pulled strongly toward the reference pose. This orientation-pulling behavior is closer to alternative adapters like Ref Adapter v2 and Role-Ref-KV tested in my previous benchmarks.

Prompt
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, running, wind, hair blowing, dynamic pose, fantasy landscape, castle in background, sunset sky, dramatic clouds, grass field

Negative:

worst quality, low quality, score_1, score_2, score_3, blurry, jpeg artifacts, chromatic aberration, bad anatomy, bad hands, extra arms, extra fingers, missing fingers, text, watermark, signature, artist name, multiple views, split screen, comic, 2koma, 4koma

Turbo v1.1 Running Pose

I tested the same five seeds with Turbo v1.1.

Seedv2av1b (previous)
20261027PreservedPreserved
20261028Black tights changed to thigh-high socks with bare thighsPreserved
20261029Changed to black leggings, bare knees, and high socksPreserved
20261030Preserved—
20261031Preserved—
v2a s20261027
SnapRef v2a on Turbo v1.1 running scene, seed 20261027
v2a s20261028
SnapRef v2a on Turbo v1.1 running scene, seed 20261028, changed to thigh-high socks
v2a s20261029
SnapRef v2a on Turbo v1.1 running scene, seed 20261029, changed to leggings and high socks
v2a s20261030
SnapRef v2a on Turbo v1.1 running scene, seed 20261030
v2a s20261031
SnapRef v2a on Turbo v1.1 running scene, seed 20261031
v1b s20261027 (previous)
SnapRef v1b on Turbo v1.1 running scene, seed 20261027
v1b s20261028 (previous)
SnapRef v1b on Turbo v1.1 running scene, seed 20261028
v1b s20261029 (previous)
SnapRef v1b on Turbo v1.1 running scene, seed 20261029

In 2 out of 5 seeds with v2a, the black tights shifted into alternative legwear.
Upper-body attributes—hair, shirt, and tie—remained accurate across all five outputs.

The seeds displaying outfit alterations matched those that drifted in v1a during my earlier benchmarks: v1a produced over-the-knee socks on seed 20261028 and high socks on 20261029.
Given that file sizes are nearly identical, v2a may share architectural similarities with v1a, though the documentation does not elaborate on this.

Additionally, seed 20261027 generated an unprompted chest pocket.

Cake and Lying Down Scenes

ConditionTimev2av1b (previous)
Turbo Cake48.3sFork at mouth, necktie visibleHand at mouth, necktie hidden behind arm
Base Cake290.9sFork at mouth, no cupNearly identical composition, cup present
Turbo Lying Down47.4sInverted (head at bottom), knees raised, feet out of frameHead at top, crossed legs, loafers visible
Base Lying Down290.9sNearly identical composition to Turbo, white flowersHead at top, knees raised, loafers visible, yellow and white flowers
v2a Turbo Cake
SnapRef v2a on Turbo v1.1 cake scene
v1b Turbo Cake (previous)
SnapRef v1b on Turbo v1.1 cake scene
v2a Base Cake
SnapRef v2a on Base cake scene
v1b Base Cake (previous)
SnapRef v1b on Base cake scene
v2a Turbo Lying Down
SnapRef v2a on Turbo v1.1 lying down scene, head at bottom
v1b Turbo Lying Down (previous)
SnapRef v1b on Turbo v1.1 lying down scene
v2a Base Lying Down
SnapRef v2a on Base lying down scene, head at bottom
v1b Base Lying Down (previous)
SnapRef v1b on Base lying down scene

The cake scene produced framing very close to v1b.
In the lying down scene, v2a positioned the head toward the bottom of the canvas in an inverted framing across both Turbo and Base.
All four outputs preserved the ahoge, side-ponytail, necktie, and black tights.

Prompts

Cake scene:

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, upper body, sitting, eating, cake, cafe, indoors

Lying down scene:

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, lying on back, on grass, from above, looking at viewer, flowers, daytime

Changing Style with mode char

SnapRef provides two primary mode options: cs (Character & Style, default), which retains both character features and overall artistic rendering, and char, which isolates character features to allow style tags in the prompt to take precedence.
The README illustrates mode char shifting outputs into watercolor or 1990s anime aesthetics.
In v1b, setting char failed to induce watercolor textures and instead tinted the hair.
Using identical tags, I tested Base and Turbo on the cake scene.

Model / Tagcschar
Base (no tag)Default cake sceneSlightly deeper hair shading, otherwise identical
Base watercolor (medium)UnchangedNo watercolor texture; hair shifted to bright orange, shirt picked up blue tints, background elements became flatly yellowed
Base 1990s (style), retro artstyleUnchangedHair shifted toward darker orange; line work and shading did not clearly reflect vintage animation
Turbo watercolor (medium)Standard renderingHair shifted slightly orange with enhanced gloss
v2a watercolor cs
SnapRef v2a Base cake scene with watercolor under mode cs
v2a watercolor char
SnapRef v2a Base cake scene with watercolor under mode char, bright orange hair
v2a 1990s cs
SnapRef v2a Base cake scene with 1990s style under mode cs
v2a 1990s char
SnapRef v2a Base cake scene with 1990s style under mode char, dark orange hair
v2a Turbo watercolor cs
SnapRef v2a Turbo v1.1 cake scene with watercolor under mode cs
v2a Turbo watercolor char
SnapRef v2a Turbo v1.1 cake scene with watercolor under mode char
v1b watercolor char (previous)
SnapRef v1b Base cake scene with watercolor under mode char
v1b 1990s char (previous)
SnapRef v1b Base cake scene with 1990s style under mode char

With Kana’s reference image, v2a’s char mode continued the same tendency seen in v1b, altering hair color before art style.

Using Both Bust and Full-Body References

Matching the v1b test, I combined an upper-body image wearing a blazer and ribbon with the full-body standing pose wearing a white shirt and necktie.
Because the two inputs feature different outfits, it is straightforward to identify which reference informs each part of the character.
I tested Turbo v1.1’s running scene with multi_layout set to separate.

Upper-body Reference
Kana upper body reference with blazer and ribbon
Full-body Reference
Kana full body reference with white shirt and necktie
ConditionTimev2av1b (previous)
Bust only51.5sBlazer and ribbon. Plaid skirt, bare legs, single high sockBlazer and ribbon. Plaid skirt, bare legs, single high sock
Bust + Full, equal weight66.5sWhite shirt and necktie. Plain skirt, black tights, loafersBlazer and ribbon. Plain skirt, black tights, loafers
Bust weight 0.453.3sWhite shirt and necktieWhite shirt and necktie
Full-body weight 0.453.3sBlazer and ribbon. Plain skirt, black tights, loafersNot evaluated for running scene
v2a Bust Only
SnapRef v2a using bust reference only in running scene
v2a Equal Weight
SnapRef v2a with equal reference weights, yielding white shirt and necktie
v2a Bust 0.4
SnapRef v2a with bust weight set to 0.4
v2a Full 0.4
SnapRef v2a with full body weight set to 0.4, yielding blazer and ribbon
v1b Bust Only (previous)
SnapRef v1b using bust reference only in running scene
v1b Equal Weight (previous)
SnapRef v1b with equal reference weights, yielding blazer and ribbon
v1b Bust 0.4 (previous)
SnapRef v1b with bust weight set to 0.4

Under equal weighting, v1b prioritized the blazer from the bust image, whereas v2a favored the white shirt from the full-body illustration.
Lowering full-body weight to 0.4 in v2a switched the upper outfit to the blazer, while retaining the plain skirt and black tights from the full-body reference on the lower body.
Weight values enable selecting which outfit dominates across both versions, though the default priority inverted.

Running on 2.9B Without Key Reassignment

Because the v2a node automatically maps 28 weight blocks onto Anima-2.9B’s 40-block layout, I tested snapref_v2a.safetensors on Anima-2.9B-preview-v1 without modifying tensor keys.

ConditionTime (Run / Cake)Running SceneCake Scene
v2a, stock weights427.1s / 412.0sFront view running, reference intactFork at mouth, reference intact
v1b, stock weights (previous)435.1s / 434.3sFrozen in standing reference pose, blurred background with white haloFrozen in standing pose, cup and cake floating translucently
v2a Running
SnapRef v2a on 2.9B running scene without key reassignment
v2a Cake
SnapRef v2a on 2.9B cake scene without key reassignment
v1b Running (previous)
SnapRef v1b on 2.9B running scene without key reassignment, frozen in reference pose
v1b Cake (previous)
SnapRef v1b on 2.9B cake scene without key reassignment, frozen in reference pose

While stock weights failed on 2.9B in my v1b benchmarks, v2a functioned straight out of the box.
Because layer reassignment is handled inside the custom node, the updated node should theoretically handle v1b weights similarly.

Side-by-Side Reference Black Image on MPS

In my v1b benchmarks, providing a side-by-side two-character image at 1664×1216 (downscaled to 1184×864 internally) produced a solid black image on MPS when strength was non-zero.
Using the same image with strength 1 on Turbo v1.1 at 1216×832 produced completely black output under v2a as well (50.3 seconds).

As diffs confirmed, the -inf masking logic suspected of triggering zeroed Metal tensors remains untouched in the v2a node.
Adjusting reference resolutions so that total tokens align with multiples of 16 remains the necessary workaround.

Generation Speed Measurements

I measured generation times across Turbo v1.1 and Base running scenes.

ConditionTurbo s20261030Turbo s20261031Base s20261030
Unreferenced38.2s38.4s—
SnapRef v1b51.4s51.5s312.0s
SnapRef v2a54.6秒49.6s290.9s

On Base, v2a running scene outputs took 289.9–295.9 seconds across five seeds, and fell within 280.7–297.9 seconds across all tested prompts.
This slight speedup over v1b aligns with the smaller weight size observed previously with v1a.
On Turbo, the time difference between v1b and v2a remained within normal per-seed variance.

Using Anima-Generated Images as References

The outfit instability observed on Turbo v1.1 affected legwear, and the reference was a hand-drawn illustration.
Using an image generated natively by Anima provides line work and coloring closer to the model’s training distribution, which might improve reference retention.

I tested two approaches: redrawing Kana’s standing pose with Anima to use as a clean reference, and using a generated running scene to request alternative viewing angles. Settings were Turbo v1.1, 8 steps, and cfg 1.0.

Using a Redrawn Standing Pose as Reference

Using the hand-drawn illustration as input, I generated white-background standing poses across four seeds.

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, looking at viewer, arms at sides, white background, simple background

All four outputs reproduced the hairstyle, scrunchie, shirt, tie, skirt, black tights, and loafers.
I selected seed 20261027 (832×1216), which avoided generating an unwanted chest pocket, to serve as the new reference.

Hand-drawn Reference
Kana full body reference illustration
Redrawn s20261027 (Used as Reference)
Redrawn standing pose with Turbo v1.1, seed 20261027, no pocket
Redrawn s20261028
Redrawn standing pose with Turbo v1.1, seed 20261028, with pocket

Using this redrawn reference, I regenerated running scenes across the seeds that previously showed legwear alterations.

SeedHand-drawn ReferenceRedrawn Reference
20261027PreservedPreserved
20261028Changed to thigh-high socksBlack tights preserved
20261029Changed to leggings and high socksOne knee sheer, high sock below knee
Redrawn Reference s20261027
Running scene with redrawn reference, seed 20261027
Redrawn Reference s20261028
Running scene with redrawn reference, seed 20261028, black tights preserved
Redrawn Reference s20261029
Running scene with redrawn reference, seed 20261029, partially altered
Hand-drawn Reference s20261027
Running scene with hand-drawn reference, seed 20261027
Hand-drawn Reference s20261028
Running scene with hand-drawn reference, seed 20261028, altered
Hand-drawn Reference s20261029
Running scene with hand-drawn reference, seed 20261029, altered

Seed 20261028 recovered full black tights, while 20261029 saw less pronounced distortion. Framing and upper-body details remained almost identical to hand-drawn tests.

The lying down scene on Turbo still placed the head at the bottom of the canvas, and Base’s running scene (seed 20261027) remained front-facing.

Redrawn Reference Turbo Lying Down
Lying down scene with redrawn reference, head at bottom
Redrawn Reference Base Running
Base running scene with redrawn reference, seed 20261027, front view

Changing Angles Using a Generated Running Scene

Using Turbo v1.1’s running output (seed 20261027) as the reference, I added from side or from behind to the running prompt.

ConditionRunning Scene ReferenceHand-drawn Reference
from side s20261027Profile view, black tights preservedProfile view, black tights preserved
from side s20261028Profile view, black tights preservedProfile view, black tights preserved, hand at forehead
from behind s20261027Oblique rear view, turning back to show facePure rear view, black tights preserved
from behind s20261028Pure rear view, black tights preservedPure rear view, changed to thigh-high socks
Running Reference Side s20261027
from side using running scene reference, seed 20261027
Running Reference Side s20261028
from side using running scene reference, seed 20261028
Hand-drawn Reference Side s20261027
from side using hand-drawn reference, seed 20261027
Hand-drawn Reference Side s20261028
from side using hand-drawn reference, seed 20261028, hand at forehead
Running Reference Behind s20261027
from behind using running scene reference, seed 20261027, looking back
Running Reference Behind s20261028
from behind using running scene reference, seed 20261028, black tights preserved
Hand-drawn Reference Behind s20261027
from behind using hand-drawn reference, seed 20261027
Hand-drawn Reference Behind s20261028
from behind using hand-drawn reference, seed 20261028, altered legwear

Side profiles generated cleanly across both references.
The only condition showing legwear drift was the hand-drawn reference under rear view on seed 20261028.
Using the generated running image preserved black tights across all four outputs, though from behind on seed 20261027 turned into an oblique angle facing back rather than a direct rear view.

Choosing Between Versions

Use CaseRecommended Option
Need front views on Base without explicit orientation tagsv2a (front view produced on 4 out of 5 seeds)
Want Base to avoid pulling toward reference orientationv1b (preserves native rear orientation on running scenes)
Need strict lower-body consistency on Turbov1b (v2a shifted legwear on some seeds)
Minimize legwear drift on v2aUse a redrawn standing pose generated by Anima as the reference
Keep the same outfit across side and rear viewsUse a generated scene as reference with from side or from behind
Prioritize upper outfit from bust reference in multi-reference setupsv2a with full-body reference weight reduced to around 0.4
Target Anima-2.9Bv2a custom node (automatically maps weights without manual key conversion)
Smaller storage footprintv2a (382 MB, roughly 40% the size of v1b’s BF16 weights)

References