我正在寻找相对于一个较大的(称为)阻塞/非阻塞数组(从侧面观察)在2D中模拟水的任何输入。我提出了以下想法:
细胞自动机
使用单元自动机在CPU上进行大规模并行仿真。使用简单的规则:
- 如果底部有一个开放的单元,则移至该单元。
- 检查左侧和右侧的单元格,从两个单元格中随机选择一个并移至该单元格。
优点
- 易于实现。
- 在多人游戏系统中有意义/确定性。
缺点
- 可能真的很慢。
- 不令人信服。
GPU上的流体动力学
针对如下所示的纹理在GPU上执行流体动力学的粗略近似:
+------+-----+-----+-------+
|R |G |B |A |
+------+-----+-----+-------+
|vX |vY |NULL |Density|
+------+-----+-----+-------+
优点
- 可能真的很快。
- 可能非常令人信服。
- 另一个像素着色器可以直接渲染它。
缺点
- 难以实施。
- 难以调整。
- 我无法为我的水平分配单个纹理。
- 我可以重叠网格区域,但这会增加进一步的复杂性。
粒子
使用粒子模拟水。在使用添加混合进行渲染的过程中,然后将乘法函数应用于Alpha通道以赋予水脆边缘。
优点
- 可能看起来不错。
- 易于实现。
- 易于渲染。
- 尽管在多人游戏系统中需要大量的带宽才能传输,但这仍然有意义。
缺点
- 粒子间的影响可能会很慢(邻居查找)。
- 可能导致水通过实心空间“漏出”(因为实心空间很小,例如1px)。
- 根据颗粒大小,可能导致水中出现奇怪的孔。
- 可以通过允许粒子比实际大小更靠近一起漂移来缓解上述两种情况,但是这会导致粒子间和粒子/横向性能出现问题。
还有其他想法吗?
注意:这是一个近似值,我在这里不是在寻找物理上正确的水-只是“足够好”的东西(快速和肮脏的加分点)。该游戏是多人游戏,因此不幸的是,整个关卡需要不断进行模拟。