playcanvas
Version:
PlayCanvas WebGL game engine
56 lines (54 loc) • 1.86 kB
JavaScript
var wgsldofBlurPS = `
#if defined(NEAR_BLUR)
var nearTexture: texture_2d<f32>;
var nearTextureSampler: sampler;
#endif
var farTexture: texture_2d<f32>;
var farTextureSampler: sampler;
var cocTexture: texture_2d<f32>;
var cocTextureSampler: sampler;
uniform kernel: array<vec2f, {KERNEL_COUNT}>;
uniform blurRadiusNear: f32;
uniform blurRadiusFar: f32;
varying uv0: vec2f;
@fragment
fn fragmentMain(input: FragmentInput) -> FragmentOutput {
var output: FragmentOutput;
let coc: vec2f = textureSample(cocTexture, cocTextureSampler, input.uv0).rg;
let cocFar: f32 = coc.r;
var sum: vec3f = vec3f(0.0, 0.0, 0.0);
#if defined(NEAR_BLUR)
let cocNear: f32 = coc.g;
if (cocNear > 0.0001) {
let nearTextureSize: vec2f = vec2f(textureDimensions(nearTexture, 0));
let step: vec2f = cocNear * uniform.blurRadiusNear / nearTextureSize;
for (var i: i32 = 0; i < {KERNEL_COUNT}; i = i + 1) {
let uv: vec2f = uv0 + step * uniform.kernel[i].element;
let tap: vec3f = textureSampleLevel(nearTexture, nearTextureSampler, uv, 0.0).rgb;
sum = sum + tap;
}
sum = sum * f32({INV_KERNEL_COUNT});
} else
#endif
if (cocFar > 0.0001) {
let farTextureSize: vec2f = vec2f(textureDimensions(farTexture, 0));
let step: vec2f = cocFar * uniform.blurRadiusFar / farTextureSize;
var sumCoC: f32 = 0.0;
for (var i: i32 = 0; i < {KERNEL_COUNT}; i = i + 1) {
let uv: vec2f = uv0 + step * uniform.kernel[i].element;
var tap: vec3f = textureSampleLevel(farTexture, farTextureSampler, uv, 0.0).rgb;
let cocThis: f32 = textureSampleLevel(cocTexture, cocTextureSampler, uv, 0.0).r;
tap = tap * cocThis;
sumCoC = sumCoC + cocThis;
sum = sum + tap;
}
if (sumCoC > 0.0) {
sum = sum / sumCoC;
}
sum = sum / cocFar;
}
output.color = vec4f(sum, 1.0);
return output;
}
`;
export { wgsldofBlurPS as default };