我的Niri合成器动画配置分享
为什么不用默认动画?
默认看起来很生硬,正好最近在折腾Ghostty的glsl, 同时又发现niri支持自定义动画,用的也是glsl,于是一拍即合
Config展示
vi .config/niri/config.kdl
# 或者vim,nvim,nano,都是可以的
将下面的代码块插入animations {}
//窗口打开的动画,小锂这里的配置是从屏幕顶部下落且伴有回弹效果
window-open {
spring damping-ratio=0.6 stiffness=600 epsilon=0.001
custom-shader r"
vec4 open_color(vec3 coords_geo, vec3 size_geo) {
float p = niri_progress;
float y_offset = (1.0 - p) * 0.3;
vec3 moved_coords = vec3(coords_geo.x, coords_geo.y + y_offset, 1.0);
vec3 coords_tex = niri_geo_to_tex * moved_coords;
vec4 color = texture2D(niri_tex, coords_tex.st);
if (coords_geo.y < 0.0 || coords_geo.y > 1.0 || coords_geo.x < 0.0 || coords_geo.x > 1.0) {
color = vec4(0.0);
}
return color * niri_clamped_progress;
}
"
}
//窗口关闭的动画,小锂这里的配置是先溶解后下落
window-close {
duration-ms 1000
curve "linear"
custom-shader r"
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
vec4 close_color(vec3 coords_geo, vec3 size_geo) {
float p = niri_clamped_progress;
float noise = rand(coords_geo.xy * 30.0);
if (noise < (p * 1.5 - (1.0 - coords_geo.y) * 0.2)) {
return vec4(0.0);
}
//前20%的时间溶解,然后再下落
float drop_p = max(0.0, p - 0.2) / 0.8;
float gravity = pow(drop_p, 3.0) * 4.0;
float spread = (noise - 0.5) * gravity * 0.1;
vec3 moved_coords = vec3(coords_geo.x + spread, coords_geo.y - gravity, 1.0);
vec3 coords_tex = niri_geo_to_tex * moved_coords;
vec4 color = texture2D(niri_tex, coords_tex.st);
if (moved_coords.y < 0.0 || moved_coords.y > 1.0 || moved_coords.x < 0.0 || moved_coords.x > 1.0) {
return vec4(0.0);
}
return color * (1.0 - p);
}
"
}
//窗口大小发生变化的动画
window-resize {
spring damping-ratio=0.7 stiffness=800 epsilon=0.0001
custom-shader r"
vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {
vec3 coords_tex_next = niri_geo_to_tex_next * coords_curr_geo;
vec4 color = texture2D(niri_tex_next, coords_tex_next.st);
return color;
}
"
}
//窗口位置发生变动的动画
window-movement {
spring damping-ratio=0.7 stiffness=800 epsilon=0.00001
}
//视角平移的动画
horizontal-view-movement {
spring damping-ratio=1.0 stiffness=600 epsilon=0.00001
}
//工作区切换的动画
workspace-switch {
spring damping-ratio=0.7 stiffness=600 epsilon=0.0001
}