整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

流体算法 和 模拟水墨特效

文介绍利用流体算法,模拟水墨特效。

参考

本文主要参考了 恬纳微晰 的 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<float4> Result;//渲染结果RWTexture2D<float4> Flowmap;//流速图RWStructuredBuffer<float2> VelocityW;//流速 写入StructuredBuffer<float2> VelocityR;//流速 读取RWStructuredBuffer<float> Curled;// 卷曲度RWStructuredBuffer<float> Divergenced;//发散度RWStructuredBuffer<float> DensityW;//密度 写入StructuredBuffer<float> DensityR;//密度 读取RWStructuredBuffer<float4> ColorW;//颜色 写入StructuredBuffer<float4> 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

码来做艺术?

本文授权转载于:AppSo

ID:AppSo

作者 : 冷思真

编辑:亦夕

艺术家的作品大多有点高深,除非是写实类作品,不然你不一定能「看懂」。

而代码对大多数人来说也是艰难的。对非专业人士来说,代码可能比艺术品还要复杂。那么,如果用代码来搞艺术创作,这一切会更简单吗?

01

不会画画的程序员不是好艺术家

《索思沃尔德的夜晚》是一幅安静的图画。即将西下的太阳光撒在湖面上,湖上波光粼粼,泛着金光,波浪的涟漪一点点的散开。岸上的建筑物则安然有序,灯塔、围墙、小房子,组成了这幅安静的风景图。

有人觉得这幅画看上去冷清,过于安静,是一幅悲伤的画。

有人觉得这幅画阳光照耀四方,小屋整齐的立在一旁,是一幅和谐又温暖的风景画。

当然,如果这些人知道这幅画是用代码画的,可能就只会说这是一幅很漂亮的画了。毕竟代码听上去就和艺术无关,和情感表达无缘。

此画的作者本·埃文斯是一个网页设计师,是一个前端开发,也是一个插画家。《索思沃尔德的夜晚》是他用层叠样式表(CSS)画的一幅作品。除了这幅画,他还用 CSS 画过大海,画过扑克牌。

和他一样使用 CSS 画画的人也不止一个,近些年还有越来越多的趋势。

自由网络开发者克里斯·帕特尔画的辛普森一家是前些年的作品,只是近来才开始被人注意。在 GitHub 上,你可以轻易找到创作者的代码,并在它的基础上进行更改。

当你复制原作者的代码,再稍以修改后,你就可以画出属于自己的辛普森。你还可以给他变色,让他从透明变成黄色、蓝色、绿色。

在 CSS 作图这个领域,数字艺术家戴安娜·史密斯则是一个不可忽略的先驱人物,他以 CSS 的巴洛克风格作画而闻名,创作过多幅 18 世纪复古风格的作品,也画过现实向的静物海报。

史密斯的作品从来不使用绘图软件,他只用手写的 HTML / CSS代码创建精美的图片。作为一个每天 90% 的工作都围绕着 JavaScript 工作的程序员,史密斯却更喜欢 CSS 作画,因为 CSS 有一些限制的规则。

这只是我喜欢 CSS 的众多原因之一。

有限的规则正是它的乐趣所在,你不会期望 CSS 能满足你所有的需求。这就是为什么当你在 CSS 最终找到了一种(可以满足你的)方法时,它就会变得更有价值。

在工作之余,史密斯还会不断回到 CSS 寻找艺术灵感,在限制之中创作新的艺术作品。

因为一些关于这些限制的东西一直在召唤着我。当我在说严格的限制是激发创造力的最佳催化剂时,我并不孤单。因为完全的艺术创作自由可能是一个令人麻痹的概念。

02

CSS 艺术,让每个浏览器都有自己的风格

值得一提的是,有限制的 CSS 图画不是一个完全静态的艺术作品。不管是简单的辛普森一家头像画还是精致的巴洛克肖像画、风景画,他们都是会变化的。每个人可以通过改变开源的代码来创作出自己的 CSS 图画。

在此之外,选择不同的浏览器打开图像也会呈现不同的作品。作为实时呈现的图画,每个浏览器在加载页面时都会将图画的代码呈现为绘图。

而大多数的数字艺术家都是在 Chrome 浏览器上处理代码的。所以除了 Chrome 浏览器能够呈现图片本身预想的画作外,其它浏览器都会「画」出不同的图像。这也展示了不同浏览器转换工作的差别。

