2D Noise Outline How to draw 2D Noise Outline and Common Use Case

這是我在 PTT 發表的文章的備份。

綱要

這篇文章將會講到:

  1. 如何畫 2d noise outline (外框?)
  2. 2d noise outline 有甚麼常見應用。

準備

經過了前一篇,
應該都能畫得出下面類似的 2d noise

View post on imgur.com

不管是用 Game Engine 給的現成 noise,
或是抄來的 shader 寫出來的都行,
反正畫得出來就好。

如果畫不出來,這裡有個現成的 (不是我寫的)

https://www.shadertoy.com/view/Wt2czD

noise outline

假設產生 noise 的 code 長得像這樣:

float noise( vec2 uv )
{
// create noise from uv
}

void fragment( out vec4 COLOR, vec2 UV )
{
vec2 uv = UV; // uv 應該要隨著螢幕長寬更改比例

// 產生一個黑白的 noise 畫面
float n = noise(uv);
COLOR.rgb = vec3(n);
}

原始畫面是

View post on imgur.com

現在加一行,把 code 改成:

float n = noise(uv);
// =========== magic formula =========== //
n = 0.3 * 0.09 / (0.3-n);
// ===================================== //
COLOR.rgb = vec3(n);

畫面就會變成

View post on imgur.com

將將將! 劃出外框了! 就這麼簡單 XD

把 0.3 / 0.09 / 0.3 這三個參數改一改,
會出現其他各種效果,
有空可以試試。

應用

所以畫了 outline 又能怎樣呢?

其實有不少實用的地方。

舉例來說,第一個:

『水滴效果』

View post on imgur.com

這是把螢幕當鏡頭,
模擬鏡頭上有水珠的樣子。

因為水珠的外圈折射率大,中心折射率小,
跟外框的顏色 —
靠外面比較白 (接近1),靠中間比較灰 (接近0) 類似。

假設背景是 TEXTURE,最後一行改成下面這樣就可以了。

// 將 uv 往 vec2(1,1) 的方向偏移 0%~25%
// 並取得偏移點的 pixel
COLOR = texture(TEXTURE, (UV + vec2(n) / 4.));

View post on imgur.com

可以加上時間讓水滴往下流,
也可以用 3d noise 讓水滴變形,
模擬真實的下雨景色。

第二個例子

『水底的光影』

https://imgur.com/SbxNQxT (影片)

這只是把 2d noise 變 3d,然後乘上顏色,
會放在游泳池或是水底,造成水底的光影效果。

// code 節錄是這樣
float n = noise3d( vec3(uv, TIME));
// =========== magic formula =========== //
n = 0.3 * 0.09 / (0.3-n);
// ===================================== //
COLOR.rgb = vec3(1.) * n * 0.6 + vec3(.1, .2, .4) * 1.4;

第三個例子

『閃電』

https://imgur.com/HMLoRoQ (影片)

乍看之下好像和外框無關,
但我改一下參數。

View post on imgur.com

這樣應該就看出來了,
這是類似的外框效果。