文介紹利用流體算法,模擬水墨特效。
本文主要參考了 恬納微晰 的 github 實現(xiàn)和 GPU Gems 第 38 章
https://github.com/TNWX-Z/EnhanceSmokeSimulationPro
https://developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch38.html
恬納微晰的實現(xiàn)效果
GPU Gems
之前在網(wǎng)上搜索流體算法的時候看到了 恬納微晰 的實現(xiàn), 但是是通過 shader 在 image effect 里實現(xiàn)的。恰好中文的流體算法的看得懂的相關(guān)資料不多。于是我就做了一個 compute shader 的實現(xiàn)并學(xué)習(xí)了相關(guān)算法。
這個流體算法, 大體上可以分為 平流模擬(advection)和 旋渦模擬(Vorticity)。使用的是網(wǎng)格的方式模擬每個網(wǎng)點的流速,壓強和密度。
Compute Shader 入門可以看我之前的文章
https://zhuanlan.zhihu.com/p/33675797
計算的數(shù)據(jù)用了:
RWTexture2D<float4> Result;//渲染結(jié)果RWTexture2D<float4> Flowmap;//流速圖RWStructuredBuffer<float2> VelocityW;//流速 寫入StructuredBuffer<float2> VelocityR;//流速 讀取RWStructuredBuffer<float> Curled;// 卷曲度RWStructuredBuffer<float> Divergenced;//發(fā)散度RWStructuredBuffer<float> DensityW;//密度 寫入StructuredBuffer<float> DensityR;//密度 讀取RWStructuredBuffer<float4> ColorW;//顏色 寫入StructuredBuffer<float4> ColorR;//顏色 讀取
主要計算步驟為:
Advection //平流計算Curl //卷曲計算Vorticity //旋渦Divergence //發(fā)散Pressure //壓力GradientSubtract //梯度減法RenderTex //渲染Splat //筆刷繪制
Advection 平流的計算為, 根據(jù)當(dāng)前的流速, 反推時間 deltaTime
后流到這個位置的 網(wǎng)點的信息, 作為自己deltaTime
后的信息.
比如當(dāng)前流速是 v = 1m
, 那么t = 0.1s
后會流到這個位置的坐標(biāo)c
就是當(dāng)前坐標(biāo) 減去v * t
Curl 卷曲計算 為根據(jù)當(dāng)前格子周圍格子的速度, 計算出當(dāng)前網(wǎng)點的旋轉(zhuǎn)速度。這個量是垂直于計算面的。
藍(lán)色為周圍網(wǎng)格的流速,黃色箭頭為卷曲度,即當(dāng)前網(wǎng)點的 旋轉(zhuǎn)速度。
Vorticity 旋渦計算的是當(dāng)前網(wǎng)點附近的 卷曲值 對網(wǎng)點流速的影響。周圍網(wǎng)點流速的不均衡導(dǎo)致當(dāng)前網(wǎng)點的流速獲得一個改變方向的力。
Divergence 發(fā)散 和 Pressure 壓力的迭代,模擬了壓力在網(wǎng)點間的傳播。
大部分 2D 水面模擬會用 壓強和密度來計算水波的傳播,比如 奧日與黑森林
藍(lán)色為周圍網(wǎng)點的流速,綠色箭頭為壓力。當(dāng)周圍向中心流動時,壓強上升,反之則壓強下降。
黑色折線為當(dāng)前壓力。綠色為與相鄰網(wǎng)點的平均值。
每個網(wǎng)點會盡量保證自己的壓強跟周圍的網(wǎng)點一致。壓強的傳播就代表流速的傳播。根據(jù)液體粘稠度的不同,傳播速度也會不同。
維基百科:粘度 https://zh.wikipedia.org/wiki/%E9%BB%8F%E5%BA%A6
將這兩個函數(shù)迭代一定次數(shù)后, 進行 Gradient Subtract 梯度衰減
RenderTex 為將當(dāng)前顏色輸出到 Result。我這里做水墨黑白效果所以就直接反了個色。
Splat 為用畫筆寫入顏色。傳入鼠標(biāo)位置 和繪制半徑, 根據(jù)當(dāng)前網(wǎng)格與鼠標(biāo)位置計算繪制的顏色和流速。傳入一張筆觸貼圖作為控制。
左邊為流速圖, 右邊為繪制面板。
按
操縱桿依次為 筆刷大小,濃度,時間步長,迭代次數(shù),液體阻尼,密度阻尼,顏色淡出,筆刷移動速度的影響。
項目源文件:https://github.com/sacshadow/WaterEffectResearch
其他參考:http://www.cs.cmu.edu/~kmcrane/Projects/GPUFluid/paper.pdf
作者開發(fā)中的游戲:https://indienova.com/g/wjdr
碼來做藝術(shù)?
藝術(shù)家的作品大多有點高深,除非是寫實類作品,不然你不一定能「看懂」。
而代碼對大多數(shù)人來說也是艱難的。對非專業(yè)人士來說,代碼可能比藝術(shù)品還要復(fù)雜。那么,如果用代碼來搞藝術(shù)創(chuàng)作,這一切會更簡單嗎?
《索思沃爾德的夜晚》是一幅安靜的圖畫。即將西下的太陽光撒在湖面上,湖上波光粼粼,泛著金光,波浪的漣漪一點點的散開。岸上的建筑物則安然有序,燈塔、圍墻、小房子,組成了這幅安靜的風(fēng)景圖。
有人覺得這幅畫看上去冷清,過于安靜,是一幅悲傷的畫。
有人覺得這幅畫陽光照耀四方,小屋整齊的立在一旁,是一幅和諧又溫暖的風(fēng)景畫。
當(dāng)然,如果這些人知道這幅畫是用代碼畫的,可能就只會說這是一幅很漂亮的畫了。畢竟代碼聽上去就和藝術(shù)無關(guān),和情感表達(dá)無緣。
此畫的作者本·埃文斯是一個網(wǎng)頁設(shè)計師,是一個前端開發(fā),也是一個插畫家。《索思沃爾德的夜晚》是他用層疊樣式表(CSS)畫的一幅作品。除了這幅畫,他還用 CSS 畫過大海,畫過撲克牌。
和他一樣使用 CSS 畫畫的人也不止一個,近些年還有越來越多的趨勢。
自由網(wǎng)絡(luò)開發(fā)者克里斯·帕特爾畫的辛普森一家是前些年的作品,只是近來才開始被人注意。在 GitHub 上,你可以輕易找到創(chuàng)作者的代碼,并在它的基礎(chǔ)上進行更改。
當(dāng)你復(fù)制原作者的代碼,再稍以修改后,你就可以畫出屬于自己的辛普森。你還可以給他變色,讓他從透明變成黃色、藍(lán)色、綠色。
在 CSS 作圖這個領(lǐng)域,數(shù)字藝術(shù)家戴安娜·史密斯則是一個不可忽略的先驅(qū)人物,他以 CSS 的巴洛克風(fēng)格作畫而聞名,創(chuàng)作過多幅 18 世紀(jì)復(fù)古風(fēng)格的作品,也畫過現(xiàn)實向的靜物海報。
史密斯的作品從來不使用繪圖軟件,他只用手寫的 HTML / CSS代碼創(chuàng)建精美的圖片。作為一個每天 90% 的工作都圍繞著 JavaScript 工作的程序員,史密斯卻更喜歡 CSS 作畫,因為 CSS 有一些限制的規(guī)則。
這只是我喜歡 CSS 的眾多原因之一。
有限的規(guī)則正是它的樂趣所在,你不會期望 CSS 能滿足你所有的需求。這就是為什么當(dāng)你在 CSS 最終找到了一種(可以滿足你的)方法時,它就會變得更有價值。
在工作之余,史密斯還會不斷回到 CSS 尋找藝術(shù)靈感,在限制之中創(chuàng)作新的藝術(shù)作品。
因為一些關(guān)于這些限制的東西一直在召喚著我。當(dāng)我在說嚴(yán)格的限制是激發(fā)創(chuàng)造力的最佳催化劑時,我并不孤單。因為完全的藝術(shù)創(chuàng)作自由可能是一個令人麻痹的概念。
值得一提的是,有限制的 CSS 圖畫不是一個完全靜態(tài)的藝術(shù)作品。不管是簡單的辛普森一家頭像畫還是精致的巴洛克肖像畫、風(fēng)景畫,他們都是會變化的。每個人可以通過改變開源的代碼來創(chuàng)作出自己的 CSS 圖畫。
在此之外,選擇不同的瀏覽器打開圖像也會呈現(xiàn)不同的作品。作為實時呈現(xiàn)的圖畫,每個瀏覽器在加載頁面時都會將圖畫的代碼呈現(xiàn)為繪圖。
而大多數(shù)的數(shù)字藝術(shù)家都是在 Chrome 瀏覽器上處理代碼的。所以除了 Chrome 瀏覽器能夠呈現(xiàn)圖片本身預(yù)想的畫作外,其它瀏覽器都會「畫」出不同的圖像。這也展示了不同瀏覽器轉(zhuǎn)換工作的差別。
創(chuàng)作者說不考慮圖畫的兼容性問題,反而更有意思。
由于這個項目的藝術(shù)性原因,我并不關(guān)心跨瀏覽器的兼容性,所以實時預(yù)覽可能在除 Chrome 之外的任何瀏覽器中看起來都很可笑。
適配單一瀏覽器也有驚喜。當(dāng)我們將這些代碼放進不同瀏覽器的時候,有的圖像有了出乎意料的變化。
Chrome 瀏覽器在羽毛和發(fā)絲的轉(zhuǎn)換上非常細(xì)致,展現(xiàn)了本身的細(xì)節(jié),Safari 瀏覽器則在部分高光的處理上有點過火,裙子也多了一條豎線。
不過隨著時間往前移,我們用更多版本的瀏覽器配上 CSS 代碼圖畫時,呈現(xiàn)效果就會更特別。
這幅畫本尊是這樣的:
在 Safari 瀏覽器中,蕾絲的花邊裝飾直接蓋在了女人的臉上,看不出原圖。
在 2014 版本的 Opera 瀏覽器中,畫作有了一種全然不同的風(fēng)格。
脖子分成了三個部分,眉毛、頭發(fā)、眼睫毛的位置都出現(xiàn)了偏移和錯位,更條碼式。
而 Edge 瀏覽器則自動消掉了畫作的棱角,使整幅圖畫更為平滑、陰沉。
最后在上古時期的網(wǎng)景瀏覽器中,這位女士的嘴巴、眼睛等五官都變成了不同大小的方塊,有點樂高的感覺,風(fēng)格獨樹一幟。
作為該領(lǐng)域的先驅(qū)人物,史密斯給這些圖畫的表現(xiàn)賦予了更多的意義:
當(dāng)你在不同的瀏覽器上查看這張圖片時,你就像是在查看互聯(lián)網(wǎng)的歷史,以及當(dāng)時用戶對瀏覽器的要求。
代碼是冰冷的、理性的代表,它是沒有感情的。而畫作的藝術(shù)則能表達(dá)作者豐沛的情感和思想。但當(dāng)理性的代碼用來創(chuàng)作感性的畫作時,這一切會改變嗎?
在一部分人看來,數(shù)字藝術(shù)是不能算作真正的藝術(shù)的。
當(dāng)大片空白可以在瞬息間充滿五彩的色塊,渲染過度也能在強大工具的幫助下變得快捷且自然時,人們認(rèn)為這不再是藝術(shù)了。雖然數(shù)字化工具做的畫也可以很漂亮,很有創(chuàng)意,但人們會覺得它沒有「靈魂」。即使它能模仿油畫、水墨等不同風(fēng)格,但創(chuàng)造出的作品也稱不上藝術(shù)。
這個問題甚至可以上升到「代碼是不是藝術(shù)」的問題上,深入討論一下藝術(shù)的定義和內(nèi)涵。
在主流觀念中來,那些使用新工具去創(chuàng)作藝術(shù)作品的人不算正統(tǒng)藝術(shù)家。即便要稱為藝術(shù)家,也得在前面加上「數(shù)字」兩個字。在大眾的、觀念中,數(shù)字藝術(shù)家和傳統(tǒng)的藝術(shù)家涇渭分明,完全不同。即便這兩種藝術(shù)家在顯示生活中已經(jīng)有了很多工作的交織、身份的重合。
對當(dāng)下的數(shù)字時代而言,隨著互聯(lián)網(wǎng)在我們生活中的滲透程度越來越深。每個人可能都會成為數(shù)字藝術(shù)家,在創(chuàng)作的過程中,都需要數(shù)字工具的幫助。
而純粹用數(shù)字工具畫出的 CSS 作圖在可玩性、趣味性上都強于普通的藝術(shù)作品。即使我們不把它看作一個藝術(shù)杰作,它也是一個互聯(lián)網(wǎng)的行為藝術(shù)作品。
它讓我們意識到自己生活在一個現(xiàn)實扭曲的文化泛濫時代,人與人之間很難獲得一致的事實版本。
你看到的東西是由你的設(shè)備版本決定的,是和你選擇的數(shù)字工具有關(guān)的。當(dāng)我們看到的東西不一樣的時候,我們創(chuàng)作的東西也是不一樣的。
CSS 作畫與其說是藝術(shù),不如說它讓我們看到了互聯(lián)網(wǎng)的一種能力,一次進程,一段歷史。
本文作者 冷思真,首發(fā)于公眾號「AppSo」(ID:AppSo),這是一個讓你手機更好用的專業(yè)媒體,歡迎識別下方二維碼進行關(guān)注
級別專業(yè)的多功能藝術(shù)動作,將您的照片變成令人印象深刻的水彩藝術(shù)作品,具有很多元素和選項,可以自定義和改進。非常詳細(xì)的結(jié)果,很多可能性。
支持版本:
PhotoShopCS3/4/5/6/CC/CC2014/CC2015/CC2015.5
/CC2017/CC2018
軟件語言:PhotoShop中文/英文
提供方式:百度網(wǎng)盤
獲取方式:請查看文章底部
是不是很棒的特效,快來試試吧!
動作獲取地址:http://www.zaotushi.com/archives/5457.html
后期處理必備的PS擴展炫光面板
50款PhotoShop插件合集,你要的PS插件,我都有!
100集PS高級強化班教程,來吧,讓你的PS水平更上一層樓。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。