雪花在舞台周围一块固定的体积里落下,堆在它们撞上的第一个表面上——虚拟形象、道具,以及脚下那层隐含的地面——停留一会儿,融化消失,再回到顶上重新落一次
整个循环跑在 GPU 上。数量拉到一万片,付出的也只是一次计算调度,而不是一万个 JavaScript 对象
控制项
| 控制项 | 范围 | 默认值 | 作用 |
|---|---|---|---|
| 数量 | 100 – 10000 | 2000 | 同时存在的雪花数 |
| 速度 | 0 – ×3 | ×1 | 下落与飘移的时钟倍率。0 会暂停雪花动画 |
| 风力 | −3 – 3 m/s | 0 m/s | 沿舞台 x 轴的横向恒定漂移 |
| 飘摆 | 0 – 3 | 1 | 下落途中左右游移的幅度 |
| 雪花大小 | 0.4 – 3 | 1 | 雪花尺寸倍率 |
| 融化时间 | 0.5 – 30 秒 | 6 秒 | 一片落定的雪花从停下到化尽经过多久 |
| 不透明度 | 0.1 – 1 | 1 | 雪花的不透明度 |
每片雪花的运动参数会随机变化:下落速度、大小和飘摆相位各不相同,所以慢悠悠打转的和直直扎下来的会混在一起,而不是整齐划一地平移
大小并不是均匀分布的,而是分成两层:绝大多数是细小的远景雪粒,另有约一成是明显大得多的近景雪花。这份深度感来自 VTube Studio 的雪,也是雪花大小推高时画面不会变成一堆同样大小的圆点的原因——它缩放的是这两层,而不是把它们抹平
场景内渲染
雪以几何体的形式在 3D 场景中渲染,因此具有以下特点:
- 灯光 会照到它,所以雪会带上场景的色调,而不是永远的纯白
- 景深 会按它到相机的实际距离虚化它
- 整条 后期处理 照常作用于它,因为它在这些环节跑之前就已经画进画面里了
- 它挡在虚拟形象前面还是后面,取决于它当时飘在哪儿
它的材质带一点自发光,所以哪怕场景里一盏灯都没有,雪照样看得见
落下、堆积、融化
雪落在一张自上而下的高度图上,这张图每隔一帧刷新一次,看到的是舞台上的一切——虚拟形象、道具,以及 y = 0 那层隐含的地面。雪花穿过它自己那一层和天空盒,所以雪不会落在雪上,也不会误把背景当成地面
碰到表面的那一刻雪花停住,开始计时。融化时间走完之前的最后一小段,它会缩小着消失,然后回到顶上重新开始。所以这不是一场会越积越厚的雪——它是一个稳定的循环,画面里的雪量由数量说了算
开启时雪已经铺满了整个高度,而不是从顶上开始往下掉,所以按下开关的第一帧看到的就是一场下到一半的雪
虚拟形象走动或换姿势时,高度图跟着更新,已经落定的雪花不会跟着走——它们停在原来的位置,等着融化。想让积雪跟上一次大动作,把融化时间调短
风与飘摆
风力是恒定的横向漂移,以米每秒计;飘摆是每片雪花自己的左右游移。两者会绕着体积循环,所以再大的风也不会把雪吹光
风力为 0 加上一点飘摆,是安静的落雪。把风力推到两边的极值,雪就横着扫过舞台——配上短一点的融化时间,可形成暴风雪效果
开销
雪不占用后期链,所以开着它并不会像其他特效那样多出一遍全屏渲染。它的开销在别处:每帧一次计算调度,外加每隔一帧一次高度图渲染——这张图和 雨 共用,所以两个一起开并不会把这份开销翻倍
数量是影响性能的主要设置。缓冲区按上限一次性分配,所以调整数量无需重新分配缓冲区——但同时模拟的雪花越多,计算耗时就越长
开关时雪会在约 0.4 秒内淡入淡出,而不是凭空出现或消失
雪需要 GPU 计算,因此只在 3D 舞台上出现。在回退到 WebGL 的机器上,这套计算图可能被拒绝——此时雪会自行关闭,并在控制台留下一行说明,避免影响其他舞台内容
最后更新于 2026年9月19日