Niri自定义动画

Niri动画有关的都会更新在这里

我的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
}
Licensed under CC BY-NC-SA 4.0
发表了2篇文章 · 总计1.80k字
使用 Hugo 构建 · 主题 Stack 由 Jimmy 设计
本博客已稳定运行