流动的GPU计算水


15

我具有土木工程背景,并定期进行水力学和水文分析。他们为这类事情出售学位,但这实际上不是火箭科学。我最近想到了在GPU上为地形实现整个水文和水力过程。我是最近才学习计算着色器的,所以我目前在设计方面比设计并行GPU工作流程要好得多。

您可以使用以下公式计算降雨事件期间产生的水量:
Q (CF/S) = c * I (in/hr) * A (acres)

我很难超越计算甚至第一个区域的“面积”。

当前实施概述:

  1. 地形是1单位间隔的规则顶点网格
  2. 高度图为每个顶点包含一个R32高度值
  3. 目前,我只允许沿4个基本方向流动(无对角线)
  4. 我正在使用Texture2D [int]作为已经分析过的顶点的模具

当前算法:

  1. 当地形工具处于活动状态且现在不处于活动状态时...
  2. 清除“模具”。
  3. 扫描整个地形以获取最低海拔。
  4. 那一点是CS_Flood的初始输入。
  5. CS_Flood使X轴通过。
  6. 每个输入顶点都在X-和X +方向上投影最多2048次。
  7. 找到具有OOB坐标的相邻顶点将指示该方向上的地形边缘。CurrentPoint附加到BoundaryPoints缓冲区,并且该方向的投影循环终止。这很容易,并且每次都很好用。
  8. 高度大于或等于当前顶点高度的相邻顶点将在模具中标记,并添加到NextPass缓冲区中。
  9. 高度小于当前顶点高度的相邻顶点表示山脊的顶点,并终止投影环。将来的洪水填充迭代可能会在山脊的底部,“后”侧向上流动,并再次检测到同一山脊。
  10. 为此,任何被多次检测到的峰/谷点都不会成为边界点。
  11. 仅将一次检测到的任何峰/岭点附加到BoundaryPoints,并终止该方向上的投影循环。
  12. CS_Flood使用X轴通过生成的点作为输入,以相同的代码进行Z轴通过。
  13. 现在,CS_Flood继续在两个方向上无限期地交替。最终,每当CS_Flood完成并且NextPass缓冲区为空时,我将终止整个循环。

理想情况下,在那一点上,边界点将包含在自然排水沟上出现的每个顶点。降落在边界内的水滴最终流到相同的低点。水滴降落到边界上,导致“其他地方”。

然后:

  1. 在不清除模具的情况下,重新扫描地形以查找最低的非模具顶点。
  2. 迭代CS_Flood。
  3. 重复直到模具装满(或类似的东西)。

这些颜色很难感知3D。这显示了在整体高程处的轮廓线:(
一个孔,在边缘附近被一个护堤包围) 边缘边缘孔

大约有10种独特的方法可以使顶点流失。为每个颜色赋予独特的颜色,如下所示:(
可见的圆形工具标记,“山脊”很好地显示) 在此处输入图片说明

这将CS_Flood生成的每个点(边界或其他)显示为POINTLIST: 在此处输入图片说明

该算法几乎总是 有效。有时,它甚至可以正常工作。其他时候,算法显然包含在正确的形状中,但是将继续无限期地输出点。如第三个屏幕截图所示,有时会感到困惑。我必须忽略另一种情况/因素。如果能找到我的疏忽或提出更简单和/或更优雅的方法来解决问题的建议,我将不胜感激。

遗漏点

MissingPoint!可以通过将算法检测到的每个新的BoundaryPoint添加到NextPass缓冲区中来提供帮助。在下一次传递期间,该创可贴所生成的99%的点将浪费少量的GPU时间,以确定它们无法走到无处可去。在第一遍中,发送LowestPoint以及其他NextPass点也将处理此特定情况。

我知道这是合理的,并且如果有足够的时间,我将能够为它做足够的创可贴以完成我想要的事情。如果可能的话,我想以一种更好,更聪明,更快的方式进行操作,但是我没有足够的经验来更好地了解。


因此,您的意思是只想计算地形中所有排水口的位置?
EvilTak

@EvilTak,我想我已经确定了一种好的算法,但是我仍然得到“怪异的东西”,我没有经验可以解释。如果你擅长平行GPU'ing,请查看gamedev.stackexchange.com/questions/118556/...
乔恩

Answers:


1

当一滴“尝试”访问顶点时,InterlockedExchange使用“原始值” 标记该模具以确定其是否已经被模具密封(即使我只是改写了它)。

我想出的最佳算法为洪水赋予了“便笺本”和一个规则:“不要顺着山坡流下”(高度等于或大于)。这几乎消除了所有复杂的测试。尽管通常它擅长于不流峰/山脊,但由于相邻的顶点是“平坦的” ,所以它确实沿着峰/山脊流动。偶尔,这会使液滴滑过山脊线。

在此处输入图片说明

然后,每个“太远”点都是“流入”的,并且将“流入”排水区域(在1处停止)或不流入(在0处停止)。“ nots”将被丢弃,将更正后的便笺本复制到“ final”中。如果最终模板已被模板化,则便笺本将被丢弃。(未来:这些碰撞应共同代表当前流域的外边界。)

在10FPS时:

在此处输入图片说明

“ nots”以红色显示,一旦将较大的区域复制到最终区域并变为绿色,则对剩余的未模板化区域重复该算法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.