shaders/varianceBlur.tstypescript
import { ShaderProgram } from "../webgl/ShaderProgram";
import shadowDefines from "./common/shadowDefines.glsl";
export function varianceBlur(): ShaderProgram {
return new ShaderProgram("varianceBlur", {
uniforms: {
u_textureArray: "sampler2darray",
u_layer: "int",
u_direction: "vec2"
},
attributes: {
corners: "vec2"
},
vertexShader: `#version 300 es
in vec2 corners;
out vec2 v_uv;
void main(void) {
v_uv = corners * 0.5 + 0.5;
gl_Position = vec4(corners, 0.0, 1.0);
}`,
fragmentShader: `#version 300 es
precision highp float;
precision highp sampler2DArray;
in vec2 v_uv;
out vec4 fragColor;
uniform sampler2DArray u_textureArray;
uniform int u_layer;
uniform vec2 u_direction;
${shadowDefines}
void main(void) {
vec2 texelSize = 1.0 / vec2(textureSize(u_textureArray, 0).xy);
vec4 sum = vec4(0.0);
for (int i = -VARIANCE_BLUR_RADIUS; i <= VARIANCE_BLUR_RADIUS; i++) {
vec2 uv = v_uv + u_direction * texelSize * float(i);
sum += texture(u_textureArray, vec3(uv, float(u_layer)));
}
fragColor = sum / float(VARIANCE_BLUR_RADIUS * 2 + 1);
}`
});
}