iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
1
Modern Web

寫給工程師的 WebGL 學習心得系列 第 25

[WebGL - Day25] Metaball (2/2) - 在 Shadertoy 上實作與可應用效果

  • 分享至 

  • xImage
  •  

接著來到 Metaball 的 Shader 實作


Metaball 可應用的方式:

可能跳得有點快,但以下這個確實是 Metabal 效果可應用的方式
スプレディ株式会社[Spready Inc.]
スプレディ株式会社[Spready Inc.]

在 Shadertoy 上實作:

先帶入幾個先前提到的部分

1- 畫圓:

前一篇的 CSS 濾鏡實作:Metaball & goo effect Experiment
CSS Metaball

如同 CSS 的效果,先畫出大圓與幾個小圓:

float Circle(vec2 uv, vec2 p , float r, float blur){
    float d = length(uv-p);
    float c = smoothstep(r, r-blur, d);
    return c;
}
// ...
float c1 = Circle(uv, vec2( 0., 0.), .4, .2);
float c2_1 = Circle(uv, vec2( .65, 0.), .15, .1);
float c2_2 = Circle(uv, vec2( -.65, -.1), .17, .1);
float c2_3 = Circle(uv, vec2( .35, .3), .12, .1);
float c2_4 = Circle(uv, vec2( -.45, -.3), .08, .1);

vec3 col = vec3(c1+c2_1+c2_2+c2_3+c2_4);

Shadertoy Metaball-1

2- 帶入 iTime:

由於 cos() 會回傳 -1 ~ 1,乘上 座標 時,
就會是繞著中間跑的運動了 (目前正中間為座標 (0, 0))

float c1 = Circle(uv, vec2( 0., 0.), .4, .2);
float c2_1 = Circle(uv, vec2( .65, 0.)* cos(iTime), .15, .1);
float c2_2 = Circle(uv, vec2( -.65, -.1)* cos(iTime), .17, .1);
float c2_3 = Circle(uv, vec2( .35, .3)* cos(iTime), .12, .1);
float c2_4 = Circle(uv, vec2( -.45, -.3)* cos(iTime), .08, .1);

Shadertoy Metaball-2

  • 由於球與球的值 相加,交界處已有一些效果

3- 使用不同的速度:

調整輸入 cos( iTime) 的值,就能製作不同速度的效果

float c1 = Circle(uv, vec2( 0., 0.), .4, .2);
float c2_1 = Circle(uv, vec2( .65, 0.)* cos(iTime*1.5), .15, .1);
float c2_2 = Circle(uv, vec2( -.65, -.1)* cos(iTime*1.3), .17, .1);
float c2_3 = Circle(uv, vec2( .35, .3)* cos(iTime*1.8), .12, .1);
float c2_4 = Circle(uv, vec2( -.45, -.3)* cos(iTime*1.1), .08, .1);

Shadertoy Metaball-2

4- 加入增加對比的效果:

如先前篇提到,
增加對比 可以透過調整曲線輸入值輸出值 來完成
Photoshop filter curves

vec3 col = vec3(c1+c2_1+c2_2+c2_3+c2_4);
col = smoothstep(.4, .6, col);

程式碼裡我將 輸入值輸出值 定在 .4.6
實作出 加強對比 的效果
Shadertoy Metaball-3

5- 換一種動法:

我想做出另一種動態的感覺,調整運動公式

float c1 = Circle(uv, vec2( 0., 0.), .4, .2)*.5;
float c2_1 = Circle(uv, vec2( cos(iTime)*.15+.15, sin(iTime)*.25), .15, .1);
  • 大球 c1 我乘上 .5降低透明度 方便調整位置
  • 小球 c2_1 的座標我使用 vec2( cos(iTime)*.15+.15, sin(iTime)*.25) 來定位置

Shadertoy Metaball-4

繞著圓圈轉的公式:
cos(值) 乘上半徑,並加上旋轉中心點,取得 x 座標
sin(值) 乘上半徑,並加上旋轉中心點,取得 y 座標

6- 多幾顆球:

  • 將大球的透明度調整回來
  • 增加幾顆球
  • 調整球的半徑與位置

Shadertoy Metaball-5


7- 延伸成遮罩:

由於畫出來的圖是 黑白Meatball 效果
直接拿來當 遮罩,並將影片帶入:
Shadertoy Metaball-6
就是 Metaball 遮罩影片 了!


Demo 裡隨著 iTime 更新的只有 旋轉座標
實際上 旋轉速度圓球半徑旋轉路徑 都可以隨著 iTime 改變
會更漂亮!


上一篇
[WebGL - Day24] Metaball (1/2) - 原理與在 Photoshop 實作
下一篇
[WebGL - Day26] Displacement Filter (1/3) 原理
系列文
寫給工程師的 WebGL 學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言