phaser/src/renderer/webgl/shaders/FXBokeh-frag.js

50 lines
1.7 KiB
JavaScript
Raw Normal View History

2023-02-16 15:04:37 +00:00
module.exports = [
'#define SHADER_NAME BOKEH_FS',
'precision mediump float;',
'#define ITERATIONS 100.0',
'#define ONEOVER_ITR 1.0 / ITERATIONS',
'#define PI 3.141596',
'#define GOLDEN_ANGLE 2.39996323',
'uniform sampler2D uMainSampler;',
'uniform vec2 resolution;',
'uniform float radius;',
'uniform float amount;',
'uniform float contrast;',
'uniform bool isTiltShift;',
'uniform float strength;',
'uniform vec2 blur;',
'varying vec2 outTexCoord;',
'vec2 Sample (in float theta, inout float r)',
'{',
' r += 1.0 / r;',
' return (r - 1.0) * vec2(cos(theta), sin(theta)) * 0.06;',
'}',
'vec3 Bokeh (sampler2D tex, vec2 uv, float radius)',
'{',
' vec3 acc = vec3(0.0);',
' vec3 div = vec3(0.0);',
' vec2 pixel = vec2(resolution.y / resolution.x, 1.0) * radius * .025;',
' float r = 1.0;',
' for (float j = 0.0; j < GOLDEN_ANGLE * ITERATIONS; j += GOLDEN_ANGLE)',
' {',
' vec3 col = texture2D(tex, uv + pixel * Sample(j, r)).xyz;',
' col = contrast > 0.0 ? col * col * (1.0 + contrast) : col;',
' vec3 bokeh = vec3(0.5) + pow(col, vec3(10.0)) * amount;',
' acc += col * bokeh;',
' div += bokeh;',
' }',
' return acc / div;',
'}',
'void main ()',
'{',
' float shift = 1.0;',
' if (isTiltShift)',
' {',
' vec2 uv = vec2(gl_FragCoord.xy / resolution + vec2(-0.5, -0.5)) * 2.0;',
' float centerStrength = 1.0;',
' shift = length(uv * blur * strength) * centerStrength;',
' }',
' gl_FragColor = vec4(Bokeh(uMainSampler, outTexCoord * vec2(1.0, 1.0), radius * shift), 0.0);',
'}',
].join('\n');