12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- /*
- BABYLON.JS Chromatic Aberration GLSL Shader
- Author: Olivier Guyot
- Separates very slightly R, G and B colors on the edges of the screen
- Inspired by Francois Tarlier & Martins Upitis
- */
- #ifdef GL_ES
- precision highp float;
- #endif
- // samplers
- uniform sampler2D textureSampler; // original color
- // uniforms
- uniform float chromatic_aberration;
- uniform float screen_width;
- uniform float screen_height;
- // varyings
- varying vec2 vUV;
- void main(void)
- {
- vec2 centered_screen_pos = vec2(vUV.x-0.5, vUV.y-0.5);
- float radius2 = centered_screen_pos.x*centered_screen_pos.x
- + centered_screen_pos.y*centered_screen_pos.y;
- float radius = sqrt(radius2);
- vec4 original = texture2D(textureSampler, vUV);
- if(chromatic_aberration > 0.0) {
- //index of refraction of each color channel, causing chromatic dispersion
- vec3 ref_indices = vec3(0.6, 0.3, 0.0);
- float ref_shiftX = chromatic_aberration * radius * 12.0 / screen_width;
- float ref_shiftY = chromatic_aberration * radius * 12.0 / screen_height;
- // shifts for red, green & blue
- vec2 ref_coords_r = vec2(vUV.x + ref_indices.r*ref_shiftX, vUV.y + ref_indices.r*ref_shiftY*0.5);
- vec2 ref_coords_g = vec2(vUV.x + ref_indices.g*ref_shiftX, vUV.y + ref_indices.g*ref_shiftY*0.5);
- vec2 ref_coords_b = vec2(vUV.x + ref_indices.b*ref_shiftX, vUV.y + ref_indices.b*ref_shiftY*0.5);
- original.r = texture2D(textureSampler, ref_coords_r).r;
- original.g = texture2D(textureSampler, ref_coords_g).g;
- original.b = texture2D(textureSampler, ref_coords_b).b;
- }
- gl_FragColor = original;
- }
|