基於substance gpu引擎的flood fill節點 演算法分析(I)
導言
substance designer最近的更新中, 個人覺得flood fill是其中最有用的之一.我在看完更新後就立刻自己試著做了一個材質, 就是封面啦......(不好看勿噴啊)
flood fill的功能是啥呢? 挺簡單的, 就和photoshop的填充油漆桶功能差不多;pixel processor在substance的基礎節點(噪音, 圖案)內部幾乎無處不在, 它的功能是同時處理輸入的圖片中每一個像素並對它賦值.說起來簡單, 真正複雜的是藏在pixel processor內部的演算法. 如上圖所示, 一共有三個演算法, 中間22個都是用的同一個(第二種)演算法. 順便一提, 這22個節點可以達到 指數級的效率. 這22接下來一個個分析.
I.第一步處理First Pass ------------ 遍歷邊緣
演算法總的思想是,
先對每個像素顏色值的頭兩項值(RGBA的R和G)設置下一個訪問的像素坐標, 如果該像素在子圖案邊緣處, 那麼就把沿著邊緣順時針下一個像素設為目標; 否則, 把右邊的像素設為目標.這樣一來, 每個子圖案內部節點就形成一個內部循環的多級鏈表, 如圖:Step 1:
這裡要強調下, 像素位置都是在0到1之間的小數, 這是和我們潛意識裡的認知是不同的, 比如這個圖是4096x4096的, 肯定第一印象就是, 從左往右第123個, 從上到下第596個像素的坐標就是像(123, 596)之類的, 其實不是的,應當為(123/4096, 596/4096); 所以每個像素邊長都為1/4096,設圖形長寬為size, 也就是1/size; 這樣整個圖就處於0-1的uv空間裡面了.
好的, 當我們獲得位置(x, y)和像素邊長w之後, 就可以通過 , 來進一步獲取其相鄰像素的位置, 以便之後用來確定RG值指向哪一個像素.(即鏈表中指向的下一像素)Step 2:(初稿在B站上發了, 感覺有問題, 就改了改)
推薦閱讀:
※4.機器學習演算法應用---損失函數
※正則表達式匹配
※九章演算法 | Google面試題:原子計數
※LeetCode 451. Sort Characters By Frequency