Created
May 12, 2017 10:31
-
-
Save kasperkamperman/71b67f91445fc5993f90573c0e48a03e to your computer and use it in GitHub Desktop.
Port of fxaa.glsl code from Reinder Nijhoff to Processing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Created by Reinder Nijhoff 2016 | |
| // @reindernijhoff | |
| // | |
| // https://www.shadertoy.com/view/ls3GWS | |
| // FXAA code from: http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/ | |
| // | |
| // ported to work in Processing by Kasper Kamperman.com | |
| #define FXAA_SPAN_MAX 8.0 | |
| #define FXAA_REDUCE_MUL (1.0/FXAA_SPAN_MAX) | |
| #define FXAA_REDUCE_MIN (1.0/128.0) | |
| #define FXAA_SUBPIX_SHIFT (1.0/4.0) | |
| #ifdef GL_ES | |
| precision mediump float; | |
| #endif | |
| uniform sampler2D texture; | |
| uniform vec2 texOffset; | |
| varying vec4 vertColor; | |
| varying vec4 vertTexCoord; | |
| uniform vec2 u_resolution; | |
| uniform vec3 u_mouse; | |
| uniform float u_time; | |
| // Layer between Processing and Shadertoy uniforms | |
| vec3 iResolution = vec3(u_resolution,0.0); | |
| //float iGlobalTime = u_time; | |
| //vec4 iMouse = vec4(u_mouse,0.0); // zw would normally be the click status | |
| vec2 rcpFrame = 1./iResolution.xy; | |
| vec3 FxaaPixelShader( vec4 uv ) { | |
| //vec3 rgbNW = texture2DLodEXT(tex, uv.zw, 0.0).xyz; | |
| //vec3 rgbNE = texture2DLodEXT(tex, uv.zw + vec2(1,0)*rcpFrame.xy, 0.0).xyz; | |
| //vec3 rgbSW = texture2DLodEXT(tex, uv.zw + vec2(0,1)*rcpFrame.xy, 0.0).xyz; | |
| //vec3 rgbSE = texture2DLodEXT(tex, uv.zw + vec2(1,1)*rcpFrame.xy, 0.0).xyz; | |
| //vec3 rgbM = texture2DLodEXT(tex, uv.xy, 0.0).xyz; | |
| vec3 rgbNW = texture2D(texture, uv.zw).rgb; | |
| vec3 rgbNE = texture2D(texture, uv.zw + vec2(1,0)*rcpFrame.xy).rgb; | |
| vec3 rgbSW = texture2D(texture, uv.zw + vec2(0,1)*rcpFrame.xy).rgb; | |
| vec3 rgbSE = texture2D(texture, uv.zw + vec2(1,1)*rcpFrame.xy).rgb; | |
| vec3 rgbM = texture2D(texture, uv.xy).rgb; | |
| vec3 luma = vec3(0.299, 0.587, 0.114); | |
| float lumaNW = dot(rgbNW, luma); | |
| float lumaNE = dot(rgbNE, luma); | |
| float lumaSW = dot(rgbSW, luma); | |
| float lumaSE = dot(rgbSE, luma); | |
| float lumaM = dot(rgbM, luma); | |
| float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); | |
| float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); | |
| vec2 dir; | |
| dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); | |
| dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); | |
| float dirReduce = max( | |
| (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), | |
| FXAA_REDUCE_MIN); | |
| float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce); | |
| dir = min(vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX), | |
| max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), | |
| dir * rcpDirMin)) * rcpFrame.xy; | |
| // vec3 rgbA = (1.0/2.0) * ( | |
| // texture2DLodEXT(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).xyz + | |
| // texture2DLodEXT(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).xyz); | |
| // vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( | |
| // texture2DLodEXT(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).xyz + | |
| // texture2DLodEXT(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).xyz); | |
| vec3 rgbA = (1.0/2.0) * ( | |
| texture2D(texture, uv.xy + dir * (1.0/3.0 - 0.5)).rgb + | |
| texture2D(texture, uv.xy + dir * (2.0/3.0 - 0.5)).rgb); | |
| vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( | |
| texture2D(texture, uv.xy + dir * (0.0/3.0 - 0.5)).rgb + | |
| texture2D(texture, uv.xy + dir * (3.0/3.0 - 0.5)).rgb); | |
| float lumaB = dot(rgbB, luma); | |
| if((lumaB < lumaMin) || (lumaB > lumaMax)) return rgbA; | |
| return rgbB; | |
| } | |
| //void mainImage( out vec4 fragColor, in vec2 gl_gl_FragCoord ) | |
| void main(void) | |
| { | |
| //vec3 pixelColor; | |
| vec2 uv2 = gl_FragCoord.xy / iResolution.xy; | |
| vec3 col; | |
| //texture2D(srcSampler, src).rgb; | |
| //texture2D(texture, vertTexCoord.st).rgb; | |
| //if( uv2.x < splitCoord/iResolution.x ) { | |
| // 0.25 | |
| vec4 uv = vec4( uv2, uv2 - (rcpFrame * (0.5 + FXAA_SUBPIX_SHIFT))); | |
| col = FxaaPixelShader(uv); | |
| gl_FragColor = vec4( col, 1. ); | |
| // write pixel | |
| //gl_FragColor = vec4(pixelColor, 1.0); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment