From f666d4e908ee16d24d52e3c8a6c2c4e3ab0e4ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=86motion=20Studio?= <163354043+AEmotionStudio@users.noreply.github.com> Date: Tue, 22 Sep 2026 01:23:31 -0700 Subject: [PATCH] feat: gaussian shader type, white noise as the control Co-Authored-By: Claude Fable 5.1 --- __init__.py | 8 +++- direct_shader_ksampler.py | 2 +- shaders/gaussian.py | 85 +++++++++++++++++++++++++++++++++ tests/golden/image_gaussian.pt | Bin 0 -> 15075 bytes tests/golden/video_gaussian.pt | Bin 0 -> 106028 bytes tests/golden_cases.py | 5 ++ tests/test_gaussian.py | 79 ++++++++++++++++++++++++++++++ tests/test_generators_smoke.py | 3 +- tests/test_presets.py | 2 +- tests/test_shader_noise.py | 10 ++-- tests/test_simplex.py | 2 +- 11 files changed, 186 insertions(+), 10 deletions(-) create mode 100644 shaders/gaussian.py create mode 100644 tests/golden/image_gaussian.pt create mode 100644 tests/golden/video_gaussian.pt create mode 100644 tests/test_gaussian.py diff --git a/__init__.py b/__init__.py index d97ba83..5d760b1 100644 --- a/__init__.py +++ b/__init__.py @@ -25,8 +25,8 @@ from .shaders.registry import ( ) # Importing the generator modules runs their @shader_generator decorators, -# which register "domain_warp", "tensor_field", "curl_noise" and -# "temporal_coherent". Only the aliases below are registered here. +# which is what registers every shader type. Only the aliases below are +# registered here. from .shaders.domain_warp import ( DomainWarpGenerator, generate_domain_warp_tensor, @@ -47,6 +47,10 @@ from .shaders.spectral import ( SpectralNoiseGenerator, generate_spectral_tensor, ) +from .shaders.gaussian import ( + GaussianNoiseGenerator, + generate_gaussian_tensor, +) register_shader("curl", CurlNoiseGenerator, { "description": "Curl/fluid noise patterns (alias)", diff --git a/direct_shader_ksampler.py b/direct_shader_ksampler.py index 3829e31..3652a2c 100644 --- a/direct_shader_ksampler.py +++ b/direct_shader_ksampler.py @@ -28,7 +28,7 @@ class DirectShaderNoiseKSampler(ShaderNoiseKSampler): "use_temporal_coherence": ("BOOLEAN", {"default": False, "tooltip": "Hold one seed across every video frame so the shader pattern evolves only through time, instead of redrawing per frame. Frames share one pattern, so it reinforces rather than averaging out and shows at lower strength than a redrawn pattern: on MiniMax H3 it took over the picture at 0.5 and was hard to see at 0.2. No effect on single images."}), # New direct shader parameters - "shader_type": (["domain_warp", "tensor_field", "curl_noise", "temporal_coherent", "spectral"], {"default": "domain_warp", "tooltip": "Which noise pattern to blend in; each has its own character when it shows. domain_warp: flowing, intricate distortions, the even-handed default. tensor_field: structured and directional. curl_noise: smooth fluid motion, and the one that shows soonest, at about half the strength of the others. temporal_coherent: 4D simplex with time as a real axis, built for smooth animation; on MiniMax H3 it shows sooner than domain_warp, as a dot-grid pattern past about 0.5. spectral: soft cloud-like fields built from their own frequency band rather than pixel by pixel -- no filaments or swirls, and colour schemes do nothing to it, but noise_scale sets the band directly and it costs almost nothing to draw (about 90ms where the others take seconds on a long video). Its character is untested against real prompts, so treat its strengths as unknown rather than calibrated. The live preview only draws the first three; picking another leaves the preview on its last pattern, which does not affect sampling."}), + "shader_type": (["domain_warp", "tensor_field", "curl_noise", "temporal_coherent", "spectral", "gaussian"], {"default": "domain_warp", "tooltip": "Which noise pattern to blend in; each has its own character when it shows. domain_warp: flowing, intricate distortions, the even-handed default. tensor_field: structured and directional. curl_noise: smooth fluid motion, and the one that shows soonest, at about half the strength of the others. temporal_coherent: 4D simplex with time as a real axis, built for smooth animation; on MiniMax H3 it shows sooner than domain_warp, as a dot-grid pattern past about 0.5. spectral: soft cloud-like fields built from their own frequency band rather than pixel by pixel -- no filaments or swirls, and colour schemes do nothing to it, but noise_scale sets the band directly and it costs almost nothing to draw (about 90ms where the others take seconds on a long video). Its character is untested against real prompts, so treat its strengths as unknown rather than calibrated. gaussian: the control -- plain white noise, the same thing the sampler already starts from, so any strength moves you toward another seed's neighbourhood without adding structure; noise_scale, octaves, warp_strength, phase_shift and colour schemes do nothing to it, shape masks still apply, and with temporal coherence a clip drifts smoothly from one white field to a second. The live preview only draws the first three; picking another leaves the preview on its last pattern, which does not affect sampling."}), "shape_type": (["none", "radial", "linear", "spiral", "checkerboard", "spots", "hexgrid", "stripes", "gradient", "vignette", "cross", "stars", "triangles", "concentric", "rays", "zigzag"], {"default": "none", "tooltip": "Mask the shader noise into a shape before it reaches the sampler (not post-processing). A mask concentrates the noise into hard geometry, which survives denoising far more readily than plain shader noise, so the shape itself starts being drawn into the picture at lower strength: on MiniMax H3 it was at 0.6, which is what the stamp preset uses. Around 0.2 the mask shapes the noise without being drawn."}), "color_scheme": (["none", "blue_red", "viridis", "plasma", "inferno", "magma", "turbo", "jet", "rainbow", "cool", "hot", "parula", "hsv", "autumn", "winter", "spring", "summer", "copper", "pink", "bone", "ocean", "terrain", "neon", "fire"], {"default": "none", "tooltip": "Choose a color palette to apply to the shader noise visualization [not post processing - is applied to the shader noise pattern before rendering]"}), "noise_scale": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 10.0, "step": 0.001, "tooltip": "Size of the shader's features: lower is larger and zoomed in, higher is smaller and zoomed out. It changes how the shader shows as much as strength does. Large features carry the pattern into the result and pull away from the seed; small ones are mostly absorbed into the picture while still steering it. On SD 1.5 at strength 0.5, 0.5 turned every seed abstract and 2.0 gave clean portraits again; on MiniMax H3 at the same strength both stayed photographic, with 0.5 re-composing the scene most. Small shifts can lead to large variations."}), diff --git a/shaders/gaussian.py b/shaders/gaussian.py new file mode 100644 index 0000000..c1bcf7b --- /dev/null +++ b/shaders/gaussian.py @@ -0,0 +1,85 @@ +""" +White noise: the control. + +Every other type draws a structured field. This one draws exactly what the +sampler already starts from, an independent Gaussian field per channel, so +blending it in moves the run toward another seed's neighbourhood without adding +any structure of its own. That isolates what shader_strength and the blend mode +do by themselves, which is what a control is for. + +Nothing spatial reaches it: noise_scale, octaves, warp_strength, phase_shift and +colour schemes do nothing, and the tooltip says so. Shape masks still apply, +since a mask is a spatial shape imposed on whatever field it is given. + +Time turns one white field into a second along a great circle, so holding the +seed and advancing it evolves the noise smoothly instead of redrawing it: at +time 0 the field is the first draw exactly, at time 1 the second. +""" +import math + +import torch + +from .base import BaseNoiseGenerator +from .registry import shader_generator +from ..core.constants import DEFAULT_CHANNELS +from ..core.params import ShaderParams +from ..utils.noise_utils import create_coordinate_grid +from ..utils.shape_masks import apply_shape_mask + +# Channel seed stride, shared with shaders/base.py so the conventions agree. +_CHANNEL_SEED_STRIDE = 6151 + + +@shader_generator("gaussian", metadata={ + "description": "White noise, an independent Gaussian field per channel: the control", + "supports_temporal": True, +}) +class GaussianNoiseGenerator(BaseNoiseGenerator): + """An independent Gaussian field per channel, with no spatial structure.""" + + @staticmethod + def generate( + batch_size: int, + height: int, + width: int, + params: ShaderParams, + device: torch.device, + seed: int = 0, + target_channels: int = DEFAULT_CHANNELS, + ) -> torch.Tensor: + time = float(params.time) + base_seed = params.get("base_seed", seed) + current_seed = base_seed if params.use_temporal_coherence else seed + + # One CPU generator per channel, seeded the way shaders/base.py seeds its + # extra channels, so channel 0 of a wide draw is the one-channel draw at + # the same seed; shaders/spectral.py records why one wide randn is not. + angle = time * math.pi / 2.0 + fields = [] + for channel in range(target_channels): + channel_generator = torch.Generator(device="cpu").manual_seed( + int(current_seed) + _CHANNEL_SEED_STRIDE * channel) + first = torch.randn(batch_size, 1, height, width, generator=channel_generator) + second = torch.randn(batch_size, 1, height, width, generator=channel_generator) + fields.append(first * math.cos(angle) + second * math.sin(angle)) + field = torch.cat(fields, dim=1).to(device) + mean = field.mean(dim=(-2, -1), keepdim=True) + std = field.std(dim=(-2, -1), keepdim=True) + field = (field - mean) / (std + 1e-8) + + shape_type = params.shape_type + shape_strength = params.shape_strength + if shape_type not in ["none", "0"] and shape_strength > 0: + coords = create_coordinate_grid(batch_size, height, width, device) + mask = apply_shape_mask(coords, shape_type, time, current_seed, shape_strength) + field = torch.lerp(field, field * mask.permute(0, 3, 1, 2), shape_strength) + + # Same convention as the other generators: standardised, halved, clamped. + return torch.clamp(field * 0.5, -1.0, 1.0) + + +def generate_gaussian_tensor(batch_size, height, width, params, device, seed=0, + target_channels=DEFAULT_CHANNELS): + """Function form, matching the other generators' module-level entry points.""" + return GaussianNoiseGenerator.generate( + batch_size, height, width, params, device, seed, target_channels) diff --git a/tests/golden/image_gaussian.pt b/tests/golden/image_gaussian.pt new file mode 100644 index 0000000000000000000000000000000000000000..925d8e67de96dbc29294c4c9da715a5a3df8b8e3 GIT binary patch literal 15075 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 V`giY~*r0n%Fh`0rIR3}j{{nMBOu+yE literal 0 HcmV?d00001 diff --git a/tests/golden/video_gaussian.pt b/tests/golden/video_gaussian.pt new file mode 100644 index 0000000000000000000000000000000000000000..0740c8239c91eafcd562778e950d8d7f837a79a4 GIT binary patch literal 106028 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
c8 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 literal 0 HcmV?d00001 diff --git a/tests/golden_cases.py b/tests/golden_cases.py index 95bd9ed..b542441 100644 --- a/tests/golden_cases.py +++ b/tests/golden_cases.py @@ -54,6 +54,11 @@ CASES = { # the generators added later can share it; this pins its output across the move. "video_temporal_coherent": dict(kind="flow", video=True, shader_type="temporal_coherent", use_temporal_coherence=True, sequential_stages=2), + # One image and one video case per generator added after spectral, the video + # one with temporal coherence, which is where each differs most from a redraw. + "image_gaussian": dict(shader_type="gaussian"), + "video_gaussian": dict(kind="flow", video=True, shader_type="gaussian", + use_temporal_coherence=True, sequential_stages=2), # The spectral generator builds its field from a frequency band rather than # per pixel, so it shares none of the others' code below core.shader_noise. # One image case and one video case, the video one with temporal coherence diff --git a/tests/test_gaussian.py b/tests/test_gaussian.py new file mode 100644 index 0000000..0f7b96f --- /dev/null +++ b/tests/test_gaussian.py @@ -0,0 +1,79 @@ +""" +The gaussian generator: white noise, the control. + +The properties worth pinning are the absences. It must have no spatial +structure, none of the pattern knobs may reach it, and it must still keep the +contract the other generators keep: a field per channel, channel 0 unchanged by +how many were asked for, and one field evolving under temporal coherence. +""" +import pytest +import torch + +from snk.core.constants import CHANNEL_BASIS +from snk.core.shader_noise import effective_channel_rank, generate + +CPU = torch.device("cpu") +PARAMS = { + "scale": 1.0, "octaves": 3.0, "warp_strength": 0.5, "phase_shift": 0.5, + "shape_type": "none", "color_scheme": "none", "time": 0.0, "base_seed": 8888, +} + + +def _neighbour_correlation(noise): + field = noise[0] + pairs = torch.stack([field[:, :-1, :].flatten(), field[:, 1:, :].flatten()]) + return torch.corrcoef(pairs)[0, 1].item() + + +def test_the_field_is_white(): + noise = generate((1, 24, 22, 38), PARAMS, "gaussian", 8888, CPU) + assert abs(_neighbour_correlation(noise)) < 0.05 + assert noise.abs().max() <= 1.0 + + +@pytest.mark.parametrize("knob", [dict(scale=0.3), dict(scale=3.0), dict(octaves=8.0), + dict(warp_strength=5.0), dict(phase_shift=2.0), + dict(color_scheme="viridis")]) +def test_no_pattern_knob_reaches_it(knob): + """The tooltip promises these do nothing, so a stray use of one fails here.""" + stock = generate((1, 4, 16, 16), PARAMS, "gaussian", 8888, CPU) + assert torch.equal(generate((1, 4, 16, 16), dict(PARAMS, **knob), "gaussian", 8888, CPU), stock) + + +def test_a_shape_mask_still_applies(): + stock = generate((1, 4, 16, 16), PARAMS, "gaussian", 8888, CPU) + masked = generate((1, 4, 16, 16), dict(PARAMS, shape_type="radial"), "gaussian", 8888, CPU) + assert not torch.equal(masked, stock) + + +@pytest.mark.parametrize("shape", [(1, 4, 64, 64), (1, 24, 22, 38), (1, 24, 5, 16, 16), + (1, 128, 3, 8, 8), (1, 128, 3, 32, 32)]) +def test_every_channel_is_its_own_field(shape): + rank = effective_channel_rank(generate(shape, PARAMS, "gaussian", 8888, CPU)) + assert rank > min(shape[1], CHANNEL_BASIS) * 0.85 + + +def test_channel_zero_does_not_depend_on_how_many_channels_were_asked_for(): + wide = generate((1, 24, 5, 22, 38), PARAMS, "gaussian", 8888, CPU) + single = generate((1, 1, 5, 22, 38), PARAMS, "gaussian", 8888, CPU) + assert torch.equal(wide[:, :1], single) + + +def test_holding_the_seed_and_advancing_time_turns_one_field_into_another(): + """ + A 5-frame clip steps time by a quarter, so adjacent frames sit cos(pi/8) + apart on the great circle: 0.92. Without coherence each frame is its own seed. + """ + def frame_correlation(coherent): + noise = generate((1, 24, 5, 22, 38), dict(PARAMS, use_temporal_coherence=coherent), + "gaussian", 8888, CPU, temporal_coherence=coherent) + pairs = torch.stack([noise[0, :, 0].flatten(), noise[0, :, 1].flatten()]) + return torch.corrcoef(pairs)[0, 1].item() + + assert frame_correlation(True) > 0.8 + assert abs(frame_correlation(False)) < 0.1 + # Frame 0 is the first draw exactly, whatever time does to the frames after it. + clip = generate((1, 4, 5, 16, 16), dict(PARAMS, use_temporal_coherence=True), + "gaussian", 8888, CPU, temporal_coherence=True) + still = generate((1, 4, 16, 16), dict(PARAMS, use_temporal_coherence=True), "gaussian", 8888, CPU) + assert torch.equal(clip[:, :, 0], still) diff --git a/tests/test_generators_smoke.py b/tests/test_generators_smoke.py index 41db77b..0b2b0f2 100644 --- a/tests/test_generators_smoke.py +++ b/tests/test_generators_smoke.py @@ -12,7 +12,8 @@ import itertools import pytest import torch -SHADER_TYPES = ["domain_warp", "tensor_field", "curl_noise", "temporal_coherent"] +SHADER_TYPES = ["domain_warp", "tensor_field", "curl_noise", "temporal_coherent", "spectral", + "gaussian"] def make_params(octaves=1, channels=4, color_scheme="none", shape_type="none", temporal=False): diff --git a/tests/test_presets.py b/tests/test_presets.py index fdf3445..61f1a14 100644 --- a/tests/test_presets.py +++ b/tests/test_presets.py @@ -33,7 +33,7 @@ def test_the_modes_are_ordered_by_how_wide_they_leave_the_noise(shape): @pytest.mark.parametrize("shader_type", ["domain_warp", "tensor_field", "curl_noise", - "temporal_coherent"]) + "temporal_coherent", "gaussian"]) def test_jump_collapses_every_generator_not_just_the_narrow_ones(shader_type): """ jump has to mean the same thing whatever shader is chosen, otherwise diff --git a/tests/test_shader_noise.py b/tests/test_shader_noise.py index c2041c5..45fbd7f 100644 --- a/tests/test_shader_noise.py +++ b/tests/test_shader_noise.py @@ -103,7 +103,8 @@ def test_temporal_coherence_holds_the_seed(): assert not torch.allclose(without, with_tc) -@pytest.mark.parametrize("shader_type", ["domain_warp", "tensor_field", "curl_noise", "temporal_coherent"]) +@pytest.mark.parametrize("shader_type", ["domain_warp", "tensor_field", "curl_noise", "temporal_coherent", + "gaussian"]) def test_every_registered_generator_is_usable(shader_type): noise = generate((1, 4, 16, 16), {**PARAMS, "shader_type": shader_type}, shader_type, 8888, CPU) assert tuple(noise.shape) == (1, 4, 16, 16) @@ -123,7 +124,8 @@ def test_unknown_shader_type_raises_a_clear_error(): # --- channel width -------------------------------------------------------------------- -ALL_SHADERS = ["domain_warp", "temporal_coherent", "curl_noise", "tensor_field", "spectral"] +ALL_SHADERS = ["domain_warp", "temporal_coherent", "curl_noise", "tensor_field", "spectral", + "gaussian"] @pytest.mark.parametrize("shape", [(1, 4, 48, 48), (1, 16, 32, 32), (1, 24, 5, 16, 16)]) @@ -139,7 +141,7 @@ def test_generators_span_their_channel_axis(shape, shader_type): assert rank > shape[1] * 0.6, f"{shader_type}: rank {rank:.2f} of {shape[1]}" -@pytest.mark.parametrize("shader_type", ["domain_warp", "temporal_coherent", "curl_noise"]) +@pytest.mark.parametrize("shader_type", ["domain_warp", "temporal_coherent", "curl_noise", "gaussian"]) def test_a_latent_wider_than_the_basis_still_spans_the_basis(shader_type): """Past CHANNEL_BASIS the channels are mixtures, which must not re-collapse the draw.""" rank = effective_channel_rank(generate((1, 128, 3, 8, 8), PARAMS, shader_type, 8888, CPU)) @@ -264,7 +266,7 @@ def test_a_collapse_does_not_render_the_draw_it_discards(shape, shader_type, mon assert set(calls) == {1}, f"a collapse rendered a {max(calls)}-channel draw it cannot use" -@pytest.mark.parametrize("shader_type", ["domain_warp", "curl_noise", "temporal_coherent"]) +@pytest.mark.parametrize("shader_type", ["domain_warp", "curl_noise", "temporal_coherent", "gaussian"]) def test_the_hash_generators_do_not_reseed_the_global_rng(shader_type, monkeypatch): """ These three are pure coordinate hashes of their seed argument, so the diff --git a/tests/test_simplex.py b/tests/test_simplex.py index 5d2b4d6..dc18531 100644 --- a/tests/test_simplex.py +++ b/tests/test_simplex.py @@ -103,7 +103,7 @@ def test_the_seed_is_coerced_to_int64(): @pytest.mark.parametrize("shader_type", ["domain_warp", "curl_noise", - "temporal_coherent", "tensor_field"]) + "temporal_coherent", "tensor_field", "gaussian"]) @pytest.mark.parametrize("hw", RAGGED + ALIGNED) def test_channel_zero_survives_batching_at_every_shape(shader_type, hw): """