#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); }