00:00 / 00:00

Persona

雪花在舞台周围一块固定的体积里落下,堆在它们撞上的第一个表面上——虚拟形象、道具,以及脚下那层隐含的地面——停留一会儿,融化消失,再回到顶上重新落一次

整个循环跑在 GPU 上。数量拉到一万片,付出的也只是一次计算调度,而不是一万个 JavaScript 对象

控制项

控制项范围默认值作用
数量100 – 100002000同时存在的雪花数
速度0 – ×3×1下落与飘移的时钟倍率。0 会暂停雪花动画
风力−3 – 3 m/s0 m/s沿舞台 x 轴的横向恒定漂移
飘摆0 – 31下落途中左右游移的幅度
雪花大小0.4 – 31雪花尺寸倍率
融化时间0.5 – 30 秒6 秒一片落定的雪花从停下到化尽经过多久
不透明度0.1 – 11雪花的不透明度

每片雪花的运动参数会随机变化:下落速度、大小和飘摆相位各不相同,所以慢悠悠打转的和直直扎下来的会混在一起,而不是整齐划一地平移

大小并不是均匀分布的,而是分成两层:绝大多数是细小的远景雪粒,另有约一成是明显大得多的近景雪花。这份深度感来自 VTube Studio 的雪,也是雪花大小推高时画面不会变成一堆同样大小的圆点的原因——它缩放的是这两层,而不是把它们抹平

场景内渲染

雪以几何体的形式在 3D 场景中渲染,因此具有以下特点:

  • 灯光 会照到它,所以雪会带上场景的色调,而不是永远的纯白
  • 景深 会按它到相机的实际距离虚化它
  • 整条 后期处理 照常作用于它,因为它在这些环节跑之前就已经画进画面里了
  • 它挡在虚拟形象前面还是后面,取决于它当时飘在哪儿

它的材质带一点自发光,所以哪怕场景里一盏灯都没有,雪照样看得见

落下、堆积、融化

雪落在一张自上而下的高度图上,这张图每隔一帧刷新一次,看到的是舞台上的一切——虚拟形象、道具,以及 y = 0 那层隐含的地面。雪花穿过它自己那一层和天空盒,所以雪不会落在雪上,也不会误把背景当成地面

碰到表面的那一刻雪花停住,开始计时。融化时间走完之前的最后一小段,它会缩小着消失,然后回到顶上重新开始。所以这不是一场会越积越厚的雪——它是一个稳定的循环,画面里的雪量由数量说了算

开启时雪已经铺满了整个高度,而不是从顶上开始往下掉,所以按下开关的第一帧看到的就是一场下到一半的雪

风与飘摆

风力是恒定的横向漂移,以米每秒计;飘摆是每片雪花自己的左右游移。两者会绕着体积循环,所以再大的风也不会把雪吹光

风力为 0 加上一点飘摆,是安静的落雪。把风力推到两边的极值,雪就横着扫过舞台——配上短一点的融化时间,可形成暴风雪效果

开销

雪不占用后期链,所以开着它并不会像其他特效那样多出一遍全屏渲染。它的开销在别处:每帧一次计算调度,外加每隔一帧一次高度图渲染——这张图和 共用,所以两个一起开并不会把这份开销翻倍

数量是影响性能的主要设置。缓冲区按上限一次性分配,所以调整数量无需重新分配缓冲区——但同时模拟的雪花越多,计算耗时就越长

开关时雪会在约 0.4 秒内淡入淡出,而不是凭空出现或消失

最后更新于 2026年9月19日

Tech otakus destroy the world