Substance Designer 中實現形態圖形處理演算法(II) --- 非均勻的腐蝕拓展
回顧&改進
在前文中描述的腐蝕運算大家都沒有忘記吧? 雖然這種腐蝕在處理二值圖像(比如, 剛從edge detect得到的乾淨的邊緣)比較方便, 但是缺點就是由於使用的模板是3x3的方盒, 如圖
由於運算的局部性, 腐蝕結果會顯得"方頭方腦", 沒有實際使用價值(除非你認為世界上有這種鬼畜的腐蝕現象):
而且, 不僅希望抑制這種副作用, 我們往往希望能夠僅在一些想要的地方施加較強的腐蝕效果, 而在其餘的地方採用較弱的腐蝕效果. 我這裡有一個解決思路, 結果還不錯:
也可以支持模板遮蓋:
原理&Code
我把改進後的腐蝕稱為nonuniform erosion; 基本代碼如圖:
不懂編程的讀者可能不太懂, 我在這裡簡略解釋這張圖的一些元素:
$pos, $size是SD自帶的系統常量, 分別表示像素位置和圖像長寬; min表示取得輸入值中的最小值; sample節點負責在指定的輸入圖(比如input0, 就是輸入的第一張圖)在輸入的位置(比如$pos)處提取顏色.
這裡的思路其實還是非常簡單, 無非就是額外加了2張圖(strength + mask), 用第一張strength圖對原圖做類似卷積的操作(相同位置像素灰度值相乘), 然後用Mask為Alpha做線性插值.不知道線性插值定義的話可以看下面的公式:
其中a就是Mask的當前位置像素值, x, y分別為原圖和Strength輸入圖.
經過試驗, 感覺這個節點還是不太符合我的期望, 但用還是可以用了:
Strength控制強度和腐蝕的圖案, Mask可以起到一定的遮罩效果;
由於目前Erosion的開發還沒有完全完成, 所以就不把沒成熟的東西拿出來了; 接下來打算增加帶方向性的腐蝕, 和調整腐蝕形狀結構的2個功能;
同時把SubstanceDesigner中最常用的, 也是CG中最知名的噪音PerlinNoise在SubstanceDesigner的2種不同實現辦法(2D/3D)順便也介紹一下, 如果還有時間的話, 把我目前所完成的最複雜的SD節點: Canny Edge Detect也給寫了吧.
推薦閱讀: