实时解算水(蜂蜜等)流体的方式

实时模拟超大洪水场景?!GPU实时模拟流体论文解析 来自深夜小编 CG文章_CG资源

实时解算水(蜂蜜等)流体的方式

*文章授权转自微信公众号「CG世界」

前几天我们发布一款实时结算爆炸烟雾的流体软件。在时间和效果方面可以说还不错。可是在流体解算里面最重要,也是特效经常用到的流水的实时一直没有好的解决方案。尽管目前有些工作室借助UE4平台在研究,但效果都不是很理想。前几天翻过往SIGGRAPH论文,发现一篇这方面的解决方案,最近他们也正好公布了一些Demo和解析。今天在这里跟大家聊聊使用GPU实时解算水(蜂蜜等)流体的方式。


现在在影视特效领域使用传统的技术制作超写实的各种流水,蜂蜜或者磁流体沿着物体表面螺旋上升等更高级的流体效果都是没什么问题的。唯一的问题是需要大量的时间来模拟解算,用Realflow简单解算个水冲咖啡得解算个几十分钟,其他用Houdini解算超大的什么洪水就更别提了。所以如果能实时解算这样的流体,那是最好不过的了。想归想,那到底如何解决呢?先来看个实时的视频。

都是实时的呦!厉害吧?这是由世界著名高等学府犹他大学和NVIDIA Corporation的4位研究人员在Eurographics2018大会上发布的研究成果:《在GPU上使用稀疏体积进行快速流体模拟》(Fast Fluid Simulation with Sparse Volumes on the GPU)。对,是一篇论文。


简单说,他是依靠GPU进行高效、大规模实时流体模拟的新方法,可以立即生成复杂的模拟效果,即“在NVIDIA GVDB Voxels所表示的稀疏网格层结构中,使用流体隐式粒子(FLIP)”的方法。



论文地址

http://www.cs.utah.edu/~kwu/GVDB_FLIP/gvdb_flip.pdf

论文PPT/Slides展示

http://www.cs.utah.edu/~kwu/GVDB_FLIP/gvdb_flip_EG18.pdf


研究人员在论文中是这样说的,“...我们的方法可以处理几乎无边界模拟域中的数千万个粒子,描述了用于并行稀疏网格层结构的新技术和在GPU上移动粒子的快速增量更新。我们的FLIP技术引入了稀疏概念,可以从粒子到体素有效地获取并行数据,并且针对稀疏网格优化了基于GPU的无矩阵共轭梯度求解器。结果表明,与在CPU上运行的FLIP模拟相比,我们的方法可以在GPU上更快地实现一个数量级的模拟效果。”




 论文介绍部分 

 

流体隐式粒子(FLIP)方法由于其具有的简单性和低耗散性,已广泛用于模拟各种CG流体效果。作为一种混合技术,高质量的FLIP模拟需要大量粒子和高分辨率的网格,本篇论文介绍的方法通过减少内存需求、动态跟踪模拟区域并在稀疏体积表现的基础上基于GPU进行并行计算来解决模拟问题。


城市

这种方法利用的是GVDB稀疏体素数据结构,一种VDB稀疏网格层结构的GPU友好型实现方式。稀疏网格计算为流体模拟提供了很多优势:

 

第一,它减少了未被流体占据的空白空间的存储。运行大规模模拟的关键因素在于要完全使用GPU内存进行模拟;



第二,使用GVDB Voxels无需预定义网格大小。当流体在空间移动时,可以根据需要自动分配新的体素。

 

第三,体素数据将作为密集体素组(例如bricks)的集合存储在3D纹理中,可以在计算和硬件加速的三线性过滤期间快速检索数据。

 

第四,使用apron体素实现邻近查找,用来加速GPU上的模板操作。



在稀疏网格上进行流体模拟要必须解决很多问题。


首先,每帧都要从大量粒子(测试中为几千万个)中重建稀疏结构。通过引入一种用于重建和更新树形拓扑的高效算法解决了这个问题;


其次,粒子网格栅格化带来了性能挑战,通过引入一种并行收集的方法来解决,这种方法可以有效利用GPU线程block和数据的一致性,还能将所有计算保持在GPU上;


