Back to shaders
Shader test bench
Double Vision.fs
runnable fragment
Complete GLSL fragment shader. Stronghold runs it directly when the browser can compile it.
Code
uniform sampler2D inputImage;
uniform float hShift;
uniform float vShift;
uniform float mixAmount1;
uniform float mixAmount2;
precision mediump float;
/*{
"CATEGORIES": [
"Stylize"
],
"CREDIT": "by VIDVOX",
"INPUTS": [
{
"NAME": "inputImage",
"TYPE": "image"
},
{
"DEFAULT": 0,
"LABEL": "H Shift",
"MAX": 0.05,
"MIN": -0.05,
"NAME": "hShift",
"TYPE": "float"
},
{
"DEFAULT": 0,
"LABEL": "V Shift",
"MAX": 0.05,
"MIN": -0.05,
"NAME": "vShift",
"TYPE": "float"
},
{
"DEFAULT": 0.5,
"LABEL": "Shift Mix",
"MAX": 1,
"MIN": 0,
"NAME": "mixAmount1",
"TYPE": "float"
},
{
"DEFAULT": 0.5,
"LABEL": "Original Mix",
"MAX": 1,
"MIN": 0,
"NAME": "mixAmount2",
"TYPE": "float"
}
],
"ISFVSN": "2"
}
*/
void main()
{
vec2 loc = (gl_FragCoord.xy / u_resolution.xy);
vec2 shift = vec2(hShift, vShift);
// zoom slightly so that there aren't out of range pixels
float zoomAmount = 1.0 + 2.0 * max(hShift, vShift);
vec2 modifiedCenter = vec2(0.5,0.5);
loc.x = (loc.x - modifiedCenter.x)*(1.0/zoomAmount) + modifiedCenter.x;
loc.y = (loc.y - modifiedCenter.y)*(1.0/zoomAmount) + modifiedCenter.y;
vec4 color = texture2D(inputImage, (gl_FragCoord.xy / u_resolution.xy));
vec4 colorL = texture2D(inputImage, clamp(loc - shift,0.0,1.0));
vec4 colorR = texture2D(inputImage, clamp(loc + shift,0.0,1.0));
vec4 outColor = mix(min(colorL, colorR), max(colorL, colorR), mixAmount1);
outColor = mix(min(outColor, color), max(outColor, color), mixAmount2);
gl_FragColor = outColor;
}