中年|流体算法 和 模拟水墨特效
本文插图
本文介绍利用流体算法 , 模拟水墨特效 。
本文插图
参考
本文主要参考了 恬纳微晰 的 github 实现和 GPU Gems 第 38 章
- 【中年|流体算法 和 模拟水墨特效】https://github.com/TNWX-Z/EnhanceSmokeSimulationPro
- https://developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch38.html
本文插图
恬纳微晰的实现效果
本文插图
GPU Gems
之前在网上搜索流体算法的时候看到了 恬纳微晰 的实现 ,但是是通过 shader 在 image effect 里实现的 。 恰好中文的流体算法的看得懂的相关资料不多 。 于是我就做了一个 compute shader 的实现并学习了相关算法 。
算法实现
这个流体算法 ,大体上可以分为 平流模拟(advection)和 旋涡模拟(Vorticity) 。 使用的是网格的方式模拟每个网点的流速 , 压强和密度 。
本文插图
Compute Shader 入门可以看我之前的文章
- https://zhuanlan.zhihu.com/p/33675797
RWTexture2D Result//渲染结果RWTexture2D Flowmap//流速图RWStructuredBuffer VelocityW//流速 写入StructuredBuffer VelocityR//流速 读取RWStructuredBuffer Curled// 卷曲度RWStructuredBuffer Divergenced//发散度RWStructuredBuffer DensityW//密度 写入StructuredBuffer DensityR//密度 读取RWStructuredBuffer ColorW//颜色 写入StructuredBuffer ColorR//颜色 读取
主要计算步骤为:
Advection //平流计算Curl //卷曲计算Vorticity //旋涡Divergence //发散Pressure //压力GradientSubtract //梯度减法RenderTex //渲染Splat //笔刷绘制
Advection 平流的计算为, 根据当前的流速, 反推时间 deltaTime后流到这个位置的 网点的信息, 作为自己deltaTime后的信息.
比如当前流速是 v = 1m, 那么t = 0.1s后会流到这个位置的坐标c就是当前坐标 减去v * t
本文插图
Curl 卷曲计算 为根据当前格子周围格子的速度, 计算出当前网点的旋转速度 。 这个量是垂直于计算面的 。
蓝色为周围网格的流速 , 黄色箭头为卷曲度 , 即当前网点的 旋转速度 。
本文插图
Vorticity 旋涡计算的是当前网点附近的 卷曲值 对网点流速的影响 。 周围网点流速的不均衡导致当前网点的流速获得一个改变方向的力 。
Divergence 发散 和 Pressure 压力的迭代 , 模拟了压力在网点间的传播 。
大部分 2D 水面模拟会用 压强和密度来计算水波的传播 , 比如 奥日与黑森林
本文插图
蓝色为周围网点的流速 , 绿色箭头为压力 。 当周围向中心流动时 , 压强上升 , 反之则压强下降 。
本文插图
黑色折线为当前压力 。 绿色为与相邻网点的平均值 。
每个网点会尽量保证自己的压强跟周围的网点一致 。 压强的传播就代表流速的传播 。 根据液体粘稠度的不同 , 传播速度也会不同 。
维基百科:粘度 https://zh.wikipedia.org/wiki/%E9%BB%8F%E5%BA%A6
将这两个函数迭代一定次数后 ,进行 Gradient Subtract 梯度衰减
RenderTex 为将当前颜色输出到 Result 。 我这里做水墨黑白效果所以就直接反了个色 。
Splat 为用画笔写入颜色 。 传入鼠标位置 和绘制半径 ,根据当前网格与鼠标位置计算绘制的颜色和流速 。 传入一张笔触贴图作为控制 。
最终结果
本文插图
左边为流速图 ,右边为绘制面板 。
按
操纵杆依次为 笔刷大小 , 浓度 , 时间步长 , 迭代次数 , 液体阻尼 , 密度阻尼 , 颜色淡出 , 笔刷移动速度的影响 。
项目源文件:https://github.com/sacshadow/WaterEffectResearch
其他参考:http://www.cs.cmu.edu/~kmcrane/Projects/GPUFluid/paper.pdf
作者开发中的游戏:https://indienova.com/g/wjdr
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。邮箱地址:newmedia@xxcb.cn
推荐阅读
- 减肥|JAMA:减肥要趁早,25岁就该开始预防中年期肥胖
- 人到中年,常吃3种食物,健脑益智,美白抗衰,保护心血管
- 中年|《中国新说唱2020》全民搞哈开团日
- 中年|点燃创新之火,合力解除“缺芯”之痛
- 中年|画像“标签”生产实操指南(二)之产出清晰的标签数据需求
- 中年|从原型模式到浅拷贝和深拷贝
- 中年|宁愿2450亿打水漂,也不使用华为设备?如今却沦为“国际笑话”
- 中年|Angular export class AppComponent里定义变量的实现原理
- 中年|社交网络中的信息交流效率 社交网络并非越大越好
- 女人|疫情没过,大马中年妇女跟老公数次去夜店被捕:担心他找其他女人
