From c733ee2f46dabf6ac0a0538b373838619d72ebcc Mon Sep 17 00:00:00 2001 From: dlyr <github@dlyr.fr> Date: Wed, 14 Apr 2021 19:36:31 +0200 Subject: [PATCH] update lic image processing shader --- .../ImageProcess.frag.glsl | 117 ++++++------------ 1 file changed, 38 insertions(+), 79 deletions(-) diff --git a/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl b/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl index 0183a63..c082600 100644 --- a/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl +++ b/src/libRender/RadiumNBR/Shaders/ImageProcessingPass/ImageProcess.frag.glsl @@ -1,100 +1,63 @@ -layout (location = 0) out vec4 out_color; +layout( location = 0 ) out vec4 out_color; uniform sampler2D depth_sampler; uniform sampler2D image_sampler; in vec2 varTexcoord; +vec2 imgSize = vec2( textureSize( image_sampler, 0 ) ); +const int halfsize = 40; +const float dirFactor = 1.; +const float randCeil = 0.3; -// replace the nois texture : TODO verify the properties of the generated noise -float whiteNoise(in vec2 at, in vec2 scale) { - return (noise1 (at * scale) + 0.5) * 0.5; +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 ) ); +} + +// desc : texture that contains direction to convolve +// invertdir invert (i.e. perpendicular) direction +vec4 lic( in sampler2D desc, in bool invertdir ) { -/* -// LIC function to be adapted ... -//desc : texture de direction (vecteurs) -// invertdir pour faire "perpendiculaire" a desc, -// noise une texture de bruit "poivre et sel" -// sw, sh : screensize -vec4 lic(in sampler2D desc,in bool invertdir) { - const int halfsize = 10; vec2 coord; - vec2 dir = texture2D(desc,gl_TexCoord[0].st).xy; - //vec2 dir = texelFetch(desc,ivec2(gl_TexCoord[0].st*1.0/vec2(sw,sh)),0).xy; - if(invertdir) - dir = vec2(dir.y,-dir.x); - vec4 res = texture2D(noise,gl_TexCoord[0].st); + + vec2 dir = texelFetch( desc, ivec2( gl_FragCoord.xy ), 0 ).xy; + if ( invertdir ) dir = vec2( dir.y, -dir.x ); + + vec4 res = vec4( whiteNoise( gl_FragCoord.xy ) ); vec2 currentdir; vec2 tmpdir; - coord = gl_TexCoord[0].st; + coord = gl_FragCoord.xy; currentdir = dir; - for(int i=1;i<=halfsize;i++) { - coord = coord+vec2(currentdir.x*sw,currentdir.y*sh); - res += texture2D(noise,coord); - tmpdir = texture2D(desc,coord).xy; - //tmpdir = texelFetch(desc,ivec2(coord*1.0/vec2(sw,sh)),0).xy; - if(invertdir) - tmpdir = vec2(tmpdir.y,-tmpdir.x); - currentdir = tmpdir; - } - coord = gl_TexCoord[0].st; - currentdir = dir; - for(int i=1;i<=halfsize;i++) { - coord = coord-vec2(currentdir.x*sw,currentdir.y*sh); - res += texture2D(noise,coord); - tmpdir = texture2D(desc,coord).xy; - //tmpdir = texelFetch(desc,ivec2(coord*1.0/vec2(sw,sh)),0).xy; - if(invertdir) - tmpdir = vec2(tmpdir.y,-tmpdir.x); + for ( int i = 1; i <= halfsize; i++ ) + { + coord = coord + dirFactor * vec2( currentdir.x, currentdir.y ); + res += vec4( whiteNoise( coord ) ); + tmpdir = texelFetch( desc, ivec2( coord ), 0 ).xy; + if ( invertdir ) tmpdir = vec2( tmpdir.y, -tmpdir.x ); currentdir = tmpdir; } - res = res/(2.0f*float(halfsize)+1.0f); - return vec4(res.x); -} - -*/ - -vec4 lic(in sampler2D desc,in bool invertdir, in vec2 imgSize) { - const int halfsize = 10; - vec2 coord = varTexcoord; - vec2 dir = texture(desc,coord).xy; - if ( length(dir) <0.0001 ) - return vec4(0); - if(invertdir) - dir = vec2(dir.y,-dir.x); - float res = whiteNoise( dir, imgSize); - vec2 currentdir = dir; - - for(int i=1;i<=halfsize;i++) { - coord = coord + currentdir;//*halfsize; - currentdir = texture(desc,coord).xy; - res += whiteNoise( currentdir, imgSize); - if(invertdir) - currentdir = vec2(currentdir.y,-currentdir.x); - } - - coord = varTexcoord; + coord = gl_FragCoord.xy; currentdir = dir; - for(int i=1;i<=halfsize;i++) { - coord = coord - currentdir;//*halfsize; - currentdir = texture(desc,coord).xy; - res += whiteNoise( currentdir, imgSize); - if(invertdir) - currentdir = vec2(currentdir.y,-currentdir.x); + for ( int i = 1; i <= halfsize; i++ ) + { + coord = coord - dirFactor * vec2( currentdir.x, currentdir.y ); + res += vec4( whiteNoise( coord ) ); + tmpdir = texelFetch( desc, ivec2( coord ), 0 ).xy; + if ( invertdir ) tmpdir = vec2( tmpdir.y, -tmpdir.x ); + currentdir = tmpdir; } - res = res/(2.0f*float(halfsize)+1.0f); - return vec4(vec3(res), 0); + res = res / ( 2.0f * float( halfsize ) + 1.0f ); + return smoothstep( 0.1, 0.9, res ); } - - void main() { - vec2 imgSize = vec2(textureSize(image_sampler, 0)); /* // 4x4 filtering for test const int half_width = 2; - vec2 texelSize = 1.0 / vec2(imgSize); + vec2 texelSize = 1.0 / vec2(textureSize(image_sampler, 0)); vec3 result = vec3(0.0); for (int x = -half_width; x < half_width; ++x) { @@ -106,10 +69,6 @@ void main() { } out_color = vec4(result / (4 * half_width * half_width), 1); */ - /* - out_color = vec4( vec3( whiteNoise( varTexcoord, imgSize) ), 1); - */ - out_color = lic(image_sampler, false, imgSize); + out_color = lic( image_sampler, true ); } - -- GitLab