PixiJS 內建一些濾鏡:
PIXI.filters - Classes:
AlphaFilter、BlurFilter、BlurFilterPass、
ColorMatrixFilter、DisplacementFilter、FXAAFilter、NoiseFilter
本篇介紹其中 AlphaFilter 的實作
先照著 Basic - PixiJS Examples來畫隻兔子:
const bunny = PIXI.Sprite.from('examples/assets/bunny.png');
app.stage.addChild(bunny);
畫了隻兔子,然後放到場景上
(PIXI.Sprite.from 是 v5 的寫法,與 v4 不太相同)
如果要調整透明度,只需要:
bunny.alpha = 0.5;
設定物件的 alpha 屬性就可以了,不使用濾鏡
使用濾鏡的話,也不會太麻煩
const alphaFilter = new PIXI.filters.AlphaFilter();
bunny.filters = [alphaFilter];
調整 alphaFilter 的值有兩個方法:
alphaFilter.alpha = 0.5;
或
alphaFilter.uniforms.uAlpha = 0.5;
意思是相同的
直接看原始碼 filter-alpha src :
import { Filter, defaultVertex } from '@pixi/core';
import fragment from './alpha.frag';
export class AlphaFilter extends Filter
{
    /**
     * @param {number} [alpha=1] Amount of alpha from 0 to 1, where 0 is transparent
     */
    constructor(alpha = 1.0)
    {
        super(defaultVertex, fragment, { uAlpha: 1 });
        this.alpha = alpha;
    }
    /**
     * Coefficient for alpha multiplication
     *
     * @member {number}
     * @default 1
     */
    get alpha()
    {
        return this.uniforms.uAlpha;
    }
    set alpha(value) // eslint-disable-line require-jsdoc
    {
        this.uniforms.uAlpha = value;
    }
}
其中的 getter 與 setter 便是 fragment shader 的 uniform float uAlpha
再往上看一點:
import { Filter, defaultVertex } from '@pixi/core';
import fragment from './alpha.frag';
...
super(defaultVertex, fragment, { uAlpha: 1 });
這是 PixiJS 濾鏡的基本寫法:
new Filter(vertShader, fragShader, myUniforms);
這個 alphaFilter 裡:
昨天提到 fragment shader 輸出 gl_FragColor
gl_FragColor // vec4
如果要輸出半透明黃色
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0) * 0.7; //yellow circle, alpha=0.7
雖然輸出顏色很像 vec4(RGBA),但實際上是vec4(vec3(RGB),1.0)*A;
vec4(1.0, 1.0, 0.0, 1.0) *
0.7; // 正確,alpha 值最後再乘
vec4(1.0, 1.0, 0.0,0.7); // 錯的
Fragment Shader 的 alpha.frag 原始碼:
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform float uAlpha;
void main(void)
{
   gl_FragColor = texture2D(uSampler, vTextureCoord) * uAlpha;
}
vTextureCoord 是 varying 的 Storage Qualifiers 變數,
表示這是從 Vertex Shader 傳過來的值
最常使用的情形是,搭配 vTextureCoord,回傳濾鏡本身的原圖:
gl_FragColor = texture2D(uSampler, vTextureCoord);
最後乘上 uAlpha ,就是 alphaFilter 了!
補充:
昨天 Mouse Blending 範例 裡,實際上是把濾鏡加在一個空白容器裡,因此不需要輸出原圖