[{"content":"我的Niri合成器动画配置分享 为什么不用默认动画？ 默认看起来很生硬，正好最近在折腾Ghostty的glsl， 同时又发现niri支持自定义动画，用的也是glsl，于是一拍即合\nConfig展示 vi .config/niri/config.kdl # 或者vim，nvim，nano，都是可以的 将下面的代码块插入animations {}\n//窗口打开的动画，小锂这里的配置是从屏幕顶部下落且伴有回弹效果 window-open { spring damping-ratio=0.6 stiffness=600 epsilon=0.001 custom-shader r\u0026#34; 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 \u0026lt; 0.0 || coords_geo.y \u0026gt; 1.0 || coords_geo.x \u0026lt; 0.0 || coords_geo.x \u0026gt; 1.0) { color = vec4(0.0); } return color * niri_clamped_progress; } \u0026#34; } //窗口关闭的动画，小锂这里的配置是先溶解后下落 window-close { duration-ms 1000 curve \u0026#34;linear\u0026#34; custom-shader r\u0026#34; 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 \u0026lt; (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 \u0026lt; 0.0 || moved_coords.y \u0026gt; 1.0 || moved_coords.x \u0026lt; 0.0 || moved_coords.x \u0026gt; 1.0) { return vec4(0.0); } return color * (1.0 - p); } \u0026#34; } //窗口大小发生变化的动画 window-resize { spring damping-ratio=0.7 stiffness=800 epsilon=0.0001 custom-shader r\u0026#34; 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; } \u0026#34; } //窗口位置发生变动的动画 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 } ","date":"2026-04-04T14:26:22+08:00","permalink":"http://localhost:1313/p/niri-custom-animations/","title":"Niri自定义动画"},{"content":"✨$Markdown$ 学习记录 1. 标题 一级标题 #一级标题 二级标题 ##二级标题 三级标题 ###三级标题 四级标题 ####四级标题 五级标题 #####五级标题 六级标题 ######六级标题 2. 特殊格式 斜体 *斜体* 斜体 _斜体_ 加粗 **加粗** 加粗斜体 ***加粗斜体*** 删除线 ~~删除线~~ 3. 列表 无序列表1 - 无序列表1 无序列表2 - 无序列表2 子项 - 子项 有序列表1 1. 有序列表1 有序列表2 2. 有序列表2 子项 1. 子项 4. 链接\u0026amp;图片 链接文字 [链接文字](blog.li2co3.fun) ![图片说明](https://blog.li2co3.icu/%E5%85%B3%E4%BA%8Eabout/Skill_Icons/c.png) 这里应该有一个C的图片\n\u0026lt;img src=\u0026quot;https://blog.li2co3.icu/%E5%85%B3%E4%BA%8Eabout/Skill_Icons/py.png\u0026quot; width=\u0026quot;200\u0026quot;\u0026gt;\n这里应该有一个Python的图片\n5. 引用 引用文本 \u0026gt;引用文本\n嵌套引用 \u0026gt;\u0026gt;嵌套引用\n引用可以无限嵌套\n6. Code 行内代码示例 行内代码 `行内代码` 多行代码 print(\u0026#34;Hello markdown!\u0026#34;) 以下是源码 \\``` print(\u0026#34;Hello markdown!\u0026#34;) 多行代码带语言高亮版本 print(\u0026#34;Hello markdown!\u0026#34;) 以下是源码 \\```python print(\u0026#34;Hello markdown!\u0026#34;) fn main() { println!(\u0026#34;Hello markdown!\u0026#34;) } 7. 分割线 --- 8. 列表 username password keyword Li2CO3 password123 XiaoShi |username|password|keyword| |:------:|:------:|:-----:| |Li2CO3|password123|XiaoShi| 9. 脚注 hello markdown1 hello markdown[^markdown] [^markdown]:一种排版格式 10. 数学公式 $e^{i\\pi}+1=0$ $e^{i\\pi}+1=0$ $Li_2CO_3$ $Li_2CO_3$ 一种排版格式\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2025-09-22T12:21:22+08:00","image":"http://localhost:1313/p/markdown-%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/top_hu_a61b38187164bb52.jpg","permalink":"http://localhost:1313/p/markdown-%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/","title":"Markdown 学习记录"}]