Files
site-portfolio/public/vendor/paper-shaders/shaders/simplex-noise.js
T
root daa623fe73 feat(mesh-bg): fade-in шейдера фона + modulepreload графа
- canvas стартует с opacity:0 и плавно проявляется (0.9s) при .is-ready
- initPageMeshShader ставит is-ready после первого кадра
- modulepreload page-mesh-shader.js для параллельной загрузки с main.js
- пересборка страниц (build:pages)
2026-09-24 21:37:40 +02:00

101 lines
2.5 KiB
JavaScript

/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Paper Shaders *
* https://github.com/paper-design/shaders *
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
import {} from "../shader-sizing.js";
import { simplexNoise, colorBandingFix } from "../shader-utils.js";
const simplexNoiseMeta = {
maxColorCount: 10
};
const simplexNoiseFragmentShader = `#version 300 es
precision mediump float;
uniform float u_time;
uniform float u_scale;
uniform vec4 u_colors[${simplexNoiseMeta.maxColorCount}];
uniform float u_colorsCount;
uniform float u_stepsPerColor;
uniform float u_softness;
in vec2 v_patternUV;
out vec4 fragColor;
${simplexNoise}
float getNoise(vec2 uv, float t) {
float noise = .5 * snoise(uv - vec2(0., .3 * t));
noise += .5 * snoise(2. * uv + vec2(0., .32 * t));
return noise;
}
float steppedSmooth(float m, float steps, float softness) {
float stepT = floor(m * steps) / steps;
float f = m * steps - floor(m * steps);
float fw = steps * fwidth(m);
float smoothed = smoothstep(.5 - softness, min(1., .5 + softness + fw), f);
return stepT + smoothed / steps;
}
void main() {
vec2 shape_uv = v_patternUV;
shape_uv *= .1;
float t = .2 * u_time;
float shape = .5 + .5 * getNoise(shape_uv, t);
bool u_extraSides = true;
float mixer = shape * (u_colorsCount - 1.);
if (u_extraSides == true) {
mixer = (shape - .5 / u_colorsCount) * u_colorsCount;
}
float steps = max(1., u_stepsPerColor);
vec4 gradient = u_colors[0];
gradient.rgb *= gradient.a;
for (int i = 1; i < ${simplexNoiseMeta.maxColorCount}; i++) {
if (i >= int(u_colorsCount)) break;
float localM = clamp(mixer - float(i - 1), 0., 1.);
localM = steppedSmooth(localM, steps, .5 * u_softness);
vec4 c = u_colors[i];
c.rgb *= c.a;
gradient = mix(gradient, c, localM);
}
if (u_extraSides == true) {
if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {
float localM = mixer + 1.;
if (mixer > (u_colorsCount - 1.)) {
localM = mixer - (u_colorsCount - 1.);
}
localM = steppedSmooth(localM, steps, .5 * u_softness);
vec4 cFst = u_colors[0];
cFst.rgb *= cFst.a;
vec4 cLast = u_colors[int(u_colorsCount - 1.)];
cLast.rgb *= cLast.a;
gradient = mix(cLast, cFst, localM);
}
}
vec3 color = gradient.rgb;
float opacity = gradient.a;
${colorBandingFix}
fragColor = vec4(color, opacity);
}
`;
export {
simplexNoiseFragmentShader,
simplexNoiseMeta
};
//# sourceMappingURL=simplex-noise.js.map