ETH官方钱包

創(chuàng)作內(nèi)容

5 GP

[經(jīng)驗(yàn)分享]GIMP與MyPaint演算法調(diào)查,筆刷篇

作者:Shark│2017-04-08 02:58:40│巴幣:1,008│人氣:1290
筆者學(xué)畫(huà)圖會(huì)去了解繪圖軟體的演算法。對(duì)我來(lái)說(shuō)很多工具只是試用或看別人的教學(xué)還是一知半解,沒(méi)辦法從畫(huà)面上的數(shù)值想像它的作用,但是只要知道演算法,就能用心去感受數(shù)值的計(jì)算,感受資料的流動(dòng),一切豁然開(kāi)朗。

筆者常用的軟體是GIMP,2.9.4版新增了MyPaint筆刷的功能,所以主要研究這兩個(gè)軟體。至於資料來(lái)源,官方文件有寫(xiě)的話(huà)還好解決,沒(méi)寫(xiě)的就只好翻程式碼了。

要看程式碼才能學(xué)會(huì)也不是只有GIMP會(huì)這樣,現(xiàn)在繪圖軟體功能越來(lái)越強(qiáng),內(nèi)部處理也越趨複雜,GIMP和MyPaint可以看到程式碼還算好的,很多繪圖軟體沒(méi)有公開(kāi)演算法,想看都看不到。

前幾天剛好在研究筆刷就先寫(xiě)筆刷相關(guān)的,以後有新發(fā)現(xiàn)可能寫(xiě)在這一篇,也可能寫(xiě)另一篇。
順便記一下相關(guān)程式碼在哪個(gè)檔案哪個(gè)函式,以後我想查的話(huà)方便找。

(巴哈姆特好像不能打上標(biāo),數(shù)學(xué)的指數(shù)用^代替)
2017/4/13:新增GIMP噴槍



-GIMP手抖修正-

位置:gimppaintcore.c,gimp_paint_core_smooth_coords()

把目前游標(biāo)位置跟過(guò)去的點(diǎn)平均,算出要把筆刷點(diǎn)上去的位置。
有Quality和Weight兩個(gè)參數(shù),初次看到應(yīng)該會(huì)不知道該調(diào)哪一個(gè)。


簡(jiǎn)單用法:
Weight固定在500,只調(diào)Quality控制強(qiáng)度,要設(shè)多少就畫(huà)畫(huà)看感覺(jué)一下。

詳細(xì):
Weight是常態(tài)分布的標(biāo)準(zhǔn)差,代入常態(tài)分布的公式?jīng)Q定各點(diǎn)的權(quán)重。
Quality代表取幾個(gè)過(guò)去的點(diǎn)做計(jì)算。
計(jì)算式大致是
  (第1個(gè)點(diǎn)*權(quán)重1 + 第2個(gè)點(diǎn)*權(quán)重2 + …… + 第n個(gè)點(diǎn)*權(quán)重n) / 權(quán)重的總合
  n=Quality

Weight小的話(huà)權(quán)重遞減得很快,幾乎由前面的點(diǎn)決定,Weight越大會(huì)越平均。

雖然MyPaint也有手抖修正,但是GIMP的MyPaint筆刷也會(huì)套用GIMP本身的手抖修正,所以我都直接調(diào)GIMP的,沒(méi)有用MyPaint的。

-GIMP筆刷動(dòng)態(tài)-

位置:gimpdynamicsoutput.c,gimp_dynamics_output_get_linear_value()

先求平均值再用乘法計(jì)算

上面1是工具選項(xiàng),2,3是筆刷動(dòng)態(tài)編輯器。

看圖2,Opacity(不透明度)有壓力、速度、漸變(Fade)三個(gè)因素影響,F(xiàn)ade是跟圖1裡的Fade Options有關(guān)。
然後再看圖3有壓力、速度、漸變的曲線(xiàn),橫軸是影響因素的原值,縱軸是輸出,求出三個(gè)0~1的倍率,算三個(gè)倍率的平均。
圖1的不透明度基本值是70,把70乘以平均倍率就是實(shí)際的不透明度。

