Chromatic Abberation
Adjustable chromatic abberation.
levels
determines the level of detail.
spread
determines the intensity of the effect.
Shader code
shader_type canvas_item;
uniform int levels = 3;
uniform float spread = 0.01;
vec3 chromatic_slice(float t){
vec3 res = vec3(1.0-t, 1.0 - abs(t - 1.0), t - 1.0);
return max(res, 0.0);
}
void fragment(){
vec3 sum;
COLOR.rgb = vec3(0);
vec2 offset = (UV - vec2(0.5))*vec2(1,-1);
for(int i = 0; i < levels; i++){
float t = 2.0*float(i)/float(levels-1); // range 0.0->2.0
vec3 slice = vec3(1.0-t, 1.0 - abs(t - 1.0), t - 1.0);
slice = max(slice, 0.0);
sum += slice;
vec2 slice_offset = (t-1.0)*spread*offset;
COLOR.rgb += slice * texture(SCREEN_TEXTURE, SCREEN_UV + slice_offset).rgb;
}
COLOR.rgb /= sum;
}
This shader is radial unlike the other chromatic abberation shader in the website: https://godotshaders.com/shader/chromatic-abberation-with-offset/
Has quite smooth results. But Level parameter is confusing, and the result has an unwanted green tint. For those willing to get rid of it, set the parameter to high values. But that would be inperformant.
You could also make the effect linear instead of radial by changing line 14 to something like
No, I meant the radialness gives better results compared to linear.
Wonderful shader! Thanks for sharing mate, great work. It seems pretty versatile, will try use it for getting hit effect and maybe some isometric depth of field. 🙂
Awesome shader! However, replace the line “vec3 sum;” with “vec3 sum = vec3(0);” to fix the visual bugs.