WebGL effects for React elements
REACT-VFX
WebGL effects for React elements!!
Install
npm i -S react-vfx
Usage
REACT-VFX exports VFXSpan
, VFXImg
and VFXVideo
.
These components works just like <span>
, <img>
and <video>
- accepts all properties they have, but they are rendered in WebGL world with shader effects!
import * as VFX from 'react-vfx';
export default () => (
<VFX.VFXProvider>
{/* Render text as image, then apply the shader effect! */}
<VFX.VFXSpan shader="rainbow">Hi there!</VFX.VFXSpan>
{/* Render image with shader */}
<VFX.VFXImg src="cat.png" alt="image" shader="rgbShift"/>
{/* It also supports animated GIFs! */}
<VFX.VFXImg src="doge.gif" shader="pixelate"/>
{/* and videos! */}
<VFX.VFXVideo src="mind_blown.mp4"
autoplay playsinline loop muted
shader="halftone"/>
</VFX.VFXProvider>
);
NOTE: VFXSpan
doesn't work if the content includes child nodes.
// OK
<a href="https://example.com"><VFXSpan>Yo</VFXSpan></a>
// NG: link styles are not rendered correctly
<VFXSpan><a href="https://example.com">Yo</a></VFXSpan>
Custom Shader
import { VFXSpan } from 'react-vfx';
const blink = `
uniform vec2 resolution;
uniform vec2 offset;
uniform float time;
uniform sampler2D src;
void main() {
vec2 uv = (gl_FragCoord.xy - offset) / resolution;
gl_FragColor = texture2D(src, uv) * step(.5, fract(time));
}
`;
export default = () => (
<VFXSpan shader={blink}></VFXSpan>
);
Future work
- Passing custom uniforms
- Passing custom textures