最后,为稀疏体素网格引入无矩阵共轭梯度求解器,可以有效处理FLIP的压力求解器步骤。稀疏网格和无矩阵求解器支持比以前GPU内存还要大的容量,与类似的密集多核CPU方式相比,速度提高了两个数量级。


圆柱


 关于本篇论文的解释 


干聊技术内容好像不是很容易能明白,小编在Youtube看到了一个视频,名为@Two Minute Papers的频道主对这篇技术论文进行了分析,视频将近有28万的观看量。听他这么一讲,晦涩难懂的技术好像就容易搞清楚了。小编专门整理了一下,方便大家阅读理解。


《Finally, A Blazing Fast Fluid Simulator!

视频原地址

https://youtu.be/i4KWiq3guRU

 

前面我们说到了这项技术提供了详细的流体模拟,而且速度非常快,原因有两点:第一,它使用的是稀疏体积代理;第二,它支持在GPU上的并行计算。

 

所以这两点能说明什么问题呢?咱们先从稀疏体积代理来看


流体

使用传统的流体模拟技术,必须提前明确模拟区域,通常是将其限制在立方体内,这就产生了几个缺点。模拟区域是一直存在的,我们无法提前感知到模拟效果到底是什么样子。这时首先要考虑的就是扩大模拟区域的范围,模拟域越大,计算量就会越大,哪怕是空的部分也会占用一定计算量,所以很多时候我们在设置那个体素Box的时候都尽量限制在很小的范围内进行模拟。


视频截图


而这篇论文的技术,它所用到的稀疏代理意味着模拟域可以是任何形态,随着模拟流体飞溅出来的那一刻开始,模拟区域的形状是实时改变的。而且无需计算空白域的部分,这样就极大地提高了解算效率,而且不需要为这些域分配过多的额外内存,这也是这项新技术的关键价值所在。



接下来再说说这个GPU上的“并行”计算。其他方案都是“分钟/帧”的在CPU上运行,技术越复杂,就越可能调用几个内核到几十个内核的CPU。相比之下,GPU相当于一个超级计算机,最多可以有数百个甚至数千个内核计算。


溃坝

 

什么是“并行”呢?就是将一个大问题分解为独立的小问题,把计算过程分配给多个独立工作且效率更高的内核,这样的话模拟速度就快了。据说利用GPU模拟比CPU上运行的等效技术快了10-20倍。

 

还不明白?那我们举个例子。比如煮咖啡。一个人在很短的时间内就能把咖啡煮好,但是要把30个人塞进一个厨房里煮咖啡,速度就会比一个人慢很多。为什么?原因有两点:第一,很难协调30个人,沟通不顺畅;第二,工具少人数多,无法互相帮助,只会给彼此添乱。那,假如需要30杯咖啡,刚好有30个厨房,一个人享用一个厨房,那么这30杯咖啡是不是在很短时间内就冲完了。这就是“并行”。


茶壶


这个例子很好理解,也说明了新技术的原理。模拟过程在GPU上并行,速度还非常快。但你会说GPU的内存量也是有限的啊。是的,没错。但别忘了稀疏代理使内存使用是非常温和的,也就达到了快速创建精细超大体量流体模拟的理想过程。


在这篇论文的模拟演示中,溃坝场景的模拟可达到4帧/秒,而不是秒/帧;有4百万个粒子的水滴场景模拟运行可达到7帧/秒。而且模拟范围可以继续扩大,不是每帧需要模拟几秒时间的问题,而是非常快的问题。速度可以提高27倍。这么说吧,传统模拟需要一个月的话,利用GPU来模拟只需要一个晚上的时间,就这么飒!



当然了,目前只是停留在论文研究阶段。至于什么时候能植入到软件端,应用在制作中,还尚需时日。而且之后的发展过程中,也许会有新的解决方案,我们一起期待吧。


好啦,关于《Fast Fluid Simulation with Sparse Volumes on the GPU》这篇论文的技术我们先分享到这里,下面的链接包含了论文原文、Code、PPT演示和引文,感兴趣的小伙伴们可以仔细研究一下。

http://www.cs.utah.edu/~kwu/gvdb_sim.html





*文章授权转自微信公众号「CG世界」

加载中