pixijs解析frag并应用在图片上实例页面
回到相关文章 »效果:
//zxx: 点击画面可以暂停和播放
代码:
HTML代码:
<canvas width="640" height="431"></canvas>
JS代码:
(async () => {
// 素材资源准备
const fragUrl = './scale.frag';
const sourceUrl = './source.jpg';
// 加载frag资源,作为字符串
const frag = await fetch(fragUrl).then(res => res.text());
// 滤镜动画需要的uniform变量
const uniforms = {
scale: 1.0,
horzIntensity: 0.5,
vertIntensity: 0.5
};
// 目标缩放scale
// 可以使用 Tween.js 等库来实现动画
// https://github.com/zhangxinxu/Tween
// 这里呢,使用枚举的方式逐帧变化实现动画
const scale = [1.0,1.07,1.1,1.13,1.17,1.2,1.2,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0];
// 创建pixi绘制实例
const canvas = document.querySelector('canvas');
const view = canvas.transferControlToOffscreen()
// app 初始化
const viewWidth = canvas.width;
const viewHeight = canvas.height;
const app = new PIXI.Application({
view,
width: viewWidth,
height: viewHeight,
resolution: 1
});
// 创建图像绘制容器
const imgContainer = new PIXI.Container();
app.stage.addChild(imgContainer);
// 图片素材加载
const sprite = PIXI.Sprite.from(sourceUrl);
sprite.width = viewWidth;
sprite.height = viewHeight;
imgContainer.addChild(sprite);
// 创建自定义滤镜
const filter = new PIXI.Filter(null, frag, uniforms);
imgContainer.filters = [filter];
// 动画
let start = 0;
app.ticker.add(() => {
// 每帧更新滤镜的uniform变量
filter.uniforms.scale = scale[start++ % scale.length];
});
})()