pixi.js: 如何绘制容器轮廓同时保持其内容透明

pixi.js: how to draw outline of container while keeping its content transparent

我有一个容器,其中包含几个包含圆圈的图形。我只想渲染这个容器的轮廓,而不渲染图形本身。

我设法使用 OutlineFilter 绘制轮廓,并使用 AlphaFilter 使容器透明,但无论我以何种顺序添加过滤器,都不能同时使用这两种方法.

这在技术上是不可能的,就像您打算那样做。一个着色器(pixi.js 过滤器)不知道前一个着色器,例如在何处绘制轮廓或原始纹理 alpha 是什么。

或者,您可以使用实现该效果的新着色器创建新滤镜。我基于 OutlineFilter:

varying vec2 vTextureCoord;
uniform sampler2D uSampler;

uniform vec2 thickness;
uniform vec4 outlineColor;
uniform vec4 filterClamp;

const float DOUBLE_PI = 3.14159265358979323846264 * 2.;

void main(void) {
    vec4 ownColor = texture2D(uSampler, vTextureCoord);
    vec4 curColor;
    float maxAlpha = 0.;
    vec2 displaced;
    for (float angle = 0.; angle <= DOUBLE_PI; angle += 0.1) {
        displaced.x = vTextureCoord.x + thickness.x * cos(angle);
        displaced.y = vTextureCoord.y + thickness.y * sin(angle);
        curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));
        maxAlpha = max(maxAlpha, curColor.a);
    }
    float resultAlpha = maxAlpha * step(ownColor.a, 0.0) > 0. ? 1. : 0.0;

    gl_FragColor = vec4(outlineColor.rgb * resultAlpha, resultAlpha);
}

pixi-filters 演示中的示例结果: