这是一篇关于在浏览器中使用 WebGPU 进行粒子生命模拟的文章,主要内容如下:
- 模拟介绍:作者喜欢物理模拟,特别是粒子模拟,最近发现了一个有趣的非物理模型即粒子生命模型,该模型与康威生命游戏无关,更像粒子 Lenia,其核心思想是运行带有质点的典型物理模拟,但粒子间的力可以是不对称的,这违反了牛顿第三定律和几乎所有的守恒定律,但能带来额外的能量,使粒子能够相互追逐,模拟出类似生物的行为,粒子通常分为几种类型,每种类型间的相互作用由半径和强度因子指定。
- 为何使用 WebGPU:作者决定将模拟移至 GPU,因为这是典型的大规模并行任务,而 WebGPU 是现代且干净的 API,感觉就像实时图形应有的样子,作者已在多个桌面项目中使用过,包括蒙特卡洛光线追踪器和浅水波模拟器,目前在一个中世纪村庄建造游戏中也在使用,它支持计算着色器和原子操作,而 WebGL 不支持这些功能,并且可以在浏览器中运行。
- 模拟循环:模拟循环很直接,若未暂停,计算粒子间的力并更新粒子的速度和位置,应用边界条件,然后渲染粒子,使用半隐式欧拉积分器,粒子存储在一个 GPU 缓冲区中,一个粒子是一个简单的结构体,由于计算力很快成为瓶颈,所以将计算力作为一个单独的计算过程,之后每个粒子的计算着色器调用移动粒子并处理与边界的碰撞。
- 计算相互作用:在推进粒子之前,需要计算粒子间的力,利用所有力都有有限半径的特性,使用空间哈希/分箱的方法,将粒子存储在一个线性化的结构中,通过三个阶段来实现,阶段 1 计算每个箱子中的粒子数,阶段 2 运行并行前缀和来计算每个箱子的偏移量,阶段 3 将每个粒子放置到相应的箱子中,在计算过程中大量使用了着色器原子操作。
- 并行前缀和:并行计算前缀和是一个已知问题,作者使用最简单的解决方案,即运行多次扫描,每次将前一个元素的值加到当前元素上,为了在 WebGPU 中实现,需要创建两个绑定组,一个用于读取,一个用于写入,通过 ping-pong 操作来计算前缀和。
- 渲染:将粒子渲染为正方形,在片段着色器中转换为完美的圆形,对于小于 1 像素的粒子,使用另一个渲染器来替代圆形,以避免闪烁,所有渲染都使用基本的加法混合和 ACES 色调映射,并添加一些高斯模糊效果来隐藏边缘的条纹。
- 画廊:提供了粒子生命模拟的链接,每个页面重新加载都会给出一个新的随机系统,可以保存当前规则或上传自定义规则,分享随机生成的规则集,不同数量的粒子类型会产生不同的效果,如较少的粒子类型会导致更大规模的连贯结构,而更多的粒子类型会导致更局部和繁忙的系统。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。