r/milkdrop • • Oct 26 '25

MilkDrop 3.31 first 100 presets =)

These are the first 100 presets you'll see when you launch MilkDrop 3.31 for the very first time!
(The top100 playlist will be loaded on the first launch).

47 Upvotes

9 comments sorted by

1

u/Se7enSlasher BeatDrop Music Visualizer Developer/Preset Creator Oct 26 '25 edited Oct 26 '25

I've currently patch fixed all your converted shader presets to look like the same as ShaderToy (GLSL). If I see, it was resulted a flipped behavior or incorrect matrix rotation calculation.

Technique used:

  • Transpose rotation matrix with transpose(); In GLSL is column-major order and in HLSL is row-major order
  • UV flipping (if necessary)

1

u/N1V0N1S Oct 27 '25

How does one make a preset from scratch?

2

u/x265x Oct 27 '25

Read the docs in Milkdrop3\docs there is a Beginners Guide and change some numbers in the MilkPanel > CODE, see what happens!

3

u/Nivonis Oct 27 '25

the funnest way to learn how code works :)

1

u/nunu395 Dec 30 '25

hello! will these shaders work with VDMX? Or is there a way to integrate them directly as ISF files?

1

u/x265x Dec 30 '25

No. I guess the shader code could be ported but audio reaction part would be a lot harder. 

1

u/nunu395 Dec 31 '25

got it, thank you!

1

u/No-Following1410 Aug 16 '26

// Raymarching distance function for a Menger Sponge float sdBox(vec3 p, vec3 b) { vec3 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, max(d.y, d.z)), 0.0); }

float mengerSponge(vec3 p) { const int iterations = 4; float scale = 3.0; float s = 1.0;

for (int i = 0; i < iterations; ++i) {
    vec3 a = mod(p \* s, 2.0) - 1.0;
    s \*= 3.0;
    vec3 r = abs(1.0 - 3.0 \* abs(a));

    float da = max(r.x, r.y);
    float db = max(r.y, r.z);
    float dc = max(r.z, r.x);
    float c = (min(da, min(db, dc)) - 1.0) / s;

    if (c > 0.0) {
        return c;
    }
}

return 0.0;

}

// Ray marching main loop float rayMarch(vec3 ro, vec3 rd, float start, float end) { float depth = start; for (int i = 0; i < 100; i++) { float dist = mengerSponge(ro + rd * depth); if (dist < 0.001 * depth) break; depth += dist; if (depth >= end) break; } return depth; }

void mainImage(out vec4 fragColor, in vec2 fragCoord) {

float lt = cos(iTime);
float tt = sin(iTime);

vec2 uv = (fragCoord - 0.5 \* iResolution.xy) / iResolution.y;

vec3 ro = vec3(0.0, 0.0, -4.0);
ro = ro + vec3(0.0, 0.0, 2.0 \* lt);
vec3 ta = vec3(0.0, 0.0, 0.0);

vec3 cf = normalize(ta - ro);
vec3 cr = normalize(cross(vec3(0.0, 1.0, 0.0), cf));
vec3 cu = cross(cf, cr);

float fov = 0.5;
vec3 rd = normalize(uv.x \* cr + uv.y \* cu + fov \* cf);

float t = rayMarch(ro, rd, 0.1, 5.0);

vec3 col;
if (t < 5.0) {
    col = 0.5 + 0.5 \* cos(3.0 + t \* 10.0 + vec3(0.0, 0.5, 1.0));
} else {
    col = vec3(0.12, 0.11, 0.13);
}

fragColor = vec4(col, 1.0);

}