[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f39dgwpy5shhup":3},{"code":4,"message":5,"data":6,"timestamp":31},10000,"success",{"full_name":7,"position":8,"description":9,"language":10,"stars":11,"forks":12,"stars_gained":13,"age_days":14,"hn_threads":15,"one_liner":16,"summary_md":17,"topic":18,"github_topics":21,"license":27,"homepage":28,"updated_at":29,"history":30},"Hugo-Dz\u002Fspritefusion-sprite-normals",8,"A tool to generate normal maps from any sprite and animated sprite sheet.","Rust",660,48,115,5,[],"从像素精灵图和动画序列帧生成法线贴图，让 2D 美术能响应动态光照。","## 解决什么问题\n\n2D 精灵图只要有了法线贴图，就能被移动光源照亮，这是大多数像素风 2.5D 观感的来源。麻烦在于制作法线：要么美术逐帧手绘，要么用通用的图片转法线滤镜，后者会把像素边缘糊成渐变，结果和像素网格对不齐，于是很多小团队干脆放弃法线。这个项目从精灵图本身的轮廓和明暗推算出法线，保持原始像素分辨率和透明通道，并能为动画序列帧逐帧生成。\n\n## 有什么不同\n\n常见做法是引擎插件或通用图像转换工具。引擎侧插件方便，但把资产管线绑死在某个引擎上；通用法线滤镜把精灵图当照片处理，像素边界会被抹平。这个工具在原像素尺度上工作，把「轮廓体积」和「绘制明暗细节」拆成两个独立参数，动画输入会输出法线图集、同布局的彩色图集和一份帧信息 JSON，而不只是单张图。它同时提供 Rust CLI 和 WASM 模块，共用同一套生成器和动画解码，因此可以在构建脚本里批量跑，也可以在浏览器里跑。输入支持 GIF、APNG，并保留逐帧时长。\n\n## 适合谁\n\n做带动态光照的 2D 像素游戏的开发者，尤其是没有技术美术帮忙手绘法线的独立开发者和小工作室。它适合把法线生成作为批量步骤放进资产管线，例如对一个 PNG 目录一次性出图。需要精确手工控制每个面的人还是继续手绘；要处理高分辨率手绘或 3D 渲染图法线的团队不适合，因为它依据的是像素轮廓与明暗，而不是雕出来的几何。\n\n## 上手成本\n\nCLI 需要 Rust 1.85 或更新版本自行编译，也可以直接用在线版和 API。WASM 路线要装 `wasm32-unknown-unknown` target 和指定版本的 `wasm-bindgen` CLI。输入限制为 64 MiB、约 419 万像素，动画额外限制 256 帧，精灵图够用，大图集不行。README 自己点明了主要风险：法线是从颜色和形状估算的，画上去的高光可能被误当成表面起伏，法线贴图在引擎里必须关闭 sRGB 采样。项目是 MIT 协议，但诞生只有几天，参数默认值大概率还会调整。\n\n## 点评\n\n这是 2026 年 10 月下旬才创建的新项目，已经累计 658 star，并在 Rust 榜单上以日均约 120 star 的速度冲到第 8 位，属于短期爆发而非长期积累。定位很窄但确实有用，CLI 与 WASM 双形态对资产管线也合理，不过 README 没有任何证据说明它能处理「美术上正确的起伏」这个更难的问题。当前热度代表关注度，不代表成熟度：API、默认值和输出约定都可能变。如果已经在做带光照的像素游戏，可以先拿一个动画试跑；要进生产构建，建议再等一两个版本。",{"slug":19,"name":20},"media","多媒体与设计",[22,23,24,25,26],"gamedev","normal-map","normal-mapping","pixel-art","sprites","MIT","https:\u002F\u002Fwww.spritefusion.com\u002Fsprite-normals","2026-10-25T02:36:14Z",[],1792915308]