diff --git a/denoisers/shaders/slow-bilateral.slang b/denoisers/shaders/slow-bilateral.slang new file mode 100644 index 0000000..665c027 --- /dev/null +++ b/denoisers/shaders/slow-bilateral.slang @@ -0,0 +1,82 @@ +#version 450 + +layout(push_constant) uniform Push +{ + vec4 SourceSize; + vec4 OriginalSize; + vec4 OutputSize; + uint FrameCount; + float SIGMA; + float BSIGMA; +} params; + +#pragma parameter SIGMA "Sigma" 10.0 1.0 20.0 1.0 +#pragma parameter BSIGMA "BSigma" 0.1 0.01 0.5 0.01 + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; + +#define MSIZE 15 + +float normpdf(in float x, in float sigma) +{ + return 0.39894*exp(-0.5*x*x/(sigma*sigma))/sigma; +} + +float normpdf3(in vec3 v, in float sigma) +{ + return 0.39894*exp(-0.5*dot(v,v)/(sigma*sigma))/sigma; +} + +void main() +{ + vec2 fragcoord = vTexCoord * params.OutputSize.xy; + vec3 c = texture(Source, (fragcoord.xy / params.OutputSize.xy)).rgb; + + //declare stuff + const int kSize = (MSIZE-1)/2; + float kernel[MSIZE]; + vec3 final_colour = vec3(0.0); + + //create the 1-D kernel + float Z = 0.0; + for (int j = 0; j <= kSize; ++j) + { + kernel[kSize+j] = kernel[kSize-j] = normpdf(float(j), params.SIGMA); + } + + vec3 cc; + float factor; + float bZ = 1.0/normpdf(0.0, params.BSIGMA); + //read out the texels + for (int i=-kSize; i <= kSize; ++i) + { + for (int j=-kSize; j <= kSize; ++j) + { + cc = texture(Source, (fragcoord.xy+vec2(float(i),float(j))) / params.OutputSize.xy).rgb; + factor = normpdf3(cc-c, params.BSIGMA)*bZ*kernel[kSize+j]*kernel[kSize+i]; + Z += factor; + final_colour += factor*cc; + } + } + + FragColor = vec4(final_colour/Z, 1.0); +} \ No newline at end of file diff --git a/denoisers/slow-bilateral.slangp b/denoisers/slow-bilateral.slangp new file mode 100644 index 0000000..0a74e70 --- /dev/null +++ b/denoisers/slow-bilateral.slangp @@ -0,0 +1,6 @@ +shaders = 1 + +shader0 = shaders/slow-bilateral.slang +scale_type0 = source +filter_linear0 = true +scale0 = 1.0 \ No newline at end of file