Mix noises while preserving the histogram.
Log in to post a comment.
#version 300 es precision highp float; uniform float iTime; uniform vec2 iResolution; uniform float HistogramPreserve; // value=0, min=0, max=1, step=0.001 out vec4 fragColor; float hash12(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); } void main() { float n0 = hash12(gl_FragCoord.xy); float n1 = hash12(gl_FragCoord.yx + 0.5); float f = .5 + .5 * sin(gl_FragCoord.x / iResolution.x * 20. + 2. * iTime); float h = mix(n0, n1, f); // histogram preserved noise fast float h0 = clamp((h - .5) / length(vec2(f, 1.-f)) + .5, 0., 1.); // histogram preserved noise correct float f1 = min(f, 1.-f), x = min(h, 1.-h); float e = f1 / (2. - 2.*f1); float h1 = x < f1 ? e * pow((x / f1), 2.) : e + (1. - 2.*e) * (h - f1) / (1. - 2.*f1); if (h > 1. - f1) h1 = 1. - h1; vec3 col = vec3(mix(h, h1, HistogramPreserve)); fragColor = vec4(col, 1.); }