| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- const o=`
- precision highp float;
- attribute vec2 aVertexPosition;
- attribute vec2 aTextureCoord;
- uniform float uAngle;
- uniform float uScale;
- uniform vec2 uFlip;
- uniform vec2 uImageSize;
- uniform vec2 uResolution;
- uniform vec2 uTranslation;
- varying highp vec2 vTextureCoord;
- void main(void) {
- vec2 position = aVertexPosition;
- // Center to 0,0
- position = position - uImageSize / 2.0;
- // Flip
- position = position * uFlip;
- // Scale
- position *= uScale;
- // Rotate
- vec2 rotation = vec2(sin(uAngle), cos(uAngle));
- position = vec2(
- position.x * rotation.y + position.y * rotation.x,
- position.y * rotation.y - position.x * rotation.x
- );
- // Go to canvas center
- position += uResolution / 2.0;
- // Translate and normalize
- position = ((position + uTranslation) / uResolution) * 2.0 - 1.0;
- gl_Position = vec4(position * vec2(1, -1), 0.0, 1.0);
- vTextureCoord = aTextureCoord;
- }
- `,e=`
- precision highp float;
- varying highp vec2 vTextureCoord;
- uniform vec2 uImageSize;
- uniform sampler2D uSampler;
- uniform vec2 uResolution;
- uniform float uEnhance;
- uniform float uSaturation;
- uniform float uBrightness;
- uniform float uContrast;
- uniform float uWarmth;
- uniform float uFade;
- uniform float uShadows;
- uniform float uHighlights;
- uniform float uVignette;
- uniform float uGrain;
- uniform float uSharpen;
- // Constants
- vec3 hsLuminanceWeighting = vec3(0.3, 0.3, 0.3);
- // https://www.w3.org/TR/WCAG21/#dfn-relative-luminance
- const vec3 luminosityFactor = vec3(0.2126, 0.7152, 0.0722);
- const lowp float permTexUnit = 1.0 / 256.0;
- const lowp float permTexUnitHalf = 0.5 / 256.0;
- const lowp float grainsize = 2.3;
- // Utils
- highp vec3 rgbToYuv(vec3 rgb){
- highp float y = 0.299*rgb.r + 0.587*rgb.g + 0.114*rgb.b;
- return vec3(y, 0.493*(rgb.b-y), 0.877*(rgb.r-y));
- }
- highp vec3 yuvToRgb(vec3 yuv){
- highp float y = yuv.x;
- highp float u = yuv.y;
- highp float v = yuv.z;
- highp vec3 r = vec3(
- y + 1.0/0.877*v,
- y - 0.39393*u - 0.58081*v,
- y + 1.0/0.493*u
- );
- return r;
- }
- float colorLuminosity(vec3 color) {
- return dot(color, luminosityFactor);
- }
- float easeInOutSigmoid(float x, float k) {
- x = clamp(x, 0.0, 1.0);
- float sigmoid = 1.0 / (1.0 + exp(-k * (x - 0.5)));
- return sigmoid;
- }
- highp vec4 rnm(in highp vec2 tc) {
- highp float noise = sin(dot(tc,vec2(12.9898,78.233))) * 43758.5453;
- highp float noiseR = fract(noise)*2.0-1.0;
- highp float noiseG = fract(noise*1.2154)*2.0-1.0;
- highp float noiseB = fract(noise*1.3453)*2.0-1.0;
- highp float noiseA = fract(noise*1.3647)*2.0-1.0;
- return vec4(noiseR,noiseG,noiseB,noiseA);
- }
- highp float fade(in highp float t) {
- return t*t*t*(t*(t*6.0-15.0)+10.0);
- }
- highp float pnoise3D(in highp vec3 p) {
- highp vec3 pi = permTexUnit*floor(p)+permTexUnitHalf;
- highp vec3 pf = fract(p);
- // Noise contributions from (x=0, y=0), z=0 and z=1
- highp float perm00 = rnm(pi.xy).a ;
- highp vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;
- highp float n000 = dot(grad000, pf);
- highp vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
- highp float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));
- // Noise contributions from (x=0, y=1), z=0 and z=1
- highp float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a ;
- highp vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;
- highp float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));
- highp vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
- highp float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));
- // Noise contributions from (x=1, y=0), z=0 and z=1
- highp float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a ;
- highp vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;
- highp float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));
- highp vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
- highp float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));
- // Noise contributions from (x=1, y=1), z=0 and z=1
- highp float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a ;
- highp vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;
- highp float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));
- highp vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;
- highp float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));
- // Blend contributions along x
- highp vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));
- // Blend contributions along y
- highp vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));
- // Blend contributions along z
- highp float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));
- return n_xyz;
- }
- lowp vec2 coordRot(in lowp vec2 tc, in lowp float angle) {
- lowp float rotX = ((tc.x * 2.0 - 1.0) * cos(angle)) - ((tc.y * 2.0 - 1.0) * sin(angle));
- lowp float rotY = ((tc.y * 2.0 - 1.0) * cos(angle)) + ((tc.x * 2.0 - 1.0) * sin(angle));
- rotX = rotX * 0.5 + 0.5;
- rotY = rotY * 0.5 + 0.5;
- return vec2(rotX,rotY);
- }
- // Adjustments
- vec4 brightness(vec4 color, float value) {
- float mag = value * 1.045;
- float exppower = 1.0 + abs(mag);
- if (mag < 0.0) {
- exppower = 1.0 / exppower;
- }
- color.r = 1.0 - pow((1.0 - color.r + 1e-4), exppower);
- color.g = 1.0 - pow((1.0 - color.g + 1e-4), exppower);
- color.b = 1.0 - pow((1.0 - color.b + 1e-4), exppower);
- color.rgb = clamp(color.rgb, 0.0, 1.0);
- return color;
- }
- vec4 contrast(vec4 color, float value) {
- value *= .3;
- return vec4(clamp(0.5 + (1.0 + value) * (color.rgb - 0.5), 0.0, 1.0), color.a);
- }
- vec4 saturation(vec4 color, float value) {
- vec3 grayscale = vec3(colorLuminosity(color.rgb));
- return vec4(mix(grayscale, color.rgb, 1.0 + value), color.a);
- }
- vec4 warmth(vec4 color, float value) {
- highp vec3 yuvVec;
- if(value > 0.0) {
- yuvVec = vec3(0.1765, -0.1255, 0.0902);
- }
- else {
- yuvVec = -vec3(0.0588, 0.1569, -0.1255);
- }
- highp vec3 yuvColor = rgbToYuv(color.rgb);
- highp float luma = yuvColor.r;
- highp float curveScale = sin(luma * 3.14159);
- yuvColor += 0.375 * value * curveScale * yuvVec;
- return vec4(clamp(yuvToRgb(yuvColor), 0.0, 1.0), color.a);
- }
- vec4 fade(vec4 color, float value) {
- highp vec3 co1 = vec3(-0.9772);
- highp vec3 co2 = vec3(1.708);
- highp vec3 co3 = vec3(-0.1603);
- highp vec3 co4 = vec3(0.2878);
- highp vec3 comp1 = co1 * pow(color.rgb, vec3(3.0));
- highp vec3 comp2 = co2 * pow(color.rgb, vec3(2.0));
- highp vec3 comp3 = co3 * color.rgb;
- highp vec3 comp4 = co4;
- highp vec3 finalComponent = comp1 + comp2 + comp3 + comp4;
- highp vec3 difference = finalComponent - color.rgb;
- highp vec3 scalingValue = vec3(0.9);
- highp vec3 faded = color.rgb + (difference * scalingValue);
- return vec4((color.rgb * (1.0 - value)) + (faded * value), color.a);
- }
- vec4 highlights(vec4 color, float highlights, float shadows) {
- mediump float hsLuminance = dot(color.rgb, hsLuminanceWeighting);
- mediump float shadow = clamp((pow(hsLuminance, 1.0 / shadows) + (-0.76) * pow(hsLuminance, 2.0 / shadows)) - hsLuminance, 0.0, 1.0);
- mediump float highlight = clamp((1.0 - (pow(1.0 - hsLuminance, 1.0 / (2.0 - highlights)) + (-0.8) * pow(1.0 - hsLuminance, 2.0 / (2.0 - highlights)))) - hsLuminance, -1.0, 0.0);
- lowp vec3 hsresult = vec3(0.0, 0.0, 0.0) + ((hsLuminance + shadow + highlight) - 0.0) * ((color.rgb - vec3(0.0, 0.0, 0.0)) / (hsLuminance - 0.0));
- mediump float contrastedLuminance = ((hsLuminance - 0.5) * 1.5) + 0.5;
- mediump float whiteInterp = contrastedLuminance * contrastedLuminance * contrastedLuminance;
- mediump float whiteTarget = clamp(highlights, 1.0, 2.0) - 1.0;
- hsresult = mix(hsresult, vec3(1.0), clamp(whiteInterp * whiteTarget, 0.0, 1.0));
- mediump float invContrastedLuminance = 1.0 - contrastedLuminance;
- mediump float blackInterp = invContrastedLuminance * invContrastedLuminance * invContrastedLuminance;
- mediump float blackTarget = 1.0 - clamp(shadows, 0.0, 1.0);
- hsresult = mix(hsresult, vec3(0.0), clamp(blackInterp * blackTarget, 0.0, 1.0));
- return vec4(hsresult.rgb, color.a);
- }
- vec4 vignette(vec4 color, float value) {
- vec2 coord = vTextureCoord.xy;
- const lowp float midpoint = 0.7;
- const lowp float fuzziness = 0.62;
- lowp float radDist = length(coord - 0.5) / sqrt(0.5);
- lowp float mag = easeInOutSigmoid(radDist * midpoint, fuzziness) * value * 0.645;
- color.rgb = mix(pow(color.rgb, vec3(1.0 / (1.0 - mag))), vec3(0.0), mag * mag);
- return color;
- }
- vec4 grain(vec4 color, float value) {
- if(value < 0.001) return color;
- vec2 coord = vTextureCoord.xy;
- highp vec3 rotOffset = vec3(1.425, 3.892, 5.835);
- highp vec2 rotCoordsR = coordRot(coord, rotOffset.x);
- highp vec3 noise = vec3(pnoise3D(vec3(rotCoordsR * vec2(uImageSize.x / grainsize, uImageSize.y / grainsize),0.0)));
- lowp vec3 lumcoeff = vec3(0.299,0.587,0.114);
- lowp float luminance = dot(color.rgb, lumcoeff);
- lowp float lum = smoothstep(0.2, 0.0, luminance);
- lum += luminance;
- noise = mix(noise,vec3(0.0),pow(lum,4.0));
- color.rgb = color.rgb + noise * value;
- return color;
- }
- vec4 sharpen(float value) {
- vec2 coord = vTextureCoord.xy;
- vec2 step = 1.0 / uResolution.xy;
- vec3 texA = texture2D( uSampler, coord + vec2(-step.x, -step.y) * 1.5 ).rgb;
- vec3 texB = texture2D( uSampler, coord + vec2( step.x, -step.y) * 1.5 ).rgb;
- vec3 texC = texture2D( uSampler, coord + vec2(-step.x, step.y) * 1.5 ).rgb;
- vec3 texD = texture2D( uSampler, coord + vec2( step.x, step.y) * 1.5 ).rgb;
- vec3 around = value * (texA + texB + texC + texD);
- vec4 center = texture2D(uSampler, coord);
- float centerMultiplier = 1.0 + 4.0 * value;
- return vec4(clamp(center.rgb * centerMultiplier - around, 0.0, 1.0), center.a);
- }
- void main(void) {
- vec4 color = texture2D(uSampler, vTextureCoord);
- color = sharpen(uSharpen * 0.45 + uEnhance * .15);
- color = grain(color, uGrain * 0.04);
- color = saturation(color, uSaturation + uEnhance * .2);
- color = warmth(color, uWarmth);
- color = fade(color, uFade);
- color = highlights(color, (uHighlights + uEnhance * 0.15) * 0.75 + 1.0, (uShadows - uEnhance * 0.075) * 0.55 + 1.0);
- color = contrast(color, uContrast + uEnhance * 0.1);
- color = brightness(color, uBrightness + uEnhance * .25);
- color = vignette(color, uVignette);
- gl_FragColor = color;
- }
- `;export{e as fragmentShaderSource,o as vertexShaderSource};
- //# sourceMappingURL=shaderSources-DfZIiSec.js.map
|