You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pixi.js中渐进式滤镜实现:如何让对象逐帧自渲染叠加滤镜

嘿,这个需求我刚好折腾过,其实核心思路是用RenderTexture来缓存每帧处理后的结果,让下一帧基于这个缓存的纹理继续应用滤镜,而不是每次都用原始图片。我给你一步步拆解,代码也写得易懂点:

实现逐帧滤镜叠加的核心方案

本质就是用「离屏渲染纹理」来持续保存上一帧的处理结果,每帧都基于这个结果再叠加滤镜,具体步骤如下:

1. 基础环境初始化

先搭好Pixi的基础应用框架,加载你需要处理的图片:

// 创建Pixi应用
const app = new PIXI.Application({
    width: 800,
    height: 600,
    backgroundColor: 0x1099bb
});
document.body.appendChild(app.view);

// 加载目标图片
let originalSprite;
PIXI.Loader.shared.add('targetImg', '你的图片路径.png').load((loader, resources) => {
    originalSprite = new PIXI.Sprite(resources.targetImg.texture);
    originalSprite.position.set(100, 100);
    startFilterLoop(); // 图片加载完成后启动滤镜循环
});

2. 核心的滤镜叠加逻辑

在startFilterLoop函数里实现持续渲染的关键逻辑:

function startFilterLoop() {
    // 创建离屏渲染纹理,用来缓存每帧处理后的图像
    let renderTexture = PIXI.RenderTexture.create({
        width: originalSprite.width,
        height: originalSprite.height
    });

    // 创建容器,用来承载要应用滤镜的内容(初始是原始图片)
    const filterContainer = new PIXI.Container();
    filterContainer.addChild(originalSprite);

    // 添加你需要的滤镜,这里用模糊+色相旋转举例
    const blurFilter = new PIXI.filters.BlurFilter(0); // 初始模糊度0
    const hueFilter = new PIXI.filters.ColorMatrixFilter();
    filterContainer.filters = [blurFilter, hueFilter];

    // 创建显示用的精灵,用来展示最终的叠加效果
    const displaySprite = new PIXI.Sprite(renderTexture);
    displaySprite.position.set(100, 100);
    app.stage.addChild(displaySprite);

    // 逐帧更新的核心循环
    app.ticker.add(() => {
        // 每帧稍微增强滤镜效果(这里的参数可以根据你的需求调整)
        blurFilter.blur += 0.05;
        hueFilter.hue(2, true); // 每次旋转2度,true表示叠加之前的色相

        // 把带滤镜的容器渲染到离屏纹理上
        app.renderer.render(filterContainer, {
            renderTexture: renderTexture,
            clear: false // 重中之重!不要清空纹理,这样新效果才会叠加在旧结果上
        });

        // 更新显示精灵的纹理为最新的处理结果
        displaySprite.texture = renderTexture;
    });
}

关键细节说明

  • RenderTexture:相当于一个隐藏的画布,专门用来存储每帧处理后的图像,是实现叠加的核心载体。
  • clear: false:如果设为true,每次渲染都会清空纹理,就没法实现叠加效果了,必须设为false才能让新的滤镜效果覆盖/叠加在之前的结果上。
  • 滤镜挂载位置:把滤镜加在容器上,而不是直接加在显示精灵上,这样每次渲染容器时,都会把当前滤镜应用到容器内的内容(也就是上一帧的处理结果)上。

额外注意事项

  • 性能控制:如果图片分辨率很高,持续叠加渲染可能会消耗较多性能,可以适当缩小RenderTexture的尺寸,或者设置一个叠加上限(比如模糊到一定程度就停止增强)。
  • 重置效果:如果需要回到初始状态,只需要重新创建RenderTexture,或者把原始图片重新添加到filterContainer里即可。

内容的提问来源于stack exchange,提问作者user7706068

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:45:46