JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-beta1/jquery.min.js"></script>
<script id="2d-vertex-shader" type="x-shader/x-vertex">
attribute vec2 a_position;
attribute vec2 a_texCoord;
uniform vec2 u_resolution;
uniform float u_flipY;
varying vec2 v_texCoord;
void main() {
// convert the rectangle from pixels to 0.0 to 1.0
vec2 zeroToOne = a_position / u_resolution;
// convert from 0->1 to 0->2
vec2 zeroToTwo = zeroToOne * 2.0;
// convert from 0->2 to -1->+1 (clipspace)
vec2 clipSpace = zeroToTwo - 1.0;
gl_Position = vec4(clipSpace * vec2(1, u_flipY), 0, 1);
// pass the texCoord to the fragment shader
// The GPU will interpolate this value between points.
v_texCoord = a_texCoord;
}
</script>
<!-- fragment shader -->
<script id="2d-fragment-shader" type="x-shader/x-fragment">
precision mediump float;
// our texture
uniform sampler2D u_image;
uniform vec2 u_textureSize;
uniform float u_kernel[9];
// the texCoords passed in from the vertex shader.
varying vec2 v_texCoord;
void main() {
vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;
vec4 colorSum =
texture2D(u_image, v_texCoord + onePixel * vec2(-1, -1)) * u_kernel[0] +
texture2D(u_image, v_texCoord + onePixel * vec2( 0, -1)) * u_kernel[1] +
texture2D(u_image, v_texCoord + onePixel * vec2( 1, -1)) * u_kernel[2] +
texture2D(u_image, v_texCoord + onePixel * vec2(-1, 0)) * u_kernel[3] +
texture2D(u_image, v_texCoord + onePixel * vec2( 0, 0)) * u_kernel[4] +
texture2D(u_image, v_texCoord + onePixel * vec2( 1, 0)) * u_kernel[5] +
texture2D(u_image, v_texCoord + onePixel * vec2(-1, 1)) * u_kernel[6] +
texture2D(u_image, v_texCoord + onePixel * vec2( 0, 1)) * u_kernel[7] +
texture2D(u_image, v_texCoord + onePixel * vec2( 1, 1)) * u_kernel[8] ;
float kernelWeight =
u_kernel[0] +
u_kernel[1] +
u_kernel[2] +
u_kernel[3] +
u_kernel[4] +
u_kernel[5]...
JavaScript
var $ = window.$;
$(function(){
'use strict';
main();
});
var gl = null, originalImageTexture = null, image = {}, imgEff = '', flipYLocation = null, canvas = null, resolutionLocation, kernelLocation, program, positionLocation;
//Define several convolution kernels
var kernels = {
normal: [
0, 0, 0,
0, 1, 0,
0, 0, 0
],
gaussianBlur: [
0.045, 0.122, 0.045,
0.122, 0.332, 0.122,
0.045, 0.122, 0.045
],
gaussianBlur2: [
1, 2, 1,
2, 4, 2,
1, 2, 1
],
gaussianBlur3: [
0, 1, 0,
1, 1, 1,
0, 1, 0
],
unsharpen: [
-1, -1, -1,
-1, 9, -1,
-1, -1, -1
],
sharpness: [
0,-1, 0,
-1, 5,-1,
0,-1, 0
],
sharpen: [
-1, -1, -1,
-1, 16, -1,
-1, -1, -1
],
edgeDetect: [
-0.125, -0.125, -0.125,
-0.125, 1, -0.125,
-0.125, -0.125, -0.125
],
edgeDetect2: [
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
],
edgeDetect3: [
-5, 0, 0,
0, 0, 0,
0, 0, 5
],
edgeDetect4: [
-1, -1, -1,
0, 0, 0,
1, 1, 1
],
edgeDetect5: [
-1, -1, -1,
2, 2, 2,
-1, -1, -1
],
edgeDetect6: [
-5, -5, -5,
-5, 39, -5,
-5, -5, -5
],
sobelHorizontal: [
1, 2, 1,
0, 0, 0,
-1, -2, -1
],
sobelVertical: [
1, 0, -1,
2, 0, -2,
1, 0, -1
],
previtHorizontal: [
1, 1, 1,
0, 0, 0,
-1, -1, -1
],
previtVertical: [
1, 0, -1,
1, 0, -1,
1, 0, -1
],
boxBlur: [
0.111, 0.111, 0.111,
0.111, 0.111, 0.111,
0.111, 0.111, 0.111
],
triangleBlur: [
0.0625, 0.125, 0.0625,
0.125, 0.25, 0.125,
0.0625, 0.125, 0.0625
],
emboss: [
-2, -1, 0,
-1, 1, 1,
0, 1, 2
]
};
var textures = [];
var framebuffers = [];
function main() {
image = new Image();
image.src =...