#version 150 #moj_import uniform sampler2D InSampler; layout(std140) uniform BlurConfig { vec2 BlurDir; float Radius; }; in vec2 texCoord; in vec2 sampleStep; out vec4 fragColor; // This shader relies on GL_LINEAR sampling to reduce the amount of texture samples in half. // Instead of sampling each pixel position with a step of 1 we sample between pixels with a step of 2. // In the end we sample the last pixel with a half weight, since the amount of pixels to sample is always odd (actualRadius * 2 + 1). void main() { vec4 blurred = vec4(0.0); float actualRadius = Radius >= 0.5 ? round(Radius) : float(MenuBlurRadius); for (float a = -actualRadius + 0.5; a <= actualRadius; a += 2.0) { blurred += texture(InSampler, texCoord + sampleStep * a); } blurred += texture(InSampler, texCoord + sampleStep * actualRadius) / 2.0; fragColor = blurred / (actualRadius + 0.5); }