Dream Shader
by roomyrooms
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.2.2/pixi.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/pixi-filters@latest/dist/pixi-filters.js"></script>
<script type="x-data-url" id="tree-url">
...
JavaScript
var treeUrl = document.getElementById('tree-url').textContent;
var treeImg = document.getElementById('tree-preview');
var lightUrl = document.getElementById('light-url').textContent;
var lightImg = document.getElementById('light-preview');
treeImg.src = treeUrl;
lightImg.src = lightUrl;
var fragmentShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform float time;
void main() {
vec4 ogcol = texture2D(uSampler, vTextureCoord);
gl_FragColor = ogcol;
}`
function defaultValue(inputValue, defaultValue) {
inputValue = typeof inputValue !== 'undefined' ? inputValue : defaultValue;
return inputValue;
}
function LightFilter() {
PIXI.Filter.call(this,undefined,fragmentShader);
this.uniforms.time = performance.now()
}
LightFilter.prototype = Object.create(PIXI.Filter.prototype);
LightFilter.prototype.constructor = LightFilter;
LightFilter.prototype.apply = function (filterManager, input, output, clear) {
clear = PIXI.CLEAR_MODES;
this.uniforms.time = performance.now();
// draw the filter...
filterManager.applyFilter(this, input, output, clear);
}
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(treeImg);
var treeTexture = new PIXI.Texture(treeBaseTexture);
var treeSprite = new PIXI.Sprite(treeTexture);
var bgBaseTexture = new PIXI.BaseTexture(lightImg);
var bgTexture = new PIXI.Texture(bgBaseTexture);
var bgSprite = new PIXI.TilingSprite(bgTexture);
var darkTexture = new PIXI.Texture(PIXI.Texture.WHITE);
var darkSprite = new PIXI.TilingSprite(darkTexture);
darkSprite.width = 512
darkSprite.height = 512
darkSprite.alpha = 1
darkSprite.tint = 0x221133
bgSprite.width = 512
bgSprite.height = 512
// ADDITIVE blend mode for pretty intersecting lights
// move a little bit one light...