Questions tagged «compute-shader»

1
流动的GPU计算水
我具有土木工程背景,并定期进行水力学和水文分析。他们为这类事情出售学位,但这实际上不是火箭科学。我最近想到了在GPU上为地形实现整个水文和水力过程。我是最近才学习计算着色器的,所以我目前在设计方面比设计并行GPU工作流程要好得多。 您可以使用以下公式计算降雨事件期间产生的水量: Q (CF/S) = c * I (in/hr) * A (acres) 我很难超越计算甚至第一个区域的“面积”。 当前实施概述: 地形是1单位间隔的规则顶点网格 高度图为每个顶点包含一个R32高度值 目前,我只允许沿4个基本方向流动(无对角线) 我正在使用Texture2D [int]作为已经分析过的顶点的模具 当前算法: 当地形工具处于活动状态且现在不处于活动状态时... 清除“模具”。 扫描整个地形以获取最低海拔。 那一点是CS_Flood的初始输入。 CS_Flood使X轴通过。 每个输入顶点都在X-和X +方向上投影最多2048次。 找到具有OOB坐标的相邻顶点将指示该方向上的地形边缘。CurrentPoint附加到BoundaryPoints缓冲区,并且该方向的投影循环终止。这很容易,并且每次都很好用。 高度大于或等于当前顶点高度的相邻顶点将在模具中标记,并添加到NextPass缓冲区中。 高度小于当前顶点高度的相邻顶点表示山脊的顶点,并终止投影环。将来的洪水填充迭代可能会在山脊的底部,“后”侧向上流动,并再次检测到同一山脊。 为此,任何被多次检测到的峰/谷点都不会成为边界点。 仅将一次检测到的任何峰/岭点附加到BoundaryPoints,并终止该方向上的投影循环。 CS_Flood使用X轴通过生成的点作为输入,以相同的代码进行Z轴通过。 现在,CS_Flood继续在两个方向上无限期地交替。最终,每当CS_Flood完成并且NextPass缓冲区为空时,我将终止整个循环。 理想情况下,在那一点上,边界点将包含在自然排水沟上出现的每个顶点。降落在边界内的水滴最终流到相同的低点。水滴降落到边界上,导致“其他地方”。 然后: 在不清除模具的情况下,重新扫描地形以查找最低的非模具顶点。 迭代CS_Flood。 重复直到模具装满(或类似的东西)。 这些颜色很难感知3D。这显示了在整体高程处的轮廓线:( 一个孔,在边缘附近被一个护堤包围) 大约有10种独特的方法可以使顶点流失。为每个颜色赋予独特的颜色,如下所示:( 可见的圆形工具标记,“山脊”很好地显示) 这将CS_Flood生成的每个点(边界或其他)显示为POINTLIST: 该算法几乎总是 有效。有时,它甚至可以正常工作。其他时候,算法显然包含在正确的形状中,但是将继续无限期地输出点。如第三个屏幕截图所示,有时会感到困惑。我必须忽略另一种情况/因素。如果能找到我的疏忽或提出更简单和/或更优雅的方法来解决问题的建议,我将不胜感激。 MissingPoint!可以通过将算法检测到的每个新的BoundaryPoint添加到NextPass缓冲区中来提供帮助。在下一次传递期间,该创可贴所生成的99%的点将浪费少量的GPU时间,以确定它们无法走到无处可去。在第一遍中,发送LowestPoint以及其他NextPass点也将处理此特定情况。 我知道这是合理的,并且如果有足够的时间,我将能够为它做足够的创可贴以完成我想要的事情。如果可能的话,我想以一种更好,更聪明,更快的方式进行操作,但是我没有足够的经验来更好地了解。
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.