const app = new PIXI.Application({ transparent: true }); document.body.appendChild(app.view); // Create background image const background = PIXI.Sprite.from('/moban/bg_grass.jpg'); background.width = app.screen.width; background.height = app.screen.height; app.stage.addChild(background); // Stop application wait for load to finish app.stop(); app.loader.add('shader', '/moban/shader.frag') .load(onLoaded); let filter; // Handle the load completed function onLoaded(loader, res) { // Create the new filter, arguments: (vertexShader, framentSource) filter = new PIXI.Filter(null, res.shader.data, { customUniform: 0.0, }); // === WARNING === // specify uniforms in filter constructor // or set them BEFORE first use // filter.uniforms.customUniform = 0.0 // Add the filter background.filters = [filter]; // Resume application update app.start(); } var i=0; // Animate the filter app.ticker.add((delta) => { i+=0.03; filter.uniforms.customUniform = i; });
precision mediump float; varying vec2 vTextureCoord; varying vec4 vColor; uniform sampler2D uSampler; uniform float customUniform; const float speed = 0.2; const float frequency = 8.0; vec2 shift( vec2 p ) { float x = frequency * (p.x + customUniform*speed); float y = frequency * (p.y + customUniform*speed); vec2 q = cos( vec2( cos(x-y)*cos(y), sin(x+y)*sin(y) ) ); return q; } void main(void) { vec2 r = vTextureCoord; vec2 p = shift( r ); r += 1.0; vec2 q = shift(r);
//改600.0改小可以增大效果 float amplitude = 2.0 / 600.0; vec2 s = vTextureCoord + amplitude * (p - q); s.y = 1. - s.y; // flip Y axis for ShaderToy gl_FragColor = texture2D( uSampler, s ); }