image-color-grading 1.0.0

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.
@@ -0,0 +1,527 @@
1
+ import * as shaders from './shaders';
2
+ import { buildProgram, createRenderTarget, createPaletteTexture, updatePaletteTexture, buildBlackPalette, buildContrastMatrix, buildSaturationMatrix, } from './utils';
3
+ /**
4
+ * 默认设置
5
+ */
6
+ export const defaultSettings = {
7
+ vibrance: 0,
8
+ saturation: 0,
9
+ temperature: 0,
10
+ tint: 0,
11
+ hue: 0,
12
+ brightness: 0,
13
+ exposure: 0,
14
+ contrast: 0,
15
+ blacks: 0,
16
+ whites: 0,
17
+ highlights: 0,
18
+ shadows: 0,
19
+ dehaze: 0,
20
+ bloom: 0,
21
+ glamour: 0,
22
+ clarity: 0,
23
+ sharpen: 0,
24
+ smooth: 0,
25
+ blur: 0,
26
+ vignette: 0,
27
+ grain: 0,
28
+ };
29
+ /**
30
+ * 图像调色处理器
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const processor = new ImageColorGrading();
35
+ * await processor.loadImage('path/to/image.jpg');
36
+ * processor.setSettings({ brightness: 20, contrast: 10 });
37
+ * processor.render();
38
+ * const dataUrl = processor.toDataURL();
39
+ * ```
40
+ */
41
+ export class ImageColorGrading {
42
+ /**
43
+ * 创建图像调色处理器
44
+ * @param canvas - 可选的 canvas 元素,不传则自动创建
45
+ */
46
+ constructor(canvas) {
47
+ this.resources = null;
48
+ this.settings = { ...defaultSettings };
49
+ this.imageLoaded = false;
50
+ this.canvas = canvas || document.createElement('canvas');
51
+ }
52
+ /**
53
+ * 获取 canvas 元素
54
+ */
55
+ getCanvas() {
56
+ return this.canvas;
57
+ }
58
+ /**
59
+ * 获取当前设置
60
+ */
61
+ getSettings() {
62
+ return { ...this.settings };
63
+ }
64
+ /**
65
+ * 设置调色参数
66
+ * @param newSettings - 部分或全部设置参数
67
+ */
68
+ setSettings(newSettings) {
69
+ this.settings = { ...this.settings, ...newSettings };
70
+ if (this.resources) {
71
+ this.render();
72
+ }
73
+ }
74
+ /**
75
+ * 重置所有设置为默认值
76
+ */
77
+ resetSettings() {
78
+ this.settings = { ...defaultSettings };
79
+ if (this.resources) {
80
+ this.render();
81
+ }
82
+ }
83
+ /**
84
+ * 从 URL 加载图像
85
+ * @param url - 图像 URL
86
+ * @returns Promise
87
+ */
88
+ loadImage(url) {
89
+ return new Promise((resolve, reject) => {
90
+ const image = new Image();
91
+ image.crossOrigin = 'anonymous';
92
+ image.onload = () => {
93
+ this.initFromImage(image);
94
+ resolve();
95
+ };
96
+ image.onerror = () => {
97
+ reject(new Error(`Failed to load image: ${url}`));
98
+ };
99
+ image.src = url;
100
+ });
101
+ }
102
+ /**
103
+ * 从 HTMLImageElement 加载图像
104
+ * @param image - 图像元素
105
+ */
106
+ loadFromImage(image) {
107
+ this.initFromImage(image);
108
+ }
109
+ /**
110
+ * 从 File 对象加载图像
111
+ * @param file - File 对象
112
+ * @returns Promise
113
+ */
114
+ loadFromFile(file) {
115
+ return new Promise((resolve, reject) => {
116
+ const url = URL.createObjectURL(file);
117
+ this.loadImage(url)
118
+ .then(() => {
119
+ URL.revokeObjectURL(url);
120
+ resolve();
121
+ })
122
+ .catch((err) => {
123
+ URL.revokeObjectURL(url);
124
+ reject(err);
125
+ });
126
+ });
127
+ }
128
+ /**
129
+ * 从 ImageData 加载图像
130
+ * @param imageData - ImageData 对象
131
+ */
132
+ loadFromImageData(imageData) {
133
+ const { width, height, data } = imageData;
134
+ this.canvas.width = width;
135
+ this.canvas.height = height;
136
+ const gl = this.getWebGLContext();
137
+ if (!gl)
138
+ throw new Error('WebGL not supported');
139
+ this.disposeResources();
140
+ gl.viewport(0, 0, width, height);
141
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
142
+ const sourceTexture = gl.createTexture();
143
+ if (!sourceTexture)
144
+ throw new Error('Failed to create texture');
145
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
146
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
147
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
148
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
149
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
150
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
151
+ this.initResources(gl, width, height, sourceTexture);
152
+ }
153
+ /**
154
+ * 渲染图像
155
+ */
156
+ render() {
157
+ if (!this.resources) {
158
+ console.warn('No image loaded');
159
+ return;
160
+ }
161
+ this.drawFrame(this.resources, this.settings);
162
+ }
163
+ /**
164
+ * 导出为 Data URL
165
+ * @param options - 导出选项
166
+ * @returns Data URL 字符串
167
+ */
168
+ toDataURL(options) {
169
+ const format = options?.format || 'image/png';
170
+ const quality = options?.quality;
171
+ return this.canvas.toDataURL(format, quality);
172
+ }
173
+ /**
174
+ * 导出为 Blob
175
+ * @param options - 导出选项
176
+ * @returns Promise<Blob>
177
+ */
178
+ toBlob(options) {
179
+ return new Promise((resolve, reject) => {
180
+ const format = options?.format || 'image/png';
181
+ const quality = options?.quality;
182
+ this.canvas.toBlob((blob) => {
183
+ if (blob) {
184
+ resolve(blob);
185
+ }
186
+ else {
187
+ reject(new Error('Failed to create blob'));
188
+ }
189
+ }, format, quality);
190
+ });
191
+ }
192
+ /**
193
+ * 获取 ImageData
194
+ * @returns ImageData
195
+ */
196
+ getImageData() {
197
+ const ctx = this.canvas.getContext('2d');
198
+ if (ctx) {
199
+ return ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
200
+ }
201
+ // 如果是 WebGL 上下文,需要通过 readPixels 读取
202
+ const gl = this.canvas.getContext('webgl');
203
+ if (gl) {
204
+ const pixels = new Uint8ClampedArray(this.canvas.width * this.canvas.height * 4);
205
+ gl.readPixels(0, 0, this.canvas.width, this.canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
206
+ return new ImageData(pixels, this.canvas.width, this.canvas.height);
207
+ }
208
+ throw new Error('Cannot get ImageData');
209
+ }
210
+ /**
211
+ * 获取图像尺寸
212
+ */
213
+ getSize() {
214
+ return {
215
+ width: this.canvas.width,
216
+ height: this.canvas.height,
217
+ };
218
+ }
219
+ /**
220
+ * 检查是否已加载图像
221
+ */
222
+ isLoaded() {
223
+ return this.imageLoaded;
224
+ }
225
+ /**
226
+ * 销毁资源
227
+ */
228
+ dispose() {
229
+ this.disposeResources();
230
+ this.imageLoaded = false;
231
+ }
232
+ // ===== 私有方法 =====
233
+ getWebGLContext() {
234
+ return this.canvas.getContext('webgl', {
235
+ antialias: true,
236
+ premultipliedAlpha: false,
237
+ preserveDrawingBuffer: true,
238
+ });
239
+ }
240
+ initFromImage(image) {
241
+ const width = image.naturalWidth || image.width;
242
+ const height = image.naturalHeight || image.height;
243
+ this.canvas.width = width;
244
+ this.canvas.height = height;
245
+ const gl = this.getWebGLContext();
246
+ if (!gl)
247
+ throw new Error('WebGL not supported');
248
+ this.disposeResources();
249
+ gl.disable(gl.DEPTH_TEST);
250
+ gl.viewport(0, 0, width, height);
251
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
252
+ const sourceTexture = gl.createTexture();
253
+ if (!sourceTexture)
254
+ throw new Error('Failed to create texture');
255
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
256
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
257
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
258
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
259
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
260
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
261
+ this.initResources(gl, width, height, sourceTexture);
262
+ }
263
+ initResources(gl, width, height, sourceTexture) {
264
+ const blackPalette = createPaletteTexture(gl, buildBlackPalette(0));
265
+ const positionBuffer = gl.createBuffer();
266
+ const texCoordBuffer = gl.createBuffer();
267
+ if (!positionBuffer || !texCoordBuffer) {
268
+ throw new Error('Failed to create buffers');
269
+ }
270
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
271
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);
272
+ gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
273
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), gl.STATIC_DRAW);
274
+ const programs = {
275
+ pass: buildProgram(gl, shaders.vertexSource, shaders.passFragment, ['uTexture']),
276
+ vibrance: buildProgram(gl, shaders.vertexSource, shaders.vibranceFragment, ['uTexture', 'uAmount']),
277
+ saturation: buildProgram(gl, shaders.vertexSource, shaders.saturationFragment, ['uTexture', 'uMatrix[0]']),
278
+ temperature: buildProgram(gl, shaders.vertexSource, shaders.temperatureFragment, ['uTexture', 'uAmount']),
279
+ tint: buildProgram(gl, shaders.vertexSource, shaders.tintFragment, ['uTexture', 'uAmount']),
280
+ hue: buildProgram(gl, shaders.vertexSource, shaders.hueFragment, ['uTexture', 'uRotation']),
281
+ brightness: buildProgram(gl, shaders.vertexSource, shaders.brightnessFragment, ['uTexture', 'uAmount']),
282
+ exposure: buildProgram(gl, shaders.vertexSource, shaders.exposureFragment, ['uTexture', 'uAmount']),
283
+ contrast: buildProgram(gl, shaders.vertexSource, shaders.contrastFragment, ['uTexture', 'uMatrix[0]']),
284
+ blacks: buildProgram(gl, shaders.blackVertexSource, shaders.blackPaletteFragment, [
285
+ 'uTexture',
286
+ 'uPaletteMap',
287
+ 'transform',
288
+ ]),
289
+ whites: buildProgram(gl, shaders.vertexSource, shaders.whitesFragment, ['uTexture', 'uAmount']),
290
+ highlights: buildProgram(gl, shaders.vertexSource, shaders.highlightsFragment, ['uTexture', 'uAmount']),
291
+ shadows: buildProgram(gl, shaders.vertexSource, shaders.shadowsFragment, ['uTexture', 'uAmount']),
292
+ dehaze: buildProgram(gl, shaders.vertexSource, shaders.dehazeFragment, ['uTexture', 'uAmount', 'uSize']),
293
+ bloom: buildProgram(gl, shaders.vertexSource, shaders.bloomFragment, ['uTexture', 'uAmount', 'uTexel', 'uThreshold']),
294
+ glamour: buildProgram(gl, shaders.vertexSource, shaders.glamourFragment, ['uTexture', 'uAmount', 'uTexel']),
295
+ clarity: buildProgram(gl, shaders.vertexSource, shaders.clarityFragment, ['uTexture', 'uAmount', 'uTexel']),
296
+ sharpen: buildProgram(gl, shaders.vertexSource, shaders.kernelFragment, ['uTexture', 'uTexel', 'uKernel[0]', 'uAmount']),
297
+ smooth: buildProgram(gl, shaders.vertexSource, shaders.kernelFragment, ['uTexture', 'uTexel', 'uKernel[0]', 'uAmount']),
298
+ blur: buildProgram(gl, shaders.vertexSource, shaders.blurFragment, ['uTexture', 'uSize']),
299
+ vignette: buildProgram(gl, shaders.vertexSource, shaders.vignetteFragment, ['uTexture', 'uAmount', 'uSize']),
300
+ grain: buildProgram(gl, shaders.vertexSource, shaders.grainFragment, ['uTexture', 'uResolution', 'uAmount', 'uTime']),
301
+ };
302
+ const targets = [
303
+ createRenderTarget(gl, width, height),
304
+ createRenderTarget(gl, width, height),
305
+ ];
306
+ this.resources = {
307
+ gl,
308
+ width,
309
+ height,
310
+ sourceTexture,
311
+ blackPalette,
312
+ quad: { positionBuffer, texCoordBuffer },
313
+ programs,
314
+ targets,
315
+ };
316
+ this.imageLoaded = true;
317
+ this.render();
318
+ }
319
+ disposeResources() {
320
+ if (!this.resources)
321
+ return;
322
+ const { gl, sourceTexture, blackPalette, quad, programs, targets } = this.resources;
323
+ gl.deleteTexture(sourceTexture);
324
+ gl.deleteTexture(blackPalette);
325
+ gl.deleteBuffer(quad.positionBuffer);
326
+ gl.deleteBuffer(quad.texCoordBuffer);
327
+ targets.forEach((target) => {
328
+ gl.deleteFramebuffer(target.framebuffer);
329
+ gl.deleteTexture(target.texture);
330
+ });
331
+ Object.values(programs).forEach((programInfo) => {
332
+ gl.deleteProgram(programInfo.program);
333
+ });
334
+ this.resources = null;
335
+ }
336
+ drawFrame(resources, settings) {
337
+ const { gl, width, height, sourceTexture, blackPalette, quad, programs, targets, } = resources;
338
+ gl.viewport(0, 0, width, height);
339
+ const texel = [1 / width, 1 / height];
340
+ let inputTexture = sourceTexture;
341
+ let pingIndex = 0;
342
+ const bindAttributes = (program) => {
343
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad.positionBuffer);
344
+ const positionAttrib = program.attribs.aPosition >= 0
345
+ ? program.attribs.aPosition
346
+ : program.attribs.apos;
347
+ if (positionAttrib >= 0) {
348
+ gl.enableVertexAttribArray(positionAttrib);
349
+ gl.vertexAttribPointer(positionAttrib, 2, gl.FLOAT, false, 0, 0);
350
+ }
351
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad.texCoordBuffer);
352
+ const texAttrib = program.attribs.aTexCoord >= 0
353
+ ? program.attribs.aTexCoord
354
+ : program.attribs.auv;
355
+ if (texAttrib >= 0) {
356
+ gl.enableVertexAttribArray(texAttrib);
357
+ gl.vertexAttribPointer(texAttrib, 2, gl.FLOAT, false, 0, 0);
358
+ }
359
+ };
360
+ const drawPass = (program, setupUniforms, output) => {
361
+ gl.useProgram(program.program);
362
+ bindAttributes(program);
363
+ gl.activeTexture(gl.TEXTURE0);
364
+ gl.bindTexture(gl.TEXTURE_2D, inputTexture);
365
+ const textureLoc = program.uniforms.uTexture;
366
+ if (textureLoc)
367
+ gl.uniform1i(textureLoc, 0);
368
+ setupUniforms();
369
+ gl.bindFramebuffer(gl.FRAMEBUFFER, output ? output.framebuffer : null);
370
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
371
+ inputTexture = output ? output.texture : inputTexture;
372
+ };
373
+ const swapTarget = () => {
374
+ const target = targets[pingIndex % 2];
375
+ pingIndex += 1;
376
+ return target;
377
+ };
378
+ // Vibrance
379
+ if (Math.abs(settings.vibrance) > 0.5) {
380
+ drawPass(programs.vibrance, () => {
381
+ gl.uniform1f(programs.vibrance.uniforms.uAmount, settings.vibrance / 100);
382
+ }, swapTarget());
383
+ }
384
+ // Saturation
385
+ if (Math.abs(settings.saturation) > 0.5) {
386
+ drawPass(programs.saturation, () => {
387
+ const matrix = buildSaturationMatrix(settings.saturation);
388
+ gl.uniform1fv(programs.saturation.uniforms['uMatrix[0]'], matrix);
389
+ }, swapTarget());
390
+ }
391
+ // Temperature
392
+ if (Math.abs(settings.temperature) > 0.5) {
393
+ drawPass(programs.temperature, () => {
394
+ gl.uniform1f(programs.temperature.uniforms.uAmount, settings.temperature / 500);
395
+ }, swapTarget());
396
+ }
397
+ // Tint
398
+ if (Math.abs(settings.tint) > 0.5) {
399
+ drawPass(programs.tint, () => {
400
+ gl.uniform1f(programs.tint.uniforms.uAmount, settings.tint / 500);
401
+ }, swapTarget());
402
+ }
403
+ // Hue
404
+ if (Math.abs(settings.hue) > 0.5) {
405
+ drawPass(programs.hue, () => {
406
+ gl.uniform1f(programs.hue.uniforms.uRotation, settings.hue / 200);
407
+ }, swapTarget());
408
+ }
409
+ // Brightness
410
+ drawPass(programs.brightness, () => {
411
+ gl.uniform1f(programs.brightness.uniforms.uAmount, settings.brightness / 200);
412
+ }, swapTarget());
413
+ // Exposure
414
+ if (Math.abs(settings.exposure) > 0.5) {
415
+ drawPass(programs.exposure, () => {
416
+ gl.uniform1f(programs.exposure.uniforms.uAmount, settings.exposure / 100);
417
+ }, swapTarget());
418
+ }
419
+ // Contrast
420
+ if (Math.abs(settings.contrast) > 0.5) {
421
+ drawPass(programs.contrast, () => {
422
+ const matrix = buildContrastMatrix(settings.contrast);
423
+ gl.uniform1fv(programs.contrast.uniforms['uMatrix[0]'], matrix);
424
+ }, swapTarget());
425
+ }
426
+ // Blacks
427
+ if (Math.abs(settings.blacks) > 0.5) {
428
+ updatePaletteTexture(gl, blackPalette, buildBlackPalette(settings.blacks));
429
+ drawPass(programs.blacks, () => {
430
+ gl.activeTexture(gl.TEXTURE1);
431
+ gl.bindTexture(gl.TEXTURE_2D, blackPalette);
432
+ gl.uniform1i(programs.blacks.uniforms.uPaletteMap, 1);
433
+ gl.uniform4f(programs.blacks.uniforms.transform, 1.0, 1.0, 0.0, 0.0);
434
+ gl.activeTexture(gl.TEXTURE0);
435
+ }, swapTarget());
436
+ }
437
+ // Whites
438
+ if (Math.abs(settings.whites) > 0.5) {
439
+ drawPass(programs.whites, () => {
440
+ gl.uniform1f(programs.whites.uniforms.uAmount, settings.whites / 400);
441
+ }, swapTarget());
442
+ }
443
+ // Highlights
444
+ if (Math.abs(settings.highlights) > 0.5) {
445
+ drawPass(programs.highlights, () => {
446
+ gl.uniform1f(programs.highlights.uniforms.uAmount, settings.highlights / 100);
447
+ }, swapTarget());
448
+ }
449
+ // Shadows
450
+ if (Math.abs(settings.shadows) > 0.5) {
451
+ drawPass(programs.shadows, () => {
452
+ gl.uniform1f(programs.shadows.uniforms.uAmount, settings.shadows / 100);
453
+ }, swapTarget());
454
+ }
455
+ // Dehaze
456
+ if (Math.abs(settings.dehaze) > 0.5) {
457
+ drawPass(programs.dehaze, () => {
458
+ gl.uniform1f(programs.dehaze.uniforms.uAmount, settings.dehaze / 100);
459
+ gl.uniform2f(programs.dehaze.uniforms.uSize, width, height);
460
+ }, swapTarget());
461
+ }
462
+ // Bloom
463
+ if (settings.bloom > 0.5) {
464
+ drawPass(programs.bloom, () => {
465
+ gl.uniform1f(programs.bloom.uniforms.uAmount, settings.bloom / 100);
466
+ gl.uniform2f(programs.bloom.uniforms.uTexel, texel[0], texel[1]);
467
+ gl.uniform1f(programs.bloom.uniforms.uThreshold, 0.5);
468
+ }, swapTarget());
469
+ }
470
+ // Glamour
471
+ if (settings.glamour > 0.5) {
472
+ drawPass(programs.glamour, () => {
473
+ gl.uniform1f(programs.glamour.uniforms.uAmount, settings.glamour / 100);
474
+ gl.uniform2f(programs.glamour.uniforms.uTexel, texel[0], texel[1]);
475
+ }, swapTarget());
476
+ }
477
+ // Clarity
478
+ if (Math.abs(settings.clarity) > 0.5) {
479
+ drawPass(programs.clarity, () => {
480
+ gl.uniform1f(programs.clarity.uniforms.uAmount, settings.clarity / 100);
481
+ gl.uniform2f(programs.clarity.uniforms.uTexel, texel[0], texel[1]);
482
+ }, swapTarget());
483
+ }
484
+ // Sharpen
485
+ if (settings.sharpen > 0.5) {
486
+ drawPass(programs.sharpen, () => {
487
+ gl.uniform2f(programs.sharpen.uniforms.uTexel, texel[0], texel[1]);
488
+ gl.uniform1f(programs.sharpen.uniforms.uAmount, settings.sharpen / 100);
489
+ gl.uniform1fv(programs.sharpen.uniforms['uKernel[0]'], new Float32Array([0, -1, 0, -1, 5, -1, 0, -1, 0]));
490
+ }, swapTarget());
491
+ }
492
+ // Smooth
493
+ if (settings.smooth > 0.5) {
494
+ drawPass(programs.smooth, () => {
495
+ gl.uniform2f(programs.smooth.uniforms.uTexel, texel[0], texel[1]);
496
+ gl.uniform1f(programs.smooth.uniforms.uAmount, settings.smooth / 100);
497
+ gl.uniform1fv(programs.smooth.uniforms['uKernel[0]'], new Float32Array([
498
+ 1 / 9, 1 / 9, 1 / 9,
499
+ 1 / 9, 1 / 9, 1 / 9,
500
+ 1 / 9, 1 / 9, 1 / 9,
501
+ ]));
502
+ }, swapTarget());
503
+ }
504
+ // Blur (horizontal + vertical)
505
+ const blurRadius = settings.blur;
506
+ drawPass(programs.blur, () => {
507
+ gl.uniform2f(programs.blur.uniforms.uSize, blurRadius / width, 0.0);
508
+ }, swapTarget());
509
+ drawPass(programs.blur, () => {
510
+ gl.uniform2f(programs.blur.uniforms.uSize, 0.0, blurRadius / height);
511
+ }, swapTarget());
512
+ // Vignette
513
+ drawPass(programs.vignette, () => {
514
+ gl.uniform1f(programs.vignette.uniforms.uAmount, settings.vignette / 100);
515
+ gl.uniform1f(programs.vignette.uniforms.uSize, 0.25);
516
+ }, swapTarget());
517
+ // Grain
518
+ drawPass(programs.grain, () => {
519
+ gl.uniform2f(programs.grain.uniforms.uResolution, width, height);
520
+ gl.uniform1f(programs.grain.uniforms.uAmount, settings.grain / 800);
521
+ gl.uniform1f(programs.grain.uniforms.uTime, 0);
522
+ }, swapTarget());
523
+ // Final pass to screen
524
+ drawPass(programs.pass, () => { }, null);
525
+ }
526
+ }
527
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * WebGL 着色器代码
3
+ */
4
+ export declare const vertexSource = "\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aTexCoord;\nvarying vec2 vUv;\nvoid main() {\n vUv = aTexCoord;\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}\n";
5
+ export declare const blackVertexSource = "\nprecision highp float;\nattribute vec2 apos;\nattribute vec2 auv;\nvarying vec2 uv;\nuniform vec4 transform;\nvoid main(void) {\n uv = auv;\n gl_Position = vec4(\n apos.x * transform.x + transform.z,\n apos.y * transform.y + transform.w,\n 0.0,\n 1.0\n );\n}\n";
6
+ export declare const passFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nvoid main() {\n gl_FragColor = texture2D(uTexture, vUv);\n}\n";
7
+ export declare const vibranceFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nvoid main() {\n vec4 col = texture2D(uTexture, vUv);\n vec3 color = col.rgb;\n float luminance = color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\n float mn = min(min(color.r, color.g), color.b);\n float mx = max(max(color.r, color.g), color.b);\n float sat = (1.0 - (mx - mn)) * (1.0 - mx) * luminance * 5.0;\n vec3 lightness = vec3((mn + mx) / 2.0);\n color = mix(color, mix(color, lightness, -uAmount), sat);\n gl_FragColor = vec4(\n mix(color, lightness, (1.0 - lightness) * (1.0 - uAmount) / 2.0 * abs(uAmount)),\n col.a\n );\n}\n";
8
+ export declare const saturationFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uMatrix[20];\nvoid main(void) {\n vec4 c = texture2D(uTexture, vUv);\n gl_FragColor.r = uMatrix[0] * c.r + uMatrix[1] * c.g + uMatrix[2] * c.b + uMatrix[3] * c.a + uMatrix[4];\n gl_FragColor.g = uMatrix[5] * c.r + uMatrix[6] * c.g + uMatrix[7] * c.b + uMatrix[8] * c.a + uMatrix[9];\n gl_FragColor.b = uMatrix[10] * c.r + uMatrix[11] * c.g + uMatrix[12] * c.b + uMatrix[13] * c.a + uMatrix[14];\n gl_FragColor.a = uMatrix[15] * c.r + uMatrix[16] * c.g + uMatrix[17] * c.b + uMatrix[18] * c.a + uMatrix[19];\n}\n";
9
+ export declare const temperatureFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nvoid main() {\n vec4 color = texture2D(uTexture, vUv);\n color.r = clamp(color.r + uAmount, 0.0, 1.0);\n color.b = clamp(color.b - uAmount, 0.0, 1.0);\n gl_FragColor = color;\n}\n";
10
+ export declare const tintFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nvoid main() {\n vec4 color = texture2D(uTexture, vUv);\n color.g = clamp(color.g + uAmount, 0.0, 1.0);\n gl_FragColor = color;\n}\n";
11
+ export declare const hueFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uRotation;\nvec3 rgb2hsv(vec3 c) {\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\nvec3 hsv2rgb(vec3 c) {\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\nvoid main() {\n lowp vec4 base = texture2D(uTexture, vUv);\n vec3 hsv = rgb2hsv(base.rgb);\n hsv.x = fract(hsv.x + uRotation);\n gl_FragColor = vec4(hsv2rgb(hsv), base.a);\n}\n";
12
+ export declare const brightnessFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nconst float PI = 3.1415926535897932384626433832795;\nvoid main() {\n vec4 color = texture2D(uTexture, vUv);\n if (uAmount >= 0.0) {\n color.r = color.r + uAmount * sin(color.r * PI);\n color.g = color.g + uAmount * sin(color.g * PI);\n color.b = color.b + uAmount * sin(color.b * PI);\n } else {\n color.r = (1.0 + uAmount) * color.r;\n color.g = (1.0 + uAmount) * color.g;\n color.b = (1.0 + uAmount) * color.b;\n }\n gl_FragColor = color;\n}\n";
13
+ export declare const exposureFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nconst float epsilon = 0.000001;\nconst float mx = 1.0 - epsilon;\nconst mat3 matRGBtoROMM = mat3(\n 0.5293459296226501, 0.3300727903842926, 0.14058130979537964,\n 0.09837432950735092, 0.8734610080718994, 0.028164653107523918,\n 0.01688321679830551, 0.11767247319221497, 0.8654443025588989\n);\nconst mat3 matROMMtoRGB = mat3(\n 2.0340757369995117, -0.727334201335907, -0.3067416846752167,\n -0.22881317138671875, 1.2317301034927368, -0.0029169507324695587,\n -0.008569774217903614, -0.1532866358757019, 1.1618564128875732\n);\nfloat ramp(in float t) {\n t *= 2.0;\n if (t >= 1.0) {\n t -= 1.0;\n t = log(0.5) / log(0.5 * (1.0 - t) + 0.9332 * t);\n }\n return clamp(t, 0.001, 10.0);\n}\nvec3 rgb2hsv(in vec3 c) {\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\nvec3 hsv2rgb(in vec3 c) {\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\nvec3 setHue(in vec3 res, in vec3 base) {\n vec3 hsv = rgb2hsv(base);\n vec3 res_hsv = rgb2hsv(res);\n return hsv2rgb(vec3(hsv.x, res_hsv.y, res_hsv.z));\n}\nvoid main() {\n lowp vec4 col = texture2D(uTexture, vUv);\n vec3 base = col.rgb * matRGBtoROMM;\n float a = abs(uAmount) * col.a + epsilon;\n float v = pow(2.0, a * 2.0 + 1.0) - 2.0;\n float m = mx - exp(-v);\n vec3 res = (uAmount > 0.0) ? (1.0 - exp(-v * base)) / m : log(1.0 - base * m) / -v;\n res = mix(base, res, min(a * 100.0, 1.0));\n res = setHue(res, base);\n res = pow(res, vec3(ramp(1.0 - (0.0 * col.a + 1.0) / 2.0)));\n res = res * matROMMtoRGB;\n gl_FragColor = vec4(res, col.a);\n}\n";
14
+ export declare const contrastFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uMatrix[20];\nvoid main(void) {\n vec4 c = texture2D(uTexture, vUv);\n gl_FragColor.r = uMatrix[0] * c.r + uMatrix[1] * c.g + uMatrix[2] * c.b + uMatrix[3] * c.a + uMatrix[4];\n gl_FragColor.g = uMatrix[5] * c.r + uMatrix[6] * c.g + uMatrix[7] * c.b + uMatrix[8] * c.a + uMatrix[9];\n gl_FragColor.b = uMatrix[10] * c.r + uMatrix[11] * c.g + uMatrix[12] * c.b + uMatrix[13] * c.a + uMatrix[14];\n gl_FragColor.a = uMatrix[15] * c.r + uMatrix[16] * c.g + uMatrix[17] * c.b + uMatrix[18] * c.a + uMatrix[19];\n}\n";
15
+ export declare const whitesFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nconst vec3 RGB2Y = vec3(0.2126, 0.7152, 0.0722);\nvoid main() {\n vec4 base = texture2D(uTexture, vUv.xy);\n vec3 color = base.rgb;\n float lum = dot(color, RGB2Y);\n float whiteMask = smoothstep(0.5, 1.0, lum);\n color += uAmount * whiteMask;\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), base.a);\n}\n";
16
+ export declare const blackPaletteFragment = "\nprecision highp float;\nvarying vec2 uv;\nuniform sampler2D uTexture;\nuniform sampler2D uPaletteMap;\nvoid main() {\n lowp vec4 base = texture2D(uTexture, uv.xy);\n float r = texture2D(uPaletteMap, vec2(base.r, 0.0)).r;\n float g = texture2D(uPaletteMap, vec2(base.g, 0.0)).g;\n float b = texture2D(uPaletteMap, vec2(base.b, 0.0)).b;\n gl_FragColor = vec4(r, g, b, base.a);\n}\n";
17
+ export declare const highlightsFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nconst float epsilon = 0.000001;\nconst float mx = 1.0 - epsilon;\nconst float PI = 3.1415926535897932384626433832795;\nconst mat3 matRGBtoROMM = mat3(\n 0.5293459296226501, 0.3300727903842926, 0.14058130979537964,\n 0.09837432950735092, 0.8734610080718994, 0.028164653107523918,\n 0.01688321679830551, 0.11767247319221497, 0.8654443025588989\n);\nconst mat3 matROMMtoRGB = mat3(\n 2.0340757369995117, -0.727334201335907, -0.3067416846752167,\n -0.22881317138671875, 1.2317301034927368, -0.0029169507324695587,\n -0.008569774217903614, -0.1532866358757019, 1.1618564128875732\n);\nfloat luma_romm(in vec3 color) {\n return dot(color, vec3(0.242655, 0.755158, 0.002187));\n}\nfloat luma(in vec3 color) {\n return dot(color, vec3(0.298839, 0.586811, 0.11435));\n}\nvec3 rgb2hsv(in vec3 c) {\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\nvec3 hsv2rgb(in vec3 c) {\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\nvec3 setHue(in vec3 res, in vec3 base) {\n vec3 hsv = rgb2hsv(base);\n vec3 res_hsv = rgb2hsv(res);\n return hsv2rgb(vec3(hsv.x, res_hsv.y, res_hsv.z));\n}\nfloat gaussian(in float x) {\n return 1.0 - exp(-PI * 2.0 * x * x);\n}\nvoid main() {\n lowp vec4 col = texture2D(uTexture, vUv);\n lowp vec3 map = col.rgb;\n vec3 base = col.rgb * matRGBtoROMM;\n float base_lum = luma(col.rgb);\n float map_lum = luma_romm(map * matRGBtoROMM);\n float exposure = mix(uAmount, 0.0, 1.0 - map_lum) * col.a;\n float a = abs(exposure) * col.a + epsilon;\n float v = pow(2.0, a + 1.0) - 2.0;\n float m = mx - exp(-v);\n vec3 res = (exposure > 0.0) ? (1.0 - exp(-v * base)) / m : log(1.0 - base * m) / -v;\n res = mix(base, res, min(a * 100.0, 1.0));\n res = setHue(res, base);\n res = res * matROMMtoRGB;\n gl_FragColor = vec4(res, col.a);\n}\n";
18
+ export declare const shadowsFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nconst float epsilon = 0.000001;\nconst float mx = 1.0 - epsilon;\nconst float PI = 3.1415926535897932384626433832795;\nconst mat3 matRGBtoROMM = mat3(\n 0.5293459296226501, 0.3300727903842926, 0.14058130979537964,\n 0.09837432950735092, 0.8734610080718994, 0.028164653107523918,\n 0.01688321679830551, 0.11767247319221497, 0.8654443025588989\n);\nconst mat3 matROMMtoRGB = mat3(\n 2.0340757369995117, -0.727334201335907, -0.3067416846752167,\n -0.22881317138671875, 1.2317301034927368, -0.0029169507324695587,\n -0.008569774217903614, -0.1532866358757019, 1.1618564128875732\n);\nfloat luma_romm(in vec3 color) {\n return dot(color, vec3(0.242655, 0.755158, 0.002187));\n}\nfloat luma(in vec3 color) {\n return dot(color, vec3(0.298839, 0.586811, 0.11435));\n}\nvec3 rgb2hsv(in vec3 c) {\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\nvec3 hsv2rgb(in vec3 c) {\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\nvec3 setHue(in vec3 res, in vec3 base) {\n vec3 hsv = rgb2hsv(base);\n vec3 res_hsv = rgb2hsv(res);\n return hsv2rgb(vec3(hsv.x, res_hsv.y, res_hsv.z));\n}\nfloat gaussian(in float x) {\n return 1.0 - exp(-PI * 2.0 * x * x);\n}\nvoid main() {\n lowp vec4 col = texture2D(uTexture, vUv);\n lowp vec3 map = col.rgb;\n vec3 base = col.rgb * matRGBtoROMM;\n float base_lum = luma(col.rgb);\n float map_lum = luma_romm(map * matRGBtoROMM);\n float exposure = mix(0.0, uAmount, 1.0 - map_lum) * col.a;\n float a = abs(exposure) * col.a + epsilon;\n float v = pow(2.0, a + 1.0) - 2.0;\n float m = mx - exp(-v);\n vec3 res = (exposure > 0.0) ? (1.0 - exp(-v * base)) / m : log(1.0 - base * m) / -v;\n res = mix(base, res, min(a * 100.0, 1.0));\n res = setHue(res, base);\n res = res * matROMMtoRGB;\n gl_FragColor = vec4(res, col.a);\n}\n";
19
+ export declare const dehazeFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nuniform vec2 uSize;\n\nfloat hazeMap(vec2 coord) {\n vec3 color = vec3(1.0);\n vec2 stepSize = vec2(1.0 / uSize.x, 1.0 / uSize.y);\n for (int i = -1; i <= 1; ++i) {\n for (int j = -1; j <= 1; ++j) {\n vec2 offset = vec2(float(i), float(j)) * stepSize;\n vec2 uv = clamp(coord + offset, 0.0, 1.0);\n vec3 sample = texture2D(uTexture, uv).rgb;\n color = min(color, sample);\n }\n }\n return min(color.r, min(color.g, color.b));\n}\n\nvoid main() {\n vec4 base = texture2D(uTexture, vUv);\n float haze = hazeMap(vUv);\n float transmission = 1.0 - 0.95 * haze;\n const float A = 0.95;\n const float t0 = 0.1;\n float t = mix(1.0, max(t0, transmission), uAmount);\n vec3 J = (base.rgb - A) / t + A;\n gl_FragColor = vec4(J, base.a);\n}\n";
20
+ export declare const bloomFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nuniform vec2 uTexel;\nuniform float uThreshold;\n\nvoid main() {\n vec4 sum = vec4(0.0);\n int j = -2;\n for (int i = -2; i <= 2; i++) sum += texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel);\n j = -1;\n for (int i = -2; i <= 2; i++) sum += texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel);\n j = 0;\n for (int i = -2; i <= 2; i++) sum += texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel);\n j = 1;\n for (int i = -2; i <= 2; i++) sum += texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel);\n j = 2;\n for (int i = -2; i <= 2; i++) sum += texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel);\n sum /= 25.0;\n vec4 base = texture2D(uTexture, vUv);\n if (length(sum.rgb) > uThreshold) {\n base += sum * uAmount;\n }\n gl_FragColor = base;\n}\n";
21
+ export declare const glamourFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nuniform vec2 uTexel;\n\nfloat normpdf(in float x, in float sigma) {\n return 0.39894 * exp(-0.5 * x * x / (sigma * sigma)) / sigma;\n}\n\nvec3 blurMap() {\n const int mSize = 11;\n const int kSize = (mSize - 1) / 2;\n float kernel[mSize];\n vec3 final_colour = vec3(0.0);\n float sigma = 7.0;\n float Z = 0.0;\n for (int j = 0; j <= kSize; ++j) {\n kernel[kSize + j] = kernel[kSize - j] = normpdf(float(j), sigma);\n }\n for (int j = 0; j < mSize; ++j) {\n Z += kernel[j];\n }\n for (int i = -kSize; i <= kSize; ++i) {\n for (int j = -kSize; j <= kSize; ++j) {\n final_colour += kernel[kSize + j] * kernel[kSize + i] *\n texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel).rgb;\n }\n }\n return vec3(final_colour / (Z * Z));\n}\n\nfloat luma(vec3 color) {\n return dot(color, vec3(0.299, 0.587, 0.114));\n}\n\nvoid main() {\n vec4 base = texture2D(uTexture, vUv);\n vec3 color = blurMap();\n color = vec3(luma(color));\n color = vec3(\n (base.r <= 0.5) ? (2.0 * base.r * color.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - color.r)),\n (base.g <= 0.5) ? (2.0 * base.g * color.g) : (1.0 - 2.0 * (1.0 - base.g) * (1.0 - color.g)),\n (base.b <= 0.5) ? (2.0 * base.b * color.b) : (1.0 - 2.0 * (1.0 - base.b) * (1.0 - color.b))\n );\n gl_FragColor = mix(base, vec4(color, base.a), uAmount);\n}\n";
22
+ export declare const clarityFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nuniform vec2 uTexel;\n\nfloat Lum(vec3 c) {\n return 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;\n}\nfloat BlendOverlayf(float base, float blend) {\n return (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)));\n}\nvec3 BlendOverlay(vec3 base, vec3 blend) {\n return vec3(BlendOverlayf(base.r, blend.r), BlendOverlayf(base.g, blend.g), BlendOverlayf(base.b, blend.b));\n}\nfloat BlendVividLightf(float base, float blend) {\n float BlendColorBurnf = (((2.0 * blend) == 0.0) ? (2.0 * blend) : max((1.0 - ((1.0 - base) / (2.0 * blend))), 0.0));\n float BlendColorDodgef = (((2.0 * (blend - 0.5)) == 1.0) ? (2.0 * (blend - 0.5)) : min(base / (1.0 - (2.0 * (blend - 0.5))), 1.0));\n return ((blend < 0.5) ? BlendColorBurnf : BlendColorDodgef);\n}\nvec3 BlendVividLight(vec3 base, vec3 blend) {\n return vec3(BlendVividLightf(base.r, blend.r), BlendVividLightf(base.g, blend.g), BlendVividLightf(base.b, blend.b));\n}\nfloat normpdf(in float x, in float sigma) {\n return 0.39894 * exp(-0.5 * x * x / (sigma * sigma)) / sigma;\n}\nvec3 blurMap() {\n const int mSize = 11;\n const int kSize = (mSize - 1) / 2;\n float kernel[mSize];\n vec3 final_colour = vec3(0.0);\n float sigma = 7.0;\n float Z = 0.0;\n for (int j = 0; j <= kSize; ++j) {\n kernel[kSize + j] = kernel[kSize - j] = normpdf(float(j), sigma);\n }\n for (int j = 0; j < mSize; ++j) {\n Z += kernel[j];\n }\n for (int i = -kSize; i <= kSize; ++i) {\n for (int j = -kSize; j <= kSize; ++j) {\n final_colour += kernel[kSize + j] * kernel[kSize + i] *\n texture2D(uTexture, vUv + vec2(float(i), float(j)) * uTexel).rgb;\n }\n }\n return vec3(final_colour / (Z * Z));\n}\nvoid main() {\n vec4 base4 = texture2D(uTexture, vUv);\n vec3 blur = blurMap();\n vec3 base = base4.rgb;\n float intensity = (uAmount < 0.0) ? (uAmount / 2.0) : uAmount;\n float lum = Lum(base);\n vec3 col = vec3(lum);\n vec3 mask = vec3(1.0 - pow(lum, 1.8));\n vec3 layer = vec3(1.0 - Lum(blur));\n vec3 detail = clamp(BlendVividLight(col, layer), 0.0, 1.0);\n vec3 inverse = mix(1.0 - detail, detail, (intensity + 1.0) / 2.0);\n gl_FragColor = vec4(BlendOverlay(base, mix(vec3(0.5), inverse, mask)), base4.a);\n}\n";
23
+ export declare const kernelFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uTexel;\nuniform float uKernel[9];\nuniform float uAmount;\nvoid main(void) {\n vec4 c11 = texture2D(uTexture, vUv - uTexel);\n vec4 c12 = texture2D(uTexture, vec2(vUv.x, vUv.y - uTexel.y));\n vec4 c13 = texture2D(uTexture, vec2(vUv.x + uTexel.x, vUv.y - uTexel.y));\n vec4 c21 = texture2D(uTexture, vec2(vUv.x - uTexel.x, vUv.y));\n vec4 c22 = texture2D(uTexture, vUv);\n vec4 c23 = texture2D(uTexture, vec2(vUv.x + uTexel.x, vUv.y));\n vec4 c31 = texture2D(uTexture, vec2(vUv.x - uTexel.x, vUv.y + uTexel.y));\n vec4 c32 = texture2D(uTexture, vec2(vUv.x, vUv.y + uTexel.y));\n vec4 c33 = texture2D(uTexture, vUv + uTexel);\n vec4 color = c11 * uKernel[0] + c12 * uKernel[1] + c13 * uKernel[2] +\n c21 * uKernel[3] + c22 * uKernel[4] + c23 * uKernel[5] +\n c31 * uKernel[6] + c32 * uKernel[7] + c33 * uKernel[8];\n gl_FragColor = color * uAmount + (c22 * (1.0 - uAmount));\n}\n";
24
+ export declare const blurFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform vec2 uSize;\nfloat random(vec3 scale, float seed) {\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\nvoid main() {\n vec4 color = vec4(0.0);\n float total = 0.0;\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n for (int t = -30; t <= 30; t++) {\n float percent = (float(t) + offset - 0.5) / 30.0;\n float weight = 1.0 - abs(percent);\n vec4 sample = texture2D(uTexture, vUv + uSize * percent);\n sample.rgb *= sample.a;\n color += sample * weight;\n total += weight;\n }\n gl_FragColor = color / total;\n gl_FragColor.rgb /= gl_FragColor.a + 0.00001;\n}\n";
25
+ export declare const vignetteFragment = "\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uAmount;\nuniform float uSize;\nvoid main() {\n vec4 color = texture2D(uTexture, vUv);\n float dist = distance(vUv, vec2(0.5, 0.5));\n float amt = clamp(uAmount, -1.0, 1.0);\n float edge = dist * (abs(amt) * 0.75 + uSize * 2.0);\n float vignette = smoothstep(0.8, uSize * 0.799, edge);\n if (amt < 0.0) {\n vignette = 1.0 + (1.0 - vignette) * (-amt);\n } else {\n vignette = mix(1.0, vignette, amt);\n }\n color.rgb *= vignette;\n gl_FragColor = color;\n}\n";
26
+ export declare const grainFragment = "\nprecision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vUv;\nuniform vec2 uResolution;\nuniform float uAmount;\nuniform float uTime;\nconst float permTexUnit = 1.0 / 256.0;\nconst float permTexUnitHalf = 0.5 / 256.0;\nfloat grainsize = 1.8;\nfloat lumamount = 1.0;\n\nvec4 rnm(in vec2 tc) {\n float noise = sin(dot(tc + vec2(uTime, uTime), vec2(12.9898, 78.233))) * 43758.5453;\n float noiseR = fract(noise) * 2.0 - 1.0;\n float noiseG = fract(noise * 1.2154) * 2.0 - 1.0;\n float noiseB = fract(noise * 1.3453) * 2.0 - 1.0;\n float noiseA = fract(noise * 1.3647) * 2.0 - 1.0;\n return vec4(noiseR, noiseG, noiseB, noiseA);\n}\nfloat fade(in float t) {\n return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\nfloat pnoise3D(in vec3 p) {\n vec3 pi = permTexUnit * floor(p) + permTexUnitHalf;\n vec3 pf = fract(p);\n float perm00 = rnm(pi.xy).a;\n vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;\n float n000 = dot(grad000, pf);\n vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;\n float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));\n float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a;\n vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;\n float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));\n vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;\n float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));\n float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a;\n vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;\n float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));\n vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;\n float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));\n float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a;\n vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;\n float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));\n vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;\n float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));\n vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));\n vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));\n float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));\n return n_xyz;\n}\nvec2 coordRot(in vec2 tc, in float angle) {\n float aspect = uResolution.x / uResolution.y;\n float rotX = ((tc.x * 2.0 - 1.0) * aspect * cos(angle)) - ((tc.y * 2.0 - 1.0) * sin(angle));\n float rotY = ((tc.y * 2.0 - 1.0) * cos(angle)) + ((tc.x * 2.0 - 1.0) * aspect * sin(angle));\n rotX = ((rotX / aspect) * 0.5 + 0.5);\n rotY = rotY * 0.5 + 0.5;\n return vec2(rotX, rotY);\n}\nvoid main() {\n vec3 rotOffset = vec3(1.425, 3.892, 5.835);\n vec2 rotCoordsR = coordRot(vUv, uTime + rotOffset.x);\n vec3 noise = vec3(pnoise3D(vec3(rotCoordsR * vec2(uResolution.x / grainsize, uResolution.y / grainsize), 0.0)));\n vec4 tex = texture2D(uTexture, vUv);\n vec3 col = tex.rgb;\n vec3 lumcoeff = vec3(0.299, 0.587, 0.114);\n float luminance = mix(0.0, dot(col, lumcoeff), lumamount);\n float lum = smoothstep(0.2, 0.0, luminance);\n lum += luminance;\n noise = mix(noise, vec3(0.0), pow(lum, 4.0));\n col = col + noise * uAmount;\n gl_FragColor = vec4(col, tex.a);\n}\n";
27
+ //# sourceMappingURL=shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.d.ts","sourceRoot":"","sources":["../src/shaders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,0LASxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,0RAe7B,CAAC;AAEF,eAAO,MAAM,YAAY,6IAOxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kpBAmB5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,imBAY9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,8RAW/B,CAAC;AAEF,eAAO,MAAM,YAAY,6OAUxB,CAAC;AAEF,eAAO,MAAM,WAAW,yzBAwBvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,2jBAmB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,m+DAwD5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,imBAY5B,CAAC;AAEF,eAAO,MAAM,cAAc,4ZAc1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,uYAYhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,2tEA6D9B,CAAC;AAEF,eAAO,MAAM,eAAe,2tEA6D3B,CAAC;AAEF,eAAO,MAAM,cAAc,02BA+B1B,CAAC;AAEF,eAAO,MAAM,aAAa,o5BA2BzB,CAAC;AAEF,eAAO,MAAM,eAAe,46CAgD3B,CAAC;AAEF,eAAO,MAAM,eAAe,qxEA6D3B,CAAC;AAEF,eAAO,MAAM,cAAc,29BAsB1B,CAAC;AAEF,eAAO,MAAM,YAAY,6sBAuBxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,sjBAoB5B,CAAC;AAEF,eAAO,MAAM,aAAa,4nGAyEzB,CAAC"}