Mask in shader Language Some skill for creating mask

看了下面的 shadertoy 的一些隨筆。

https://www.shadertoy.com/view/4lfSzs

準備一個隨時間變化的 noise (3d or 4d)。

劃出實心、有漸層環的圖案

我們把 UV (0,0) 設定在畫面中心,length 為 UV 離中心的長度。

da = length – 0.4;

color = vec4(da);

實心半徑是 0.4,漸層到無限遠,依距離數值為距離減 0.4,可視圓半徑是 1.4。

劃出實心、有噪音加漸層的圖案

接上例

da = da – r * noise( uv );

實心區數值原本就小於 0,所以再減也不會變。

漸層區半徑最多會增加 r,因為 noise [0…1]。

r 也用來調整噪音的強度。

只對灰色有效的過度曝光

接上例,零乘零是零、一乘一是一,所以只有灰階會變。

da = clamp( 0, 1, da );

da = da * 20.;

實心處不會變,半徑一樣是 0.4,漸層大於 0.05 的都會變成 1,只留下邊緣近黑處。

同樣做漸層,用減的和用乘的有甚麼差別?

下圖

db = db / 0.4;

做出沒有實心的漸層,半徑為 0.4。

這種作法也能加半徑為 1.25 的漸層圈,實心半徑依然是 0.4;

db = db – 1.25;

也可以減小漸層圈,如果是黑的,再乘也是零,但如果是 0.5 以上的就會變白色。這是常用技巧。

db = db * 2.0;

其實沒差別。

舉例來說,我先 d – 0.4 做 0.4 實心,1.0 漸層的圈圈,然後我希望漸層是 0.4 就再除 0.4。

也可以先 ( d / 0.4 ) 做漸層 0.4,再減一,變實心 1.0 漸層 0.4。

( d – 0.4 ) / 0.4 = ( d / 0.4 ) – 1.0

是一樣的圖。

黑白反轉

接上,黑白反轉技巧,先把大於 1 的都變 1,小於 0 的都變 0,然後再反轉。

db = clamp( 0, 1, d );

db = smoothstep(1, 0, d);

同樣的 da 也反轉

白乘白是白,黑乘黑是黑,只有灰乘灰才有效果

da * db

外圈是漸層加噪音,酷。