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]; }); })()