是把基本值乘上0~1之間的數(shù),所以最終結(jié)果會(huì)在0~基本值之間。

-GIMP噴槍(Airbrush)-

位置:gimpairbrush.c,gimp_airbrush_paint()
筆刷間隔在gimpbrushcore.c,gimp_brush_core_interpolate()


有三個(gè)特有參數(shù):Rate、Flow、Motion only,特徵是時(shí)間也會(huì)影響它的表現(xiàn)。如果點(diǎn)滑鼠或筆按下去之後不動(dòng)游標(biāo),也會(huì)慢慢畫(huà)東西上去,間隔時(shí)間由Rate控制,其他筆刷要游標(biāo)有移動(dòng)才會(huì)畫(huà)出東西。

筆刷工具的基本是,筆刷形狀是一張記憶體裡的點(diǎn)陣圖,游標(biāo)每移動(dòng)一段距離就把點(diǎn)陣圖貼到畫(huà)布上,貼的時(shí)候套用混色模式。

噴槍有兩個(gè)條件會(huì)觸發(fā)這個(gè)動(dòng)作
1.游標(biāo)移動(dòng)一段距離,跟其他筆刷相同。
2.經(jīng)過(guò)一段時(shí)間沒(méi)有觸發(fā)1,因?yàn)橥耆珱](méi)移動(dòng)或移動(dòng)距離不夠。如果觸發(fā)了1會(huì)重新計(jì)時(shí)。

1的「一段距離」,筆刷參數(shù)的Spacing代表筆刷直徑的幾倍,單位%,即px數(shù)是Size*Spacing/100,設(shè)成100就會(huì)看到筆觸剛好一個(gè)挨著一個(gè)。
有動(dòng)態(tài)的話(huà)變成「2*(1-Spacint動(dòng)態(tài)) + Spacing*Spacint動(dòng)態(tài)」,筆刷動(dòng)態(tài)是0.0~1.0的數(shù)字,完全沒(méi)開(kāi)動(dòng)態(tài)就是1,算法見(jiàn)上面的筆刷動(dòng)態(tài)。
簡(jiǎn)單說(shuō)就是
  動(dòng)態(tài)=0 → 200%
  動(dòng)態(tài)=1 → Spacing
  中間的值內(nèi)插算出
Spacing>200則完全固定在Spacing,不受動(dòng)態(tài)影響。

2的timeout是「10秒/(Rate*Rate動(dòng)態(tài))」,即Rate=每10秒筆觸數(shù),Rate=0則不觸發(fā)2。

Flow的話(huà),如果把不透明度範(fàn)圍定在0~1,噴槍不透明度算法是「(Flow/100)*Flow動(dòng)態(tài)*(Opacity/100)*Opacity動(dòng)態(tài)」,簡(jiǎn)單講是Flow*Opacity,其他筆刷只有「(Opacity/100)*Opacity動(dòng)態(tài)」。(不太懂為何要把不透明度分成兩個(gè)數(shù)值)

如果Motion only開(kāi)啟則不觸發(fā)2的條件,Rate沒(méi)作用,變成追加Flow參數(shù)的普通筆刷。

附帶一提MyPaint是用「每秒筆觸數(shù)」做出噴槍工具,不同的是游標(biāo)完全不動(dòng)不會(huì)畫(huà)出東西,有微小的移動(dòng)才有反應(yīng)。

-GIMP塗抹工具-

位置:gimpsmudge.c,gimp_smudge_motion(),以及gimp-gegl-loops.c,gimp_gegl_smudge_blend()

跟噴槍一樣有Rate參數(shù)但意義不一樣。
如下圖,每做一次「把筆刷點(diǎn)上去」就跑一輪詳細(xì)裡的步驟。

記憶體裡有accum buffer和paint buffer兩個(gè)點(diǎn)陣圖,accum buffer初始會(huì)從畫(huà)布上複製一塊區(qū)域,然後每跑一輪更新一次。
rate是個(gè)比例,會(huì)先經(jīng)過(guò)筆刷動(dòng)態(tài)計(jì)算再用在這裡,越大則塗抹效果越強(qiáng)。

-MyPaint筆刷半徑-

