Portal Shader
by roomyrooms
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.2.2/pixi.min.js"></script>
JavaScript
var fragmentShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform sampler2D uAstral;
uniform float time;
void main() {
vec4 newcol = texture2D(uSampler, vTextureCoord);
vec2 coord = vec2(vTextureCoord.x+0.255, vTextureCoord.y+0.26);
float wavewidth = 0.004;
coord += sin(time*0.005 + (55.0 * vTextureCoord.x))*wavewidth;
float blackval = distance(newcol.rgb, vec3(1.0));
if (blackval >= 1.72 && newcol.a > 0.1) {
newcol = texture2D(uAstral, coord);
newcol *= 1.0-smoothstep(0.45, 0.47, vTextureCoord.y);
}
gl_FragColor = newcol;
}`
function defaultValue(inputValue, defaultValue) {
inputValue = typeof inputValue !== 'undefined' ? inputValue : defaultValue;
return inputValue;
}
function AstralFilter(uTex) {
PIXI.Filter.call(this,undefined,fragmentShader);
this.uniforms.uAstral = uTex;
this.uniforms.time = performance.now();
}
AstralFilter.prototype = Object.create(PIXI.Filter.prototype);
AstralFilter.prototype.constructor = AstralFilter;
AstralFilter.prototype.apply = function (filterManager, input, output, clear) {
clear = PIXI.CLEAR_MODES;
this.padding = 5;
this.uniforms.time = performance.now();
// draw the filter...
filterManager.applyFilter(this, input, output);
}
PIXI.settings.MIPMAP_TEXTURES = PIXI.MIPMAP_MODES.ON;
var stage = new PIXI.Container();
// create a renderer instance.
var renderer = PIXI.autoDetectRenderer(512, 512);
renderer.roundPixels = true;
PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST;
// tex creation
var treeBaseTexture = new PIXI.BaseTexture(treeUrl);
var treeTexture = new PIXI.Texture(treeBaseTexture);
var treeSprite = new PIXI.TilingSprite(treeTexture, 256, 256);
var punchBaseTexture = new PIXI.BaseTexture(punchUrl);
var punchTexture = new PIXI.Texture(punchBaseTexture);
var punchSprite = new PIXI.Sprite(punchTexture, 256, 256);
var baseTexture = new PIXI.Texture(PIXI.Texture.WHITE);
var baseSprite = new...