创作者说不考虑图画的兼容性问题,反而更有意思。

由于这个项目的艺术性原因,我并不关心跨浏览器的兼容性,所以实时预览可能在除 Chrome 之外的任何浏览器中看起来都很可笑。

适配单一浏览器也有惊喜。当我们将这些代码放进不同浏览器的时候,有的图像有了出乎意料的变化。

Chrome 浏览器在羽毛和发丝的转换上非常细致,展现了本身的细节,Safari 浏览器则在部分高光的处理上有点过火,裙子也多了一条竖线。

左为 Chrome 浏览器呈现效果,右为 Safari 浏览器呈现效果

不过随着时间往前移,我们用更多版本的浏览器配上 CSS 代码图画时,呈现效果就会更特别。

这幅画本尊是这样的:

在 Safari 浏览器中,蕾丝的花边装饰直接盖在了女人的脸上,看不出原图。

在 2014 版本的 Opera 浏览器中,画作有了一种全然不同的风格。

脖子分成了三个部分,眉毛、头发、眼睫毛的位置都出现了偏移和错位,更条码式。

而 Edge 浏览器则自动消掉了画作的棱角,使整幅图画更为平滑、阴沉。

最后在上古时期的网景浏览器中,这位女士的嘴巴、眼睛等五官都变成了不同大小的方块,有点乐高的感觉,风格独树一帜。

作为该领域的先驱人物,史密斯给这些图画的表现赋予了更多的意义:

当你在不同的浏览器上查看这张图片时,你就像是在查看互联网的历史,以及当时用户对浏览器的要求。

03

CSS 画出来的画算艺术吗?更像行为艺术

代码是冰冷的、理性的代表,它是没有感情的。而画作的艺术则能表达作者丰沛的情感和思想。但当理性的代码用来创作感性的画作时,这一切会改变吗?

在一部分人看来,数字艺术是不能算作真正的艺术的。

当大片空白可以在瞬息间充满五彩的色块,渲染过度也能在强大工具的帮助下变得快捷且自然时,人们认为这不再是艺术了。虽然数字化工具做的画也可以很漂亮,很有创意,但人们会觉得它没有「灵魂」。即使它能模仿油画、水墨等不同风格,但创造出的作品也称不上艺术。

这个问题甚至可以上升到「代码是不是艺术」的问题上,深入讨论一下艺术的定义和内涵。

在主流观念中来,那些使用新工具去创作艺术作品的人不算正统艺术家。即便要称为艺术家,也得在前面加上「数字」两个字。在大众的、观念中,数字艺术家和传统的艺术家泾渭分明,完全不同。即便这两种艺术家在显示生活中已经有了很多工作的交织、身份的重合。

对当下的数字时代而言,随着互联网在我们生活中的渗透程度越来越深。每个人可能都会成为数字艺术家,在创作的过程中,都需要数字工具的帮助。

而纯粹用数字工具画出的 CSS 作图在可玩性、趣味性上都强于普通的艺术作品。即使我们不把它看作一个艺术杰作,它也是一个互联网的行为艺术作品。

它让我们意识到自己生活在一个现实扭曲的文化泛滥时代,人与人之间很难获得一致的事实版本。

你看到的东西是由你的设备版本决定的,是和你选择的数字工具有关的。当我们看到的东西不一样的时候,我们创作的东西也是不一样的。

CSS 作画与其说是艺术,不如说它让我们看到了互联网的一种能力,一次进程,一段历史。

本文作者 冷思真,首发于公众号「AppSo」(ID:AppSo),这是一个让你手机更好用的专业媒体,欢迎识别下方二维码进行关注

级别专业的多功能艺术动作,将您的照片变成令人印象深刻的水彩艺术作品,具有很多元素和选项,可以自定义和改进。非常详细的结果,很多可能性。

支持版本:

PhotoShopCS3/4/5/6/CC/CC2014/CC2015/CC2015.5

/CC2017/CC2018

软件语言:PhotoShop中文/英文

提供方式:百度网盘

获取方式:请查看文章底部

是不是很棒的特效,快来试试吧!

动作获取地址:http://www.zaotushi.com/archives/5457.html

往期精彩推荐

后期处理必备的PS扩展炫光面板

50款PhotoShop插件合集,你要的PS插件,我都有!

100集PS高级强化班教程,来吧,让你的PS水平更上一层楼。