位置:mypaint-brush.c,prepare_and_draw_dab(),此函式是主要的筆刷動(dòng)態(tài)計(jì)算。


不是直接設(shè)定幾px,而是「e的x次方」,e是自然對(duì)數(shù)的底,2.71828……。
小於0也不會(huì)變成負(fù)數(shù),而是0~1 (因此這個(gè)值可以設(shè)成負(fù)數(shù))
如果設(shè)為0,半徑是e^0=1px
0.7 → 2px
1.0 → 2.71828……px
2.3 → 10px
3.0 → 20px

MyPaint有不少參數(shù)是用指數(shù)計(jì)算,像下面提到的塗抹半徑也是。

用過(guò)MyPaint筆刷以後發(fā)現(xiàn)用指數(shù)有它的好處,用小筆刷的時(shí)候調(diào)整半徑需要1px增減,但畫(huà)大區(qū)域的時(shí)候想要一次3~10px增減,指數(shù)有數(shù)字越大一次增減越多的特性。
GIMP原有的筆刷按快速鍵都是一次加1px,畫(huà)大區(qū)域的時(shí)候比較麻煩。找了一下發(fā)現(xiàn)GIMP也有increase-percent和decrease-percent的快速鍵,不過(guò)按一次就是變成兩倍,而且變化量還不能改,沒(méi)辦法用。

-MyPaint筆刷動(dòng)態(tài)-

位置:mypaint-mapping.c,mypaint_mapping_calculate()

跟GIMP不同,用加法計(jì)算。

根據(jù)曲線(xiàn)圖求出變化量,可能是正或負(fù),再把變化量跟基礎(chǔ)值相加。
如果壓力是0.35,如上圖變化量大約是-0.62,這一階段就是1.00-0.62=0.38。
繼續(xù)把精細(xì)速度、粗略速度、隨機(jī)……算出的變化量加上去,就是實(shí)際用的值。

-MyPaint塗抹參數(shù)-

位置:mypaint-brush.c,prepare_and_draw_dab()

跟GIMP的塗抹不同,類(lèi)似其他軟體的水彩工具。
採(cǎi)取畫(huà)布顏色時(shí)會(huì)計(jì)算平均,像把顏料溶解的效果,且多了塗上筆刷顏色的能力。
用3個(gè)參數(shù)控制:塗抹(smudge)、塗抹長(zhǎng)度(smudge length)、塗抹半徑(smudge radius)

暫存顏色和混合色只是一個(gè)RGBA值,不用記錄點(diǎn)陣圖buffer。
塗抹半徑也是e為底的指數(shù),如果值是x,則採(cǎi)取半徑是「目前筆刷半徑*e^x」
塗抹長(zhǎng)度實(shí)際上不是長(zhǎng)度而是混合比例,跟GIMP塗抹的rate類(lèi)似。
塗抹是與筆刷顏色的混合比例。
引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=3537245
All rights reserved. 版權(quán)所有,保留一切權(quán)利

相關(guān)創(chuàng)作

同標(biāo)籤作品搜尋:繪圖心得|GIMP|MyPaint|演算法

留言共 1 篇留言

死人一個(gè)
優(yōu)質(zhì)推

04-11 09:02

我要留言提醒:您尚未登入,請(qǐng)先登入再留言

5喜歡★shark0r 可決定是否刪除您的留言,請(qǐng)勿發(fā)表違反站規(guī)文字。

前一篇:從愚人節(jié)企劃誕生的歌姬:... 後一篇:新發(fā)明,改造GIMP的塗...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網(wǎng)路標(biāo)準(zhǔn),可能無(wú)法使用新的應(yīng)用程式來(lái)呈現(xiàn)網(wǎng)站內(nèi)容,在瀏覽器支援度及網(wǎng)站安全性的雙重考量下,為了讓巴友們有更好的使用體驗(yàn),巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁(yè)面呈現(xiàn)和功能。
屆時(shí)建議您使用下述瀏覽器來(lái)瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業(yè)系統(tǒng)版本才可使用)

face我們了解您不想看到廣告的心情? 若您願(yuàn)意支持巴哈姆特永續(xù)經(jīng)營(yíng),請(qǐng)將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學(xué)】