使用Unity Compute Shader进行流体模拟时出现毛刺

时间:2020-10-16 23:49:03

标签: unity3d simulation game-physics hlsl compute-shader

尝试进入计算着色器,我制作了这个具有动态地形的小湖模拟器。我使它看起来像3D,但是实际的模拟是在2D高度图上进行的,每个像素都包含水域的深度值和地形的高度。这是一个屏幕截图:

https://youtu.be/x9X-Dg8xu-4

乍看之下还不错,但是当水从山坡上流下来时,您会看到那些怪异的小滴留在后面。它们还会无中生有越来越多的水。我相当确定我知道这些故障的来源,但我不知如何用GPU友好的方式解决问题。

该程序非常简单:

我使用结构化缓冲区来保存每个“像素”水的这些值:

struct Pixel {
   float terrainHeight, 
   float waterDepth, 
   float4 flowRate
}

enter image description here

每个像素根据其水位差异(waterlevel = terrainHeight + waterDepth)向其直接海域(上,下,左,右)进出水。我将这四个值分别存储在flowRate中,然后在以后的过程中,将它们的总和加到waterDepth中。现在,在某些情况下,例如在倾斜的地形上,这将导致负深度值。这就是为什么要在两者之间进行另一遍传递,以确保像素不会溢出更多的水:

If {sum of flowRate components + waterDepth} < 0:
   float pos = sum of flowRate components > 0
   float neg = sum of flowRate components < 0
   float scale = (waterDepth + pos) / abs(neg); // scale will be < 1
   for each component of flowRate < 0:
      flowRate *= scale; // Decrease negative flowRates, so the summation ends up at exactly zero,
                         // instead of below.

我认为这是发生竞争状况的地方:flowRate的值与邻居共享,因此每个邻居可能会或可能不会使用校正后的值,从而一无所有地产生了多余的水... < / p>

不知道该怎么办。这甚至可以在GPU上解决吗?

0 个答案:

没有答案