@paper-design/shaders 0.0.32 → 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/get-shader-color-from-string.js +93 -0
- package/dist/get-shader-color-from-string.js.map +7 -0
- package/dist/get-shader-noise-texture.js +23 -0
- package/dist/get-shader-noise-texture.js.map +7 -0
- package/dist/index.d.ts +25 -23
- package/dist/index.js +118 -0
- package/dist/index.js.map +7 -0
- package/dist/shader-color-spaces.js +96 -0
- package/dist/shader-color-spaces.js.map +7 -0
- package/dist/shader-mount.d.ts +3 -0
- package/dist/shader-mount.js +593 -0
- package/dist/shader-mount.js.map +7 -0
- package/dist/shader-sizing.js +193 -0
- package/dist/shader-sizing.js.map +7 -0
- package/dist/shader-utils.d.ts +1 -0
- package/dist/shader-utils.js +74 -0
- package/dist/shader-utils.js.map +7 -0
- package/dist/shaders/color-panels.d.ts +47 -0
- package/dist/shaders/color-panels.js +210 -0
- package/dist/shaders/color-panels.js.map +7 -0
- package/dist/shaders/dithering.d.ts +24 -29
- package/dist/shaders/dithering.js +221 -0
- package/dist/shaders/dithering.js.map +7 -0
- package/dist/shaders/dot-grid.d.ts +16 -14
- package/dist/shaders/dot-grid.js +108 -0
- package/dist/shaders/dot-grid.js.map +7 -0
- package/dist/shaders/dot-orbit.d.ts +14 -13
- package/dist/shaders/dot-orbit.js +124 -0
- package/dist/shaders/dot-orbit.js.map +7 -0
- package/dist/shaders/god-rays.d.ts +18 -19
- package/dist/shaders/god-rays.js +118 -0
- package/dist/shaders/god-rays.js.map +7 -0
- package/dist/shaders/grain-gradient.d.ts +24 -4
- package/dist/shaders/grain-gradient.js +226 -0
- package/dist/shaders/grain-gradient.js.map +7 -0
- package/dist/shaders/liquid-metal.d.ts +44 -12
- package/dist/shaders/liquid-metal.js +221 -0
- package/dist/shaders/liquid-metal.js.map +7 -0
- package/dist/shaders/mesh-gradient.d.ts +10 -10
- package/dist/shaders/mesh-gradient.js +97 -0
- package/dist/shaders/mesh-gradient.js.map +7 -0
- package/dist/shaders/metaballs.d.ts +13 -10
- package/dist/shaders/metaballs.js +110 -0
- package/dist/shaders/metaballs.js.map +7 -0
- package/dist/shaders/neuro-noise.d.ts +13 -9
- package/dist/shaders/neuro-noise.js +81 -0
- package/dist/shaders/neuro-noise.js.map +7 -0
- package/dist/shaders/perlin-noise.d.ts +15 -19
- package/dist/shaders/perlin-noise.js +201 -0
- package/dist/shaders/perlin-noise.js.map +7 -0
- package/dist/shaders/pulsing-border.d.ts +17 -18
- package/dist/shaders/pulsing-border.js +211 -0
- package/dist/shaders/pulsing-border.js.map +7 -0
- package/dist/shaders/simplex-noise.d.ts +10 -12
- package/dist/shaders/simplex-noise.js +103 -0
- package/dist/shaders/simplex-noise.js.map +7 -0
- package/dist/shaders/smoke-ring.d.ts +11 -14
- package/dist/shaders/smoke-ring.js +124 -0
- package/dist/shaders/smoke-ring.js.map +7 -0
- package/dist/shaders/spiral.d.ts +16 -22
- package/dist/shaders/spiral.js +84 -0
- package/dist/shaders/spiral.js.map +7 -0
- package/dist/shaders/swirl.d.ts +15 -3
- package/dist/shaders/swirl.js +89 -0
- package/dist/shaders/swirl.js.map +7 -0
- package/dist/shaders/voronoi.d.ts +20 -20
- package/dist/shaders/voronoi.js +143 -0
- package/dist/shaders/voronoi.js.map +7 -0
- package/dist/shaders/warp.d.ts +15 -17
- package/dist/shaders/warp.js +108 -0
- package/dist/shaders/warp.js.map +7 -0
- package/dist/shaders/waves.d.ts +18 -21
- package/dist/shaders/waves.js +68 -0
- package/dist/shaders/waves.js.map +7 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +7 -0
- package/package.json +2 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shaders/dot-grid.ts"],
|
|
4
|
+
"sourcesContent": ["import { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareSimplexNoise } from '../shader-utils.js';\n\n/**\n * Static grid pattern\n *\n * Uniforms:\n * - u_colorBack, u_colorFill, u_colorStroke (vec4 RGBA)\n * - u_dotSize (px): base shape size\n * - u_sizeRange (0..1): randomizes the size of shape between 0 and u_dotSize\n * - u_strokeWidth (px): the stroke (to be added to u_dotSize)\n * - u_gapX, u_gapY (px): pattern spacing\n * - u_opacityRange (0..1): variety of shape opacity\n * - u_shape (float used as integer):\n * ---- 1: circle\n * ---- 2: square\n * ---- 3: triangle\n * ---- 4: diamond\n * ---- 5: cross\n *\n */\n\nexport const dotGridFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorFill;\nuniform vec4 u_colorStroke;\nuniform float u_dotSize;\nuniform float u_gapX;\nuniform float u_gapY;\nuniform float u_strokeWidth;\nuniform float u_sizeRange;\nuniform float u_opacityRange;\nuniform float u_shape;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareSimplexNoise}\n\nfloat polygon(vec2 p, float N, float rot) {\n float a = atan(p.x, p.y) + rot;\n float r = TWO_PI / float(N);\n\n return cos(floor(.5 + a / r) * r - a) * length(p);\n}\n\nvoid main() {\n\n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n\n vec2 grid = fract(shape_uv / vec2(u_gapX, u_gapY)) + 1e-4;\n vec2 grid_idx = floor(shape_uv / vec2(u_gapX, u_gapY));\n float sizeRandomizer = .5 + .8 * snoise(2. * vec2(grid_idx.x * 100., grid_idx.y));\n float opacity_randomizer = .5 + .7 * snoise(2. * vec2(grid_idx.y, grid_idx.x));\n\n vec2 center = vec2(0.5) - 1e-3;\n vec2 p = (grid - center) * vec2(u_gapX, u_gapY);\n\n float baseSize = u_dotSize * (1. - sizeRandomizer * u_sizeRange);\n float strokeWidth = u_strokeWidth * (1. - sizeRandomizer * u_sizeRange);\n\n float dist;\n if (u_shape < 0.5) {\n // Circle\n dist = length(p);\n } else if (u_shape < 1.5) {\n // Diamond\n strokeWidth *= 1.5;\n dist = polygon(1.5 * p, 4., .25 * PI);\n } else if (u_shape < 2.5) {\n // Square\n dist = polygon(1.03 * p, 4., 1e-3);\n } else {\n // Triangle\n strokeWidth *= 1.5;\n p = p * 2. - 1.;\n p *= .9;\n p.y = 1. - p.y;\n p.y -= .75 * baseSize;\n dist = polygon(p, 3., 1e-3);\n }\n\n float edgeWidth = fwidth(dist);\n float shapeOuter = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist - strokeWidth);\n float shapeInner = smoothstep(baseSize + edgeWidth, baseSize - edgeWidth, dist);\n float stroke = shapeOuter - shapeInner;\n\n float dotOpacity = max(0., 1. - opacity_randomizer * u_opacityRange);\n stroke *= dotOpacity;\n shapeInner *= dotOpacity;\n\n stroke *= u_colorStroke.a;\n shapeInner *= u_colorFill.a;\n\n vec3 color = vec3(0.);\n color += stroke * u_colorStroke.rgb;\n color += shapeInner * u_colorFill.rgb;\n color += (1. - shapeInner - stroke) * u_colorBack.rgb * u_colorBack.a;\n\n float opacity = 0.;\n opacity += stroke;\n opacity += shapeInner;\n opacity += (1. - opacity) * u_colorBack.a;\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotGridUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colorFill: [number, number, number, number];\n u_colorStroke: [number, number, number, number];\n u_dotSize: number;\n u_gapX: number;\n u_gapY: number;\n u_strokeWidth: number;\n u_sizeRange: number;\n u_opacityRange: number;\n u_shape: (typeof DotGridShapes)[DotGridShape];\n}\n\nexport interface DotGridParams extends ShaderSizingParams {\n colorBack?: string;\n colorFill?: string;\n colorStroke?: string;\n size?: number;\n gapX?: number;\n gapY?: number;\n strokeWidth?: number;\n sizeRange?: number;\n opacityRange?: number;\n shape?: DotGridShape;\n}\n\nexport const DotGridShapes = {\n circle: 0,\n diamond: 1,\n square: 2,\n triangle: 3,\n} as const;\n\nexport type DotGridShape = keyof typeof DotGridShapes;\n"],
|
|
5
|
+
"mappings": ";;;;;AAAA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,2BAA2B;AAqBxC,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc3C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkGd,MAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const dotOrbitMeta: {
|
|
5
5
|
readonly maxColorCount: 10;
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Animated dot pattern with dots orbiting around their grid positions
|
|
9
|
+
*
|
|
10
|
+
* Uniforms:
|
|
11
|
+
* - u_colorBack (RGBA)
|
|
12
|
+
* - u_colors (vec4[]), u_colorsCount (float used as integer)
|
|
13
|
+
* - u_stepsPerColor: discrete color steps between u_colors
|
|
14
|
+
* - u_size (0..1): dot radius (relative to cell size)
|
|
15
|
+
* - u_sizeRange (0..1): randomizes dot radius between 0 and u_size
|
|
16
|
+
* - u_spreading (0..1): max orbit distance of each dot around the cell center
|
|
11
17
|
*
|
|
12
|
-
* Uniforms include:
|
|
13
|
-
* - u_colors (vec4[]): Input RGBA colors
|
|
14
|
-
* - u_colorsCount (float): Number of active colors (`u_colors` length)
|
|
15
|
-
* - u_stepsPerColor (float): Discretization of the color transition
|
|
16
|
-
* - u_size (float, 0 .. 1): Base dot radius (relative to cell size)
|
|
17
|
-
* - u_sizeRange (float, 0 .. 1): Dot radius to vary between the cells
|
|
18
|
-
* - u_spreading (float, 0 .. 1): the distance each dot can move around the regular grid
|
|
19
18
|
*/
|
|
20
19
|
export declare const dotOrbitFragmentShader: string;
|
|
21
20
|
export interface DotOrbitUniforms extends ShaderSizingUniforms {
|
|
21
|
+
u_colorBack: [number, number, number, number];
|
|
22
22
|
u_colors: vec4[];
|
|
23
23
|
u_colorsCount: number;
|
|
24
24
|
u_size: number;
|
|
@@ -27,6 +27,7 @@ export interface DotOrbitUniforms extends ShaderSizingUniforms {
|
|
|
27
27
|
u_stepsPerColor: number;
|
|
28
28
|
}
|
|
29
29
|
export interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {
|
|
30
|
+
colorBack?: string;
|
|
30
31
|
colors?: string[];
|
|
31
32
|
size?: number;
|
|
32
33
|
sizeRange?: number;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
2
|
+
* Paper Shaders *
|
|
3
|
+
* https://github.com/paper-design/shaders *
|
|
4
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
|
+
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declarePI, declareRandom, declareRotate } from "../shader-utils.js";
|
|
8
|
+
const dotOrbitMeta = {
|
|
9
|
+
maxColorCount: 10
|
|
10
|
+
};
|
|
11
|
+
const dotOrbitFragmentShader = `#version 300 es
|
|
12
|
+
precision mediump float;
|
|
13
|
+
|
|
14
|
+
uniform float u_time;
|
|
15
|
+
|
|
16
|
+
uniform vec4 u_colorBack;
|
|
17
|
+
uniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];
|
|
18
|
+
uniform float u_colorsCount;
|
|
19
|
+
uniform float u_stepsPerColor;
|
|
20
|
+
uniform float u_size;
|
|
21
|
+
uniform float u_sizeRange;
|
|
22
|
+
uniform float u_spreading;
|
|
23
|
+
|
|
24
|
+
${sizingVariablesDeclaration}
|
|
25
|
+
|
|
26
|
+
out vec4 fragColor;
|
|
27
|
+
|
|
28
|
+
${declarePI}
|
|
29
|
+
${declareRandom}
|
|
30
|
+
${declareRotate}
|
|
31
|
+
|
|
32
|
+
vec2 random2(vec2 p) {
|
|
33
|
+
return vec2(random(p), random(200. * p));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
vec3 voronoiShape(vec2 uv, float time) {
|
|
37
|
+
vec2 i_uv = floor(uv);
|
|
38
|
+
vec2 f_uv = fract(uv);
|
|
39
|
+
|
|
40
|
+
float spreading = .25 * clamp(u_spreading, 0., 1.);
|
|
41
|
+
|
|
42
|
+
float minDist = 1.;
|
|
43
|
+
vec2 randomizer = vec2(0.);
|
|
44
|
+
for (int y = -1; y <= 1; y++) {
|
|
45
|
+
for (int x = -1; x <= 1; x++) {
|
|
46
|
+
vec2 tileOffset = vec2(float(x), float(y));
|
|
47
|
+
vec2 rand = random2(i_uv + tileOffset);
|
|
48
|
+
vec2 cellCenter = vec2(.5 + 1e-4);
|
|
49
|
+
cellCenter += spreading * cos(time + TWO_PI * rand);
|
|
50
|
+
cellCenter -= .5;
|
|
51
|
+
cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);
|
|
52
|
+
cellCenter += .5;
|
|
53
|
+
float dist = length(tileOffset + cellCenter - f_uv);
|
|
54
|
+
if (dist < minDist) {
|
|
55
|
+
minDist = dist;
|
|
56
|
+
randomizer = rand;
|
|
57
|
+
}
|
|
58
|
+
minDist = min(minDist, dist);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return vec3(minDist, randomizer);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void main() {
|
|
66
|
+
|
|
67
|
+
vec2 shape_uv = v_patternUV;
|
|
68
|
+
shape_uv += .5;
|
|
69
|
+
shape_uv *= .015;
|
|
70
|
+
|
|
71
|
+
float t = u_time;
|
|
72
|
+
|
|
73
|
+
vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;
|
|
74
|
+
|
|
75
|
+
float radius = .25 * clamp(u_size, 0., 1.) - .5 * clamp(u_sizeRange, 0., 1.) * voronoi[2];
|
|
76
|
+
float dist = voronoi[0];
|
|
77
|
+
float edgeWidth = fwidth(dist);
|
|
78
|
+
float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);
|
|
79
|
+
|
|
80
|
+
float shape = voronoi[1];
|
|
81
|
+
|
|
82
|
+
float mixer = shape * (u_colorsCount - 1.);
|
|
83
|
+
mixer = (shape - .5 / u_colorsCount) * u_colorsCount;
|
|
84
|
+
float steps = max(1., u_stepsPerColor);
|
|
85
|
+
|
|
86
|
+
vec4 gradient = u_colors[0];
|
|
87
|
+
gradient.rgb *= gradient.a;
|
|
88
|
+
for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {
|
|
89
|
+
if (i >= int(u_colorsCount)) break;
|
|
90
|
+
float localT = clamp(mixer - float(i - 1), 0.0, 1.0);
|
|
91
|
+
localT = round(localT * steps) / steps;
|
|
92
|
+
vec4 c = u_colors[i];
|
|
93
|
+
c.rgb *= c.a;
|
|
94
|
+
gradient = mix(gradient, c, localT);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {
|
|
98
|
+
float localT = mixer + 1.;
|
|
99
|
+
if (mixer > (u_colorsCount - 1.)) {
|
|
100
|
+
localT = mixer - (u_colorsCount - 1.);
|
|
101
|
+
}
|
|
102
|
+
localT = round(localT * steps) / steps;
|
|
103
|
+
vec4 cFst = u_colors[0];
|
|
104
|
+
cFst.rgb *= cFst.a;
|
|
105
|
+
vec4 cLast = u_colors[int(u_colorsCount - 1.)];
|
|
106
|
+
cLast.rgb *= cLast.a;
|
|
107
|
+
gradient = mix(cLast, cFst, localT);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
vec3 color = gradient.rgb * dots;
|
|
111
|
+
float opacity = gradient.a * dots;
|
|
112
|
+
|
|
113
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
114
|
+
color = color + bgColor * (1. - opacity);
|
|
115
|
+
opacity = opacity + u_colorBack.a * (1. - opacity);
|
|
116
|
+
|
|
117
|
+
fragColor = vec4(color, opacity);
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
export {
|
|
121
|
+
dotOrbitFragmentShader,
|
|
122
|
+
dotOrbitMeta
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=dot-orbit.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shaders/dot-orbit.ts"],
|
|
4
|
+
"sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareRandom, declareRotate } from '../shader-utils.js';\n\nexport const dotOrbitMeta = {\n maxColorCount: 10,\n} as const;\n\n/**\n * Animated dot pattern with dots orbiting around their grid positions\n *\n * Uniforms:\n * - u_colorBack (RGBA)\n * - u_colors (vec4[]), u_colorsCount (float used as integer)\n * - u_stepsPerColor: discrete color steps between u_colors\n * - u_size (0..1): dot radius (relative to cell size)\n * - u_sizeRange (0..1): randomizes dot radius between 0 and u_size\n * - u_spreading (0..1): max orbit distance of each dot around the cell center\n *\n */\n\nexport const dotOrbitFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colors[${dotOrbitMeta.maxColorCount}];\nuniform float u_colorsCount;\nuniform float u_stepsPerColor;\nuniform float u_size;\nuniform float u_sizeRange;\nuniform float u_spreading;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n\nvec2 random2(vec2 p) {\n return vec2(random(p), random(200. * p));\n}\n\nvec3 voronoiShape(vec2 uv, float time) {\n vec2 i_uv = floor(uv);\n vec2 f_uv = fract(uv);\n\n float spreading = .25 * clamp(u_spreading, 0., 1.);\n\n float minDist = 1.;\n vec2 randomizer = vec2(0.);\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 tileOffset = vec2(float(x), float(y));\n vec2 rand = random2(i_uv + tileOffset);\n vec2 cellCenter = vec2(.5 + 1e-4);\n cellCenter += spreading * cos(time + TWO_PI * rand);\n cellCenter -= .5;\n cellCenter = rotate(cellCenter, random(vec2(rand.x, rand.y)) + .1 * time);\n cellCenter += .5;\n float dist = length(tileOffset + cellCenter - f_uv);\n if (dist < minDist) {\n minDist = dist;\n randomizer = rand;\n }\n minDist = min(minDist, dist);\n }\n }\n\n return vec3(minDist, randomizer);\n}\n\nvoid main() {\n\n vec2 shape_uv = v_patternUV;\n shape_uv += .5;\n shape_uv *= .015;\n\n float t = u_time;\n\n vec3 voronoi = voronoiShape(shape_uv, t) + 1e-4;\n\n float radius = .25 * clamp(u_size, 0., 1.) - .5 * clamp(u_sizeRange, 0., 1.) * voronoi[2];\n float dist = voronoi[0];\n float edgeWidth = fwidth(dist);\n float dots = smoothstep(radius + edgeWidth, radius - edgeWidth, dist);\n\n float shape = voronoi[1];\n\n float mixer = shape * (u_colorsCount - 1.);\n mixer = (shape - .5 / u_colorsCount) * u_colorsCount;\n float steps = max(1., u_stepsPerColor);\n\n vec4 gradient = u_colors[0];\n gradient.rgb *= gradient.a;\n for (int i = 1; i < ${dotOrbitMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n float localT = clamp(mixer - float(i - 1), 0.0, 1.0);\n localT = round(localT * steps) / steps;\n vec4 c = u_colors[i];\n c.rgb *= c.a;\n gradient = mix(gradient, c, localT);\n }\n\n if ((mixer < 0.) || (mixer > (u_colorsCount - 1.))) {\n float localT = mixer + 1.;\n if (mixer > (u_colorsCount - 1.)) {\n localT = mixer - (u_colorsCount - 1.);\n }\n localT = round(localT * steps) / steps;\n vec4 cFst = u_colors[0];\n cFst.rgb *= cFst.a;\n vec4 cLast = u_colors[int(u_colorsCount - 1.)];\n cLast.rgb *= cLast.a;\n gradient = mix(cLast, cFst, localT);\n }\n\n vec3 color = gradient.rgb * dots;\n float opacity = gradient.a * dots;\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n color = color + bgColor * (1. - opacity);\n opacity = opacity + u_colorBack.a * (1. - opacity);\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface DotOrbitUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_size: number;\n u_sizeRange: number;\n u_spreading: number;\n u_stepsPerColor: number;\n}\n\nexport interface DotOrbitParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colors?: string[];\n size?: number;\n sizeRange?: number;\n spreading?: number;\n stepsPerColor?: number;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,qBAAqB;AAEjD,MAAM,eAAe;AAAA,EAC1B,eAAe;AACjB;AAeO,MAAM,yBAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMtB,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBA0DS,aAAa,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,44 +1,43 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const godRaysMeta: {
|
|
5
5
|
readonly maxColorCount: 5;
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* The artwork by Ksenia Kondrashova
|
|
10
|
-
* Renders a number of circular shapes with gooey effect applied
|
|
8
|
+
* Radial rays animated from center
|
|
11
9
|
*
|
|
12
|
-
* Uniforms
|
|
10
|
+
* Uniforms:
|
|
11
|
+
* - u_colorBack, u_colorBloom (RGBA)
|
|
12
|
+
* - u_colors (vec4[]), u_colorsCount (float used as integer)
|
|
13
|
+
* - u_density: frequency of sector shapes
|
|
14
|
+
* - u_intensity: rays visibility within sectors
|
|
15
|
+
* - u_spotty: density of spots on the ray (higher = more spots)
|
|
16
|
+
* - u_midSize, u_midIntensity: central shape over the rays
|
|
17
|
+
* - u_bloom (0..1): normal to additive blending mix
|
|
13
18
|
*
|
|
14
|
-
* - u_colorBack: background RGBA color
|
|
15
|
-
* - uColors (vec4[]): Input RGBA colors
|
|
16
|
-
* - u_frequency: the frequency of rays (the number of sectors)
|
|
17
|
-
* - u_spotty: the density of spots in the rings (higher = more spots)
|
|
18
|
-
* - u_midSize: the size of the central shape within the rings
|
|
19
|
-
* - u_midIntensity: the influence of the central shape on the rings
|
|
20
|
-
* - u_density (0 .. 1): the number of visible rays
|
|
21
|
-
* - u_blending (0 .. 1): normal / additive blending
|
|
22
19
|
*/
|
|
23
20
|
export declare const godRaysFragmentShader: string;
|
|
24
21
|
export interface GodRaysUniforms extends ShaderSizingUniforms {
|
|
25
22
|
u_colorBack: [number, number, number, number];
|
|
23
|
+
u_colorBloom: [number, number, number, number];
|
|
26
24
|
u_colors: vec4[];
|
|
27
25
|
u_colorsCount: number;
|
|
28
26
|
u_spotty: number;
|
|
29
27
|
u_midSize: number;
|
|
30
28
|
u_midIntensity: number;
|
|
31
|
-
u_frequency: number;
|
|
32
29
|
u_density: number;
|
|
33
|
-
|
|
30
|
+
u_intensity: number;
|
|
31
|
+
u_bloom: number;
|
|
34
32
|
}
|
|
35
33
|
export interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {
|
|
36
34
|
colorBack?: string;
|
|
35
|
+
colorBloom?: string;
|
|
37
36
|
colors?: string[];
|
|
38
37
|
spotty?: number;
|
|
39
38
|
midSize?: number;
|
|
40
39
|
midIntensity?: number;
|
|
41
|
-
frequency?: number;
|
|
42
40
|
density?: number;
|
|
43
|
-
|
|
41
|
+
intensity?: number;
|
|
42
|
+
bloom?: number;
|
|
44
43
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
2
|
+
* Paper Shaders *
|
|
3
|
+
* https://github.com/paper-design/shaders *
|
|
4
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
|
+
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declarePI, declareRandom, declareRotate, declareValueNoise, colorBandingFix } from "../shader-utils.js";
|
|
8
|
+
const godRaysMeta = {
|
|
9
|
+
maxColorCount: 5
|
|
10
|
+
};
|
|
11
|
+
const godRaysFragmentShader = `#version 300 es
|
|
12
|
+
precision mediump float;
|
|
13
|
+
|
|
14
|
+
uniform float u_time;
|
|
15
|
+
|
|
16
|
+
uniform vec4 u_colorBack;
|
|
17
|
+
uniform vec4 u_colorBloom;
|
|
18
|
+
uniform vec4 u_colors[${godRaysMeta.maxColorCount}];
|
|
19
|
+
uniform float u_colorsCount;
|
|
20
|
+
|
|
21
|
+
uniform float u_density;
|
|
22
|
+
uniform float u_spotty;
|
|
23
|
+
uniform float u_midSize;
|
|
24
|
+
uniform float u_midIntensity;
|
|
25
|
+
uniform float u_intensity;
|
|
26
|
+
uniform float u_bloom;
|
|
27
|
+
|
|
28
|
+
${sizingVariablesDeclaration}
|
|
29
|
+
|
|
30
|
+
out vec4 fragColor;
|
|
31
|
+
|
|
32
|
+
${declarePI}
|
|
33
|
+
${declareRandom}
|
|
34
|
+
${declareRotate}
|
|
35
|
+
${declareValueNoise}
|
|
36
|
+
|
|
37
|
+
float hash(float n) {
|
|
38
|
+
return fract(sin(n * 43758.5453123) * 43758.5453123);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
float raysShape(vec2 uv, float r, float freq, float intensity, float radius) {
|
|
42
|
+
float a = atan(uv.y, uv.x);
|
|
43
|
+
vec2 left = vec2(a * freq, r);
|
|
44
|
+
vec2 right = vec2(mod(a, TWO_PI) * freq, r);
|
|
45
|
+
float n_left = pow(valueNoise(left), intensity);
|
|
46
|
+
float n_right = pow(valueNoise(right), intensity);
|
|
47
|
+
float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));
|
|
48
|
+
return shape;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void main() {
|
|
52
|
+
vec2 shape_uv = v_objectUV;
|
|
53
|
+
|
|
54
|
+
float t = .2 * u_time;
|
|
55
|
+
|
|
56
|
+
float radius = length(shape_uv);
|
|
57
|
+
float spots = 5. * abs(u_spotty);
|
|
58
|
+
|
|
59
|
+
float intensity = 4. - 3. * clamp(u_intensity, 0., 1.);
|
|
60
|
+
|
|
61
|
+
float delta = 1. - smoothstep(0., 1., radius);
|
|
62
|
+
|
|
63
|
+
float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);
|
|
64
|
+
middleShape = pow(middleShape, 5.0);
|
|
65
|
+
|
|
66
|
+
vec3 accumColor = vec3(0.0);
|
|
67
|
+
float accumAlpha = 0.0;
|
|
68
|
+
|
|
69
|
+
for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {
|
|
70
|
+
if (i >= int(u_colorsCount)) break;
|
|
71
|
+
|
|
72
|
+
vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);
|
|
73
|
+
|
|
74
|
+
float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;
|
|
75
|
+
float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;
|
|
76
|
+
float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_density;
|
|
77
|
+
|
|
78
|
+
float ray = raysShape(rotatedUV, r1, 5.0 * f, intensity, radius);
|
|
79
|
+
ray *= raysShape(rotatedUV, r2, 4.0 * f, intensity, radius);
|
|
80
|
+
ray += (1. + 4. * ray) * middleShape;
|
|
81
|
+
ray = clamp(ray, 0.0, 1.0);
|
|
82
|
+
|
|
83
|
+
float srcAlpha = u_colors[i].a * ray;
|
|
84
|
+
vec3 srcColor = u_colors[i].rgb * srcAlpha;
|
|
85
|
+
|
|
86
|
+
vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;
|
|
87
|
+
float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;
|
|
88
|
+
|
|
89
|
+
vec3 addBlendColor = accumColor + srcColor;
|
|
90
|
+
float addBlendAlpha = accumAlpha + srcAlpha;
|
|
91
|
+
|
|
92
|
+
accumColor = mix(alphaBlendColor, addBlendColor, u_bloom);
|
|
93
|
+
accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_bloom);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
float overlayAlpha = u_colorBloom.a;
|
|
97
|
+
vec3 overlayColor = u_colorBloom.rgb * overlayAlpha;
|
|
98
|
+
|
|
99
|
+
vec3 colorWithOverlay = accumColor + accumAlpha * overlayColor;
|
|
100
|
+
accumColor = mix(accumColor, colorWithOverlay, u_bloom);
|
|
101
|
+
|
|
102
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
103
|
+
|
|
104
|
+
vec3 color = accumColor + (1. - accumAlpha) * bgColor;
|
|
105
|
+
float opacity = accumAlpha + (1. - accumAlpha) * u_colorBack.a;
|
|
106
|
+
color = clamp(color, 0., 1.);
|
|
107
|
+
opacity = clamp(opacity, 0., 1.);
|
|
108
|
+
|
|
109
|
+
${colorBandingFix}
|
|
110
|
+
|
|
111
|
+
fragColor = vec4(color, opacity);
|
|
112
|
+
}
|
|
113
|
+
`;
|
|
114
|
+
export {
|
|
115
|
+
godRaysFragmentShader,
|
|
116
|
+
godRaysMeta
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=god-rays.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shaders/god-rays.ts"],
|
|
4
|
+
"sourcesContent": ["import type { vec4 } from '../types.js';\nimport type { ShaderMotionParams } from '../shader-mount.js';\nimport { sizingVariablesDeclaration, type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';\nimport { declarePI, declareRandom, declareRotate, declareValueNoise, colorBandingFix } from '../shader-utils.js';\n\nexport const godRaysMeta = {\n maxColorCount: 5,\n} as const;\n\n/**\n * Radial rays animated from center\n *\n * Uniforms:\n * - u_colorBack, u_colorBloom (RGBA)\n * - u_colors (vec4[]), u_colorsCount (float used as integer)\n * - u_density: frequency of sector shapes\n * - u_intensity: rays visibility within sectors\n * - u_spotty: density of spots on the ray (higher = more spots)\n * - u_midSize, u_midIntensity: central shape over the rays\n * - u_bloom (0..1): normal to additive blending mix\n *\n */\n\nexport const godRaysFragmentShader: string = `#version 300 es\nprecision mediump float;\n\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorBloom;\nuniform vec4 u_colors[${godRaysMeta.maxColorCount}];\nuniform float u_colorsCount;\n\nuniform float u_density;\nuniform float u_spotty;\nuniform float u_midSize;\nuniform float u_midIntensity;\nuniform float u_intensity;\nuniform float u_bloom;\n\n${sizingVariablesDeclaration}\n\nout vec4 fragColor;\n\n${declarePI}\n${declareRandom}\n${declareRotate}\n${declareValueNoise}\n\nfloat hash(float n) {\n return fract(sin(n * 43758.5453123) * 43758.5453123);\n}\n\nfloat raysShape(vec2 uv, float r, float freq, float intensity, float radius) {\n float a = atan(uv.y, uv.x);\n vec2 left = vec2(a * freq, r);\n vec2 right = vec2(mod(a, TWO_PI) * freq, r);\n float n_left = pow(valueNoise(left), intensity);\n float n_right = pow(valueNoise(right), intensity);\n float shape = mix(n_right, n_left, smoothstep(-.15, .15, uv.x));\n return shape;\n}\n\nvoid main() {\n vec2 shape_uv = v_objectUV;\n\n float t = .2 * u_time;\n\n float radius = length(shape_uv);\n float spots = 5. * abs(u_spotty);\n\n float intensity = 4. - 3. * clamp(u_intensity, 0., 1.);\n\n float delta = 1. - smoothstep(0., 1., radius);\n\n float middleShape = pow(u_midIntensity, .3) * smoothstep(abs(u_midSize), 0.02 * abs(u_midSize), 3.0 * radius);\n middleShape = pow(middleShape, 5.0);\n\n vec3 accumColor = vec3(0.0);\n float accumAlpha = 0.0;\n\n for (int i = 0; i < ${godRaysMeta.maxColorCount}; i++) {\n if (i >= int(u_colorsCount)) break;\n\n vec2 rotatedUV = rotate(shape_uv, float(i) + 1.0);\n\n float r1 = radius * (1.0 + 0.4 * float(i)) - 3.0 * t;\n float r2 = 0.5 * radius * (1.0 + spots) - 2.0 * t;\n float f = mix(1.0, 3.0 + 0.5 * float(i), hash(float(i) + 10.0)) * u_density;\n\n float ray = raysShape(rotatedUV, r1, 5.0 * f, intensity, radius);\n ray *= raysShape(rotatedUV, r2, 4.0 * f, intensity, radius);\n ray += (1. + 4. * ray) * middleShape;\n ray = clamp(ray, 0.0, 1.0);\n\n float srcAlpha = u_colors[i].a * ray;\n vec3 srcColor = u_colors[i].rgb * srcAlpha;\n\n vec3 alphaBlendColor = accumColor + (1.0 - accumAlpha) * srcColor;\n float alphaBlendAlpha = accumAlpha + (1.0 - accumAlpha) * srcAlpha;\n\n vec3 addBlendColor = accumColor + srcColor;\n float addBlendAlpha = accumAlpha + srcAlpha;\n\n accumColor = mix(alphaBlendColor, addBlendColor, u_bloom);\n accumAlpha = mix(alphaBlendAlpha, addBlendAlpha, u_bloom);\n }\n\n float overlayAlpha = u_colorBloom.a;\n vec3 overlayColor = u_colorBloom.rgb * overlayAlpha;\n\n vec3 colorWithOverlay = accumColor + accumAlpha * overlayColor;\n accumColor = mix(accumColor, colorWithOverlay, u_bloom);\n\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n\n vec3 color = accumColor + (1. - accumAlpha) * bgColor;\n float opacity = accumAlpha + (1. - accumAlpha) * u_colorBack.a;\n color = clamp(color, 0., 1.);\n opacity = clamp(opacity, 0., 1.);\n\n ${colorBandingFix}\n\n fragColor = vec4(color, opacity);\n}\n`;\n\nexport interface GodRaysUniforms extends ShaderSizingUniforms {\n u_colorBack: [number, number, number, number];\n u_colorBloom: [number, number, number, number];\n u_colors: vec4[];\n u_colorsCount: number;\n u_spotty: number;\n u_midSize: number;\n u_midIntensity: number;\n u_density: number;\n u_intensity: number;\n u_bloom: number;\n}\n\nexport interface GodRaysParams extends ShaderSizingParams, ShaderMotionParams {\n colorBack?: string;\n colorBloom?: string;\n colors?: string[];\n spotty?: number;\n midSize?: number;\n midIntensity?: number;\n density?: number;\n intensity?: number;\n bloom?: number;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAEA,SAAS,kCAAsF;AAC/F,SAAS,WAAW,eAAe,eAAe,mBAAmB,uBAAuB;AAErF,MAAM,cAAc;AAAA,EACzB,eAAe;AACjB;AAgBO,MAAM,wBAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOrB,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAkCK,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwC7C,eAAe;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,14 +1,33 @@
|
|
|
1
|
-
import type { vec4 } from '../types';
|
|
2
|
-
import type { ShaderMotionParams } from '../shader-mount';
|
|
3
|
-
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing';
|
|
1
|
+
import type { vec4 } from '../types.js';
|
|
2
|
+
import type { ShaderMotionParams } from '../shader-mount.js';
|
|
3
|
+
import { type ShaderSizingParams, type ShaderSizingUniforms } from '../shader-sizing.js';
|
|
4
4
|
export declare const grainGradientMeta: {
|
|
5
5
|
readonly maxColorCount: 7;
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Multi-color gradient with noise & grain over animated abstract shapes
|
|
9
|
+
*
|
|
10
|
+
* Uniforms:
|
|
11
|
+
* - u_colorBack (RGBA)
|
|
12
|
+
* - u_colors (vec4[]), u_colorsCount (float used as integer)
|
|
13
|
+
* - u_softness (0..1): blur between color bands
|
|
14
|
+
* - u_intensity (0..1): distortion between color bands
|
|
15
|
+
* - u_noise (0..1): grainy noise independent of softness
|
|
16
|
+
* - u_shape (float used as integer):
|
|
17
|
+
* ---- 1: single sine wave
|
|
18
|
+
* ---- 2: dots pattern
|
|
19
|
+
* ---- 3: truchet pattern
|
|
20
|
+
* ---- 4: corners (2 rounded rectangles)
|
|
21
|
+
* ---- 5: ripple
|
|
22
|
+
* ---- 6: blob (metaballs)
|
|
23
|
+
* ---- 7: circle imitating 3d look
|
|
24
|
+
*
|
|
25
|
+
* Note: grains are calculated using gl_FragCoord & u_resolution, meaning grains don't react to scaling and fit
|
|
26
|
+
*
|
|
9
27
|
*/
|
|
10
28
|
export declare const grainGradientFragmentShader: string;
|
|
11
29
|
export interface GrainGradientUniforms extends ShaderSizingUniforms {
|
|
30
|
+
u_colorBack: [number, number, number, number];
|
|
12
31
|
u_colors: vec4[];
|
|
13
32
|
u_colorsCount: number;
|
|
14
33
|
u_softness: number;
|
|
@@ -17,6 +36,7 @@ export interface GrainGradientUniforms extends ShaderSizingUniforms {
|
|
|
17
36
|
u_shape: (typeof GrainGradientShapes)[GrainGradientShape];
|
|
18
37
|
}
|
|
19
38
|
export interface GrainGradientParams extends ShaderSizingParams, ShaderMotionParams {
|
|
39
|
+
colorBack?: string;
|
|
20
40
|
colors?: string[];
|
|
21
41
|
softness?: number;
|
|
22
42
|
intensity?: number;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
2
|
+
* Paper Shaders *
|
|
3
|
+
* https://github.com/paper-design/shaders *
|
|
4
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
|
+
|
|
6
|
+
import { sizingVariablesDeclaration } from "../shader-sizing.js";
|
|
7
|
+
import { declareSimplexNoise, declarePI, declareRandom, declareValueNoise, colorBandingFix } from "../shader-utils.js";
|
|
8
|
+
const grainGradientMeta = {
|
|
9
|
+
maxColorCount: 7
|
|
10
|
+
};
|
|
11
|
+
const grainGradientFragmentShader = `#version 300 es
|
|
12
|
+
precision mediump float;
|
|
13
|
+
|
|
14
|
+
uniform float u_time;
|
|
15
|
+
uniform vec2 u_resolution;
|
|
16
|
+
uniform float u_pixelRatio;
|
|
17
|
+
|
|
18
|
+
uniform vec4 u_colorBack;
|
|
19
|
+
uniform vec4 u_colors[${grainGradientMeta.maxColorCount}];
|
|
20
|
+
uniform float u_colorsCount;
|
|
21
|
+
uniform float u_softness;
|
|
22
|
+
uniform float u_intensity;
|
|
23
|
+
uniform float u_noise;
|
|
24
|
+
uniform float u_shape;
|
|
25
|
+
|
|
26
|
+
${sizingVariablesDeclaration}
|
|
27
|
+
|
|
28
|
+
out vec4 fragColor;
|
|
29
|
+
|
|
30
|
+
${declarePI}
|
|
31
|
+
${declareSimplexNoise}
|
|
32
|
+
${declareRandom}
|
|
33
|
+
${declareValueNoise}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
float rand(vec2 n) {
|
|
37
|
+
return fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);
|
|
38
|
+
}
|
|
39
|
+
float noise(vec2 n) {
|
|
40
|
+
const vec2 d = vec2(0.0, 1.0);
|
|
41
|
+
vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n));
|
|
42
|
+
return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
|
|
43
|
+
}
|
|
44
|
+
float fbm_4(vec2 n) {
|
|
45
|
+
float total = 0.0, amplitude = .2;
|
|
46
|
+
for (int i = 0; i < 4; i++) {
|
|
47
|
+
total += noise(n) * amplitude;
|
|
48
|
+
n += n;
|
|
49
|
+
amplitude *= 0.6;
|
|
50
|
+
}
|
|
51
|
+
return total;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
vec2 truchet(vec2 uv, float idx){
|
|
56
|
+
idx = fract(((idx - .5) * 2.));
|
|
57
|
+
if (idx > 0.75) {
|
|
58
|
+
uv = vec2(1.0) - uv;
|
|
59
|
+
} else if (idx > 0.5) {
|
|
60
|
+
uv = vec2(1.0 - uv.x, uv.y);
|
|
61
|
+
} else if (idx > 0.25) {
|
|
62
|
+
uv = 1.0 - vec2(1.0 - uv.x, uv.y);
|
|
63
|
+
}
|
|
64
|
+
return uv;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void main() {
|
|
68
|
+
|
|
69
|
+
float t = .1 * u_time;
|
|
70
|
+
|
|
71
|
+
vec2 grain_uv = (gl_FragCoord.xy - .5 * u_resolution) / u_pixelRatio;
|
|
72
|
+
vec2 shape_uv = v_objectUV;
|
|
73
|
+
if (u_shape < 3.5) {
|
|
74
|
+
shape_uv = v_patternUV * .005;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
float shape = 0.;
|
|
79
|
+
|
|
80
|
+
if (u_shape < 1.5) {
|
|
81
|
+
// Sine wave
|
|
82
|
+
|
|
83
|
+
float wave = cos(.5 * shape_uv.x - 2. * t) * sin(1.5 * shape_uv.x + t) * (.75 + .25 * cos(3. * t));
|
|
84
|
+
shape = 1. - smoothstep(-1., 1., shape_uv.y + wave);
|
|
85
|
+
|
|
86
|
+
} else if (u_shape < 2.5) {
|
|
87
|
+
// Grid (dots)
|
|
88
|
+
|
|
89
|
+
float stripeIdx = floor(2. * shape_uv.x / TWO_PI);
|
|
90
|
+
float rand = fract(sin(stripeIdx * 12.9898) * 43758.5453);
|
|
91
|
+
|
|
92
|
+
float speed = sign(rand - .5) * ceil(2. + rand);
|
|
93
|
+
shape = sin(shape_uv.x) * cos(shape_uv.y + speed * t);
|
|
94
|
+
shape = pow(shape, 4.);
|
|
95
|
+
|
|
96
|
+
} else if (u_shape < 3.5) {
|
|
97
|
+
// Truchet pattern
|
|
98
|
+
|
|
99
|
+
float n2 = valueNoise(shape_uv * .4 - 2.5 * t);
|
|
100
|
+
shape_uv.x += 10.;
|
|
101
|
+
shape_uv *= .6;
|
|
102
|
+
|
|
103
|
+
vec2 tile = truchet(fract(shape_uv), random(floor(shape_uv)));
|
|
104
|
+
|
|
105
|
+
float distance1 = length(tile);
|
|
106
|
+
float distance2 = length(tile - vec2(1.));
|
|
107
|
+
|
|
108
|
+
n2 -= .5;
|
|
109
|
+
n2 *= .1;
|
|
110
|
+
shape = smoothstep(.2, .55, distance1 + n2) * smoothstep(.8, .45, distance1 - n2);
|
|
111
|
+
shape += smoothstep(.2, .55, distance2 + n2) * smoothstep(.8, .45, distance2 - n2);
|
|
112
|
+
|
|
113
|
+
shape = pow(shape, 1.5);
|
|
114
|
+
|
|
115
|
+
} else if (u_shape < 4.5) {
|
|
116
|
+
// Corners
|
|
117
|
+
|
|
118
|
+
shape_uv *= .6;
|
|
119
|
+
vec2 outer = vec2(.5);
|
|
120
|
+
|
|
121
|
+
vec2 bl = smoothstep(vec2(0.), outer, shape_uv + vec2(.1 + .1 * sin(2. * t), .2 - .1 * sin(3. * t)));
|
|
122
|
+
vec2 tr = smoothstep(vec2(0.), outer, 1. - shape_uv);
|
|
123
|
+
shape = 1. - bl.x * bl.y * tr.x * tr.y;
|
|
124
|
+
|
|
125
|
+
shape_uv = -shape_uv;
|
|
126
|
+
bl = smoothstep(vec2(0.), outer, shape_uv + vec2(.1 + .1 * sin(2. * t), .2 - .1 * cos(3. * t)));
|
|
127
|
+
tr = smoothstep(vec2(0.), outer, 1. - shape_uv);
|
|
128
|
+
shape -= bl.x * bl.y * tr.x * tr.y;
|
|
129
|
+
|
|
130
|
+
shape = 1. - smoothstep(0., 1., shape);
|
|
131
|
+
|
|
132
|
+
} else if (u_shape < 5.5) {
|
|
133
|
+
// Ripple
|
|
134
|
+
|
|
135
|
+
shape_uv *= 2.;
|
|
136
|
+
float dist = length(.4 * shape_uv);
|
|
137
|
+
float waves = sin(pow(dist, 1.2) * 5. - 3. * t) * .5 + .5;
|
|
138
|
+
shape = waves;
|
|
139
|
+
|
|
140
|
+
} else if (u_shape < 6.5) {
|
|
141
|
+
// Blob
|
|
142
|
+
|
|
143
|
+
t *= 2.;
|
|
144
|
+
|
|
145
|
+
vec2 f1_traj = .25 * vec2(1.3 * sin(t), .2 + 1.3 * cos(.6 * t + 4.));
|
|
146
|
+
vec2 f2_traj = .2 * vec2(1.2 * sin(-t), 1.3 * sin(1.6 * t));
|
|
147
|
+
vec2 f3_traj = .25 * vec2(1.7 * cos(-.6 * t), cos(-1.6 * t));
|
|
148
|
+
vec2 f4_traj = .3 * vec2(1.4 * cos(.8 * t), 1.2 * sin(-.6 * t - 3.));
|
|
149
|
+
|
|
150
|
+
shape = .5 * pow(1. - clamp(0., 1., length(shape_uv + f1_traj)), 5.);
|
|
151
|
+
shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f2_traj)), 5.);
|
|
152
|
+
shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f3_traj)), 5.);
|
|
153
|
+
shape += .5 * pow(1. - clamp(0., 1., length(shape_uv + f4_traj)), 5.);
|
|
154
|
+
|
|
155
|
+
shape = smoothstep(.0, .9, shape);
|
|
156
|
+
float edge = smoothstep(.25, .3, shape);
|
|
157
|
+
shape = mix(.0, shape, edge);
|
|
158
|
+
|
|
159
|
+
} else {
|
|
160
|
+
// Sphere
|
|
161
|
+
|
|
162
|
+
shape_uv *= 2.;
|
|
163
|
+
float d = length(shape_uv);
|
|
164
|
+
float z = sqrt(1.0 - clamp(pow(d, 2.0), 0.0, 1.0));
|
|
165
|
+
vec3 pos = vec3(shape_uv, z);
|
|
166
|
+
vec3 lightPos = normalize(vec3(cos(3. * t), 0.8, sin(2.5 * t)));
|
|
167
|
+
float lighting = dot(lightPos, pos);
|
|
168
|
+
float edge = smoothstep(1., .97, d);
|
|
169
|
+
shape = mix(.1, .5 + .5 * lighting, edge);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
float snoise05 = snoise(grain_uv * .5);
|
|
173
|
+
float grainDist = snoise(grain_uv * .2) * snoise05 - fbm_4(.002 * grain_uv + 10.) - fbm_4(.003 * grain_uv);
|
|
174
|
+
float noise = clamp(.6 * snoise05 - fbm_4(.4 * grain_uv) - fbm_4(.001 * grain_uv), 0., 1.);
|
|
175
|
+
|
|
176
|
+
shape += u_intensity * 2. / u_colorsCount * (grainDist + .5);
|
|
177
|
+
shape += u_noise * 10. / u_colorsCount * noise;
|
|
178
|
+
|
|
179
|
+
float edge_w = fwidth(shape);
|
|
180
|
+
|
|
181
|
+
float mixer = shape * (u_colorsCount + 1.) / u_colorsCount;
|
|
182
|
+
vec4 gradient = u_colors[0];
|
|
183
|
+
gradient.rgb *= gradient.a;
|
|
184
|
+
|
|
185
|
+
for (int i = 1; i < ${grainGradientMeta.maxColorCount}; i++) {
|
|
186
|
+
if (i > int(u_colorsCount) - 1) break;
|
|
187
|
+
|
|
188
|
+
vec2 borders = vec2(float(i + 1) - u_softness - edge_w, float(i + 1) + u_softness + edge_w) / u_colorsCount;
|
|
189
|
+
float localT = smoothstep(borders[0], borders[1], mixer);
|
|
190
|
+
vec4 c = u_colors[i];
|
|
191
|
+
c.rgb *= c.a;
|
|
192
|
+
gradient = mix(gradient, c, localT);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
vec2 borders = vec2(2. / (u_colorsCount - 1.));
|
|
196
|
+
borders = vec2(borders[0] - u_softness - edge_w, borders[1] + u_softness + edge_w) / u_colorsCount;
|
|
197
|
+
borders[0] = max(0., borders[0]);
|
|
198
|
+
float gradientShape = smoothstep(borders[0], borders[1], mixer);
|
|
199
|
+
|
|
200
|
+
vec3 color = gradient.rgb * gradientShape;
|
|
201
|
+
float opacity = gradient.a * gradientShape;
|
|
202
|
+
|
|
203
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
204
|
+
color = color + bgColor * (1.0 - opacity);
|
|
205
|
+
opacity = opacity + u_colorBack.a * (1.0 - opacity);
|
|
206
|
+
|
|
207
|
+
${colorBandingFix}
|
|
208
|
+
|
|
209
|
+
fragColor = vec4(color, opacity);
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
212
|
+
const GrainGradientShapes = {
|
|
213
|
+
wave: 1,
|
|
214
|
+
dots: 2,
|
|
215
|
+
truchet: 3,
|
|
216
|
+
corners: 4,
|
|
217
|
+
ripple: 5,
|
|
218
|
+
blob: 6,
|
|
219
|
+
sphere: 7
|
|
220
|
+
};
|
|
221
|
+
export {
|
|
222
|
+
GrainGradientShapes,
|
|
223
|
+
grainGradientFragmentShader,
|
|
224
|
+
grainGradientMeta
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=grain-gradient.js.map
|