創作內容

5 GP

[經驗分享]GIMP與MyPaint演算法調查,筆刷篇

作者:Shark│2017-04-08 02:58:40│巴幣:1,008│人氣:1205
筆者學畫圖會去了解繪圖軟體的演算法。對我來說很多工具只是試用或看別人的教學還是一知半解,沒辦法從畫面上的數值想像它的作用,但是只要知道演算法,就能用心去感受數值的計算,感受資料的流動,一切豁然開朗。

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

要看程式碼才能學會也不是只有GIMP會這樣,現在繪圖軟體功能越來越強,內部處理也越趨複雜,GIMP和MyPaint可以看到程式碼還算好的,很多繪圖軟體沒有公開演算法,想看都看不到。

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

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



-GIMP手抖修正-

位置:gimppaintcore.c,gimp_paint_core_smooth_coords()

把目前游標位置跟過去的點平均,算出要把筆刷點上去的位置。
有Quality和Weight兩個參數,初次看到應該會不知道該調哪一個。


簡單用法:
Weight固定在500,只調Quality控制強度,要設多少就畫畫看感覺一下。

詳細:
Weight是常態分布的標準差,代入常態分布的公式決定各點的權重。
Quality代表取幾個過去的點做計算。
計算式大致是
  (第1個點*權重1 + 第2個點*權重2 + …… + 第n個點*權重n) / 權重的總合
  n=Quality

Weight小的話權重遞減得很快,幾乎由前面的點決定,Weight越大會越平均。

雖然MyPaint也有手抖修正,但是GIMP的MyPaint筆刷也會套用GIMP本身的手抖修正,所以我都直接調GIMP的,沒有用MyPaint的。

-GIMP筆刷動態-

位置:gimpdynamicsoutput.c,gimp_dynamics_output_get_linear_value()

先求平均值再用乘法計算

上面1是工具選項,2,3是筆刷動態編輯器。

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

是把基本值乘上0~1之間的數,所以最終結果會在0~基本值之間。

-GIMP噴槍(Airbrush)-

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


有三個特有參數:Rate、Flow、Motion only,特徵是時間也會影響它的表現。如果點滑鼠或筆按下去之後不動游標,也會慢慢畫東西上去,間隔時間由Rate控制,其他筆刷要游標有移動才會畫出東西。

筆刷工具的基本是,筆刷形狀是一張記憶體裡的點陣圖,游標每移動一段距離就把點陣圖貼到畫布上,貼的時候套用混色模式。

噴槍有兩個條件會觸發這個動作
1.游標移動一段距離,跟其他筆刷相同。
2.經過一段時間沒有觸發1,因為完全沒移動或移動距離不夠。如果觸發了1會重新計時。

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

2的timeout是「10秒/(Rate*Rate動態)」,即Rate=每10秒筆觸數,Rate=0則不觸發2。

Flow的話,如果把不透明度範圍定在0~1,噴槍不透明度算法是「(Flow/100)*Flow動態*(Opacity/100)*Opacity動態」,簡單講是Flow*Opacity,其他筆刷只有「(Opacity/100)*Opacity動態」。(不太懂為何要把不透明度分成兩個數值)

如果Motion only開啟則不觸發2的條件,Rate沒作用,變成追加Flow參數的普通筆刷。

附帶一提MyPaint是用「每秒筆觸數」做出噴槍工具,不同的是游標完全不動不會畫出東西,有微小的移動才有反應。

-GIMP塗抹工具-

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

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

記憶體裡有accum buffer和paint buffer兩個點陣圖,accum buffer初始會從畫布上複製一塊區域,然後每跑一輪更新一次。
rate是個比例,會先經過筆刷動態計算再用在這裡,越大則塗抹效果越強。

-MyPaint筆刷半徑-

位置:mypaint-brush.c,prepare_and_draw_dab(),此函式是主要的筆刷動態計算。


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

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

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

-MyPaint筆刷動態-

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

跟GIMP不同,用加法計算。

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

-MyPaint塗抹參數-

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

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

暫存顏色和混合色只是一個RGBA值,不用記錄點陣圖buffer。
塗抹半徑也是e為底的指數,如果值是x,則採取半徑是「目前筆刷半徑*e^x」
塗抹長度實際上不是長度而是混合比例,跟GIMP塗抹的rate類似。
塗抹是與筆刷顏色的混合比例。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3537245
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:繪圖心得|GIMP|MyPaint|演算法

留言共 1 篇留言

死人一個
優質推

04-11 09:02

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★shark0r 可決定是否刪除您的留言,請勿發表違反站規文字。

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

追蹤私訊切換新版閱覽

作品資料夾

ms0489223每天換一首的人
Ever Dream - Nightwish看更多我要大聲說2小時前


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

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】