iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 20
2
Modern Web

PixiJS,方便好用的 WebGL 內容產生工具系列 第 20

[PixiJS - Day-20] 在 PixiJS 裡使用 Filters 與 Shader

  • 分享至 

  • xImage
  •  

本篇會講在 PixiJS 裡使用 濾鏡Shader
方便理解,分做兩個部分:

  • PixiJS 已寫好,可直接使用的濾鏡
  • 手寫 Shader,實際上也是以濾鏡的方式掛進元件裡

PixiJS 的範例裡,將濾鏡相關的範例都放在 FILTERS 裡,
本文沒有依照範例順序,使用我理解的方式說明

1. FILTERS - Filter:
http://pixijs.io/examples/#/filters/filter.js
alt
看起來好像有點華麗,實際上是使用 PIXI.filters.ColorMatrixFilter

12. var filter = new PIXI.filters.ColorMatrixFilter();
...
38. app.stage.filters = [filter];

濾鏡的使用方式,是將可視元素的實體套上濾鏡

12行: 這個例子裡使用的濾鏡是 PIXI.filters.ColorMatrixFilter
38行: app.stage 使用剛剛的 PIXI.filters.ColorMatrixFilter 當濾鏡

filters: Array (PIXI.Filter) 是陣列,可以套複數組濾鏡

前文 提到,app.stage 的類別是 PIXI.containers,而所有可視物件幾乎都是繼承自 PIXI.containers 類別
幾乎等同於所有可以放到場景上的物件都可以套用濾鏡

2. FILTERS - BLUR:
http://pixijs.io/examples/#/filters/blur-filter.js
alt
將兩組可視物件分別套上 BlurFilter
隨著時間更新時,分別調整兩組物件的模糊參數

3. FILTERS - Outline:
http://pixijs.io/examples/#/filters/outline-filter.js
alt
這個案例使用了 OutlineFilterGlowFilter 兩種濾鏡
當滑鼠滑到兔子上的時候,會切換成紅色的 GlowFilter 濾鏡,一般與滑出時的濾鏡是綠色的 OutlineFilter 濾鏡

4. FILTERS - Displacement Map:
http://pixijs.io/examples/#/filters/displacement-map.js
alt
這個範例使用了 DisplacementFilter 濾鏡

其他濾鏡:
alt
http://pixijs.download/dev/docs/PIXI.filters.html
在本文撰寫的時候,目前有的濾鏡是這8個,並不是非常多

NoiseFilter:
alt
http://pixijs.download/dev/docs/PIXI.filters.NoiseFilter.html
範例沒有提到但可能會用到的濾鏡,使用後會套上雜質


手寫 Shader :
手寫 Shader 可以指定為濾鏡的一種
由於難度比較高,在本文裡放在下方

兩個範例:
BASIC - Custom Filter
alt
http://pixijs.io/examples/#/basics/custom-filter.js

原始碼:

13. PIXI.loader.add('shader', 'required/assets/basics/shader.frag')
14.     .load(onLoaded);
15. 
16. var filter;
17. 
18. // Handle the load completed
19. function onLoaded (loader,res) {
20. 
21.     // Create the new filter, arguments: (vertexShader, framentSource)
22.     filter = new PIXI.Filter(null, res.shader.data);
23
24.     // Add the filter
25.     background.filters = [filter];
...
29. }

在這個範例裡:
13行: 使用 loader 讀取 shader.frag,並命名為 'shader'使用
22行: 將剛剛讀入的 'shader' 設定為濾鏡

FILTERS - Mouse blending
alt
http://pixijs.io/examples/#/filters/filter-mouse.js

10. var shaderFrag = `
11. precision mediump float;
12.   
13. uniform vec2 mouse;
14. uniform vec2 resolution;
15. uniform float time;
16. 
17. void main() {
18.   //pixel coords are inverted in framebuffer
19.   vec2 pixelPos = vec2(gl_FragCoord.x, resolution.y - gl_FragCoord.y);
20.   if (length(mouse - pixelPos) < 25.0) {
21.       gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0) * 0.7; //yellow circle, alpha=0.7
22.   } else {
23.       gl_FragColor = vec4( sin(time), mouse.x/resolution.x, mouse.y/resolution.y, 1) * 0.5; // blend with underlying image, alpha=0.5
24.   }
25. }
26. `;
27. 
28. var container = new PIXI.Container();
29. container.filterArea = app.screen;
30. app.stage.addChild(container);
31. var filter = new PIXI.Filter(null, shaderFrag);
32. container.filters = [filter];

與前一個例子差不多,
這個範例是直接將 shader 的內容放在程式碼裡
13行: var filter = new PIXI.Filter(null, shaderFrag);


兩個手寫 Shader 的範例,都有將值傳進 Shader 內運算
關於寫 Shader 的方式,就不在系列文裡說明了


上一篇
[PixiJS - Day-19] 在 PixiJS 裡材質的其他用法
下一篇
[PixiJS - Day-21] 看起來像用了骨塊工具的 Strip 範例 與 Spine 範例
系列文
PixiJS,方便好用的 WebGL 內容產生工具31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言