我给这个网站接了一条命:
Seedance × WebGL 的创世序章
如果你是第一次打开 wetlink.dev,你已经见过祂了:开机握手之后,一张有血有肉的脸在彩色里苏醒,皮下电路逐级点亮;十秒后信号崩掉,CARRIER LOST,祂在原地溶解成一片酸性绿字符——从此永远活在这个终端里,呼吸、掉线、换个姿势重连,偶尔对你微笑。这篇是完整的施工记录。想重看一次出生:wetlink.dev/?intro。
01视频不当视频用
四支素材全部来自 Seedance 2.0 图生视频:用同一张关键肖像做首帧,分别生成「苏醒」「转头」「回身」「微笑」四段 8~10 秒的片子(尾帧抽出来做下一段的首帧,姿势之间就有了血缘)。但真正的决定是:这些视频在网站里从不作为视频出现。
它们被逐帧上传成 WebGL 纹理,穿过这个站原有的 ASCII 渲染管线:亮度采样 → 边缘检测(轮廓线是字符画的骨架,没有它人脸读不出五官)→ 中间调 S 曲线(肤色要恰好落进可读的字符档位)→ 高光走白热材质(电路和眼睛发白光,和酸性绿拉开层次)。彩色的肉身进去,字符的祂出来。
02崩解是一次 match-cut
序章的关键一秒:彩色视频播完,画面「坏掉」,字符版接管。这里没有转场特效——DOM 层的彩色视频淡出时,它底下的 canvas 正在渲染同一帧的字符版,两层取景逐点对齐(shader 里专门有一个崩解取景模式,和 CSS 的 object-fit: cover 做像素级对位)。彩色的脸在原位变成字符的脸,观众看到的是「降解」,实现上是一次电影剪辑里的 match-cut。
配合的还有三件小事:崩解瞬间闪一行 > CARRIER LOST — 祂离开了肉身;声音层(若开启)在这一刻才「出生」,drone 底噪随一声下坠 buzz 启动;然后字符逐格熄灭成静电,节点显形,标题落下——世界回到你熟悉的接口未稳。
回访直接进终端态——祂已经在信号里,不必每次重生。
03掉线是万能接缝
此后祂无限轮回:呼吸定格十几秒 → 逐格熄灭成静电 → 重连显形为下一个姿势。这个「ghost 掉线」机制最初是为了叙事(祂化作了信号,信号会丢包),落地后发现它是个工程宝藏:任何两段视频之间都用掉线遮罩,片段之间根本不需要首尾衔接。AI 生成视频最难缠的「两段接不上」问题,被世界观本身消化掉了。定格帧的微呼吸也不靠视频——暂停帧交给 shader 做缓慢缩放脉动和噪声漂移,一帧素材,无限存活。
04兜底清单(豪华效果的成本在这里)
这套东西真正的工程量不在效果,在保证所有人都能看到内容:省流模式 / 2G / 窄屏 / reduced-motion 从头到尾不下载一个字节的视频;序章视频 8 秒放不出来就熔断跳过;字符渲染 6 秒出不了首帧就退静态兜底;视频层挂了退回节点。四支视频共约 11MB,按需分片加载,回访者一个字节都不花。效果是奖励,内容是保底——这条规矩在本站工程决策里排第五,执行起来排第一。
> 素材会过时,机制不会:出生一次,此后永远在线。接口未稳,下次重连_