diff --git a/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl b/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl index c08260051ff0c9b45ef33674b9879498e0a1f57b..db93eb05e8f2a637739baa20b2590b5ad3b8dc1f 100644 --- a/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl +++ b/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl @@ -6,49 +6,69 @@ in vec2 varTexcoord; vec2 imgSize = vec2( textureSize( image_sampler, 0 ) ); const int halfsize = 40; -const float dirFactor = 1.; +const float dirFactor = 0.5; const float randCeil = 0.3; +#if 1 float rand( vec2 co ) { return fract( sin( dot( co.xy, vec2( 12.9898, 78.233 ) ) ) * 43758.5453 ); } float whiteNoise( in vec2 at ) { return ( rand( floor( at * randCeil ) / imgSize ) ); } +#else +// noise (hash) functions : taken from https://www.shadertoy.com/view/4djSRW +float hash12(vec2 p) +{ + vec3 p3 = fract(vec3(p.xyx) * .1031); + p3 += dot(p3, p3.yzx + 33.33); + return fract((p3.x + p3.y) * p3.z); +} + +#define ITERATIONS 1 +float whiteNoise( in vec2 at ) { + float a = 0.0; + for (int t = 0; t < ITERATIONS; t++) { + float v = float(t+1)*.152; + vec2 pos = (at * v + 1517.01); + a += hash12(pos); + } + return a/float(ITERATIONS); +} +#undef ITERATIONS +#endif // desc : texture that contains direction to convolve // invertdir invert (i.e. perpendicular) direction vec4 lic( in sampler2D desc, in bool invertdir ) { - vec2 coord; - vec2 dir = texelFetch( desc, ivec2( gl_FragCoord.xy ), 0 ).xy; + if (length(dir) == 0) {return vec4 (0);} + if ( invertdir ) dir = vec2( dir.y, -dir.x ); vec4 res = vec4( whiteNoise( gl_FragCoord.xy ) ); - vec2 currentdir; - vec2 tmpdir; - coord = gl_FragCoord.xy; - currentdir = dir; - for ( int i = 1; i <= halfsize; i++ ) + vec2 currentdir = dir; + vec2 coord = gl_FragCoord.xy; + + for ( int i = 0; i < halfsize; i++ ) { - coord = coord + dirFactor * vec2( currentdir.x, currentdir.y ); + coord = coord + dirFactor * currentdir; res += vec4( whiteNoise( coord ) ); - tmpdir = texelFetch( desc, ivec2( coord ), 0 ).xy; - if ( invertdir ) tmpdir = vec2( tmpdir.y, -tmpdir.x ); - currentdir = tmpdir; + currentdir = texelFetch( desc, ivec2( coord ), 0 ).xy; + if ( invertdir ) currentdir = vec2( currentdir.y, -currentdir.x ); } coord = gl_FragCoord.xy; currentdir = dir; - for ( int i = 1; i <= halfsize; i++ ) + for ( int i = 0; i < halfsize; i++ ) { - coord = coord - dirFactor * vec2( currentdir.x, currentdir.y ); + coord = coord - dirFactor * currentdir; res += vec4( whiteNoise( coord ) ); - tmpdir = texelFetch( desc, ivec2( coord ), 0 ).xy; - if ( invertdir ) tmpdir = vec2( tmpdir.y, -tmpdir.x ); - currentdir = tmpdir; + currentdir = texelFetch( desc, ivec2( coord ), 0 ).xy; + if ( invertdir ) currentdir = vec2( currentdir.y, -currentdir.x ); } + res = res / ( 2.0f * float( halfsize ) + 1.0f ); return smoothstep( 0.1, 0.9, res ); } @@ -70,5 +90,5 @@ void main() { out_color = vec4(result / (4 * half_width * half_width), 1); */ - out_color = lic( image_sampler, true ); + out_color = lic( image_sampler, false ); }