Tool to simplify writing shaders for HTML Image and Canvas elements.
Written in Typescript and ships with all types.
This class class creates a webgl context and texture from a given HTMLImageElement
or HTMLCanvasElement
as
well as a fragment shader.
The shader is wrapped with the necessery definitions and functions to render the image.
import { ImageShader } from "image-shader";
const source = new Image();
source.src = "some/url.png";
// Shader to only render the red channel of the image.
const shader = `
void main() {
vec4 pixel = getPixel();
gl_FragColor = vec4( pixel.r, 0, 0, 1 );
}
`;
const image = new ImageShader( source, shader );
document.body.appendChild( image.domElement );
new ImageShader( source, shader )
where source
is either a HTMLImageElement
or a HTMLCanvasElement
and the
shader
is a string in form of webgl
shader. This means it has to include a void main()
method in which or
subsequently from which the gl_FragColor
is set.
For a list of available variables and methods within the shader see below.
domElement
: Returns aHTMLCanvasElement
in the size of the source image containing the shaded image.width
: Returns the width of the content.height
: Returns the height of the content.uniforms
: Returns a readonly object which contains all uniforms. Setting additional uniforms is enabled by adding more values on this object:
const image = new ImageShader( source, fragment );
image.uniforms.time = 2340;
image.uniforms.anchor = [ 23, 45 ];
image.render();
dispose()
: Releases all memory. Since it uses WebGL internally, simply losing the reference will not clear all memory.render()
: Re-renders the image. Should only be used after uniforms have been changed. Calling the method otherwise is safe, but potentially wasteful.
The passed in shader, used as a fragment shader for the image, ships with some uniforms and helper methods:
sampler2D image
: The image/canvas in question as texture.vec2 resolution
: The size of the image.vec2 uv
: The UV coordinates of the current fragment.
vec4 getPixel()
: Returns the pixel for the current fragment. For instance:gl_FragColor = getPixel()
simply renders the image unaltered.vec4 getPixel( vec2 uv )
: Returns the image pixel at the given UV coordineats.vec4 getPixelXY( vec2 coords )
: Returns the image pixel at the given coordinates in pixels.