Here is a complete live example: Edit fiddle - JSFiddle - Code Playground
And the plain code:
let camera, scene, renderer;
init().then( render );
async function init() {
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.01, 10);
scene = new THREE.Scene();
renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const loader = new THREE.TextureLoader();
const texture = await loader.loadAsync('https://threejs.org/examples/textures/uv_grid_opengl.jpg');
//scene.background = texture;
scene.background = blurTexture( texture );
}
function blurTexture(texture) {
const width = texture.image.width;
const height = texture.image.height;
const cameraRTT = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
const sceneRTT = new THREE.Scene();
// render targets
const renderTargetTemp = new THREE.WebGLRenderTarget(width, height);
const renderTargetFinal = new THREE.WebGLRenderTarget(width, height);
// shader materials
const hBlurMaterial = new THREE.ShaderMaterial({
vertexShader: THREE.HorizontalBlurShader.vertexShader,
fragmentShader: THREE.HorizontalBlurShader.fragmentShader,
uniforms: THREE.UniformsUtils.clone(THREE.HorizontalBlurShader.uniforms)
});
hBlurMaterial.uniforms.tDiffuse.value = texture;
hBlurMaterial.uniforms.h.value = 1 / width;
const vBlurMaterial = new THREE.ShaderMaterial({
vertexShader: THREE.VerticalBlurShader.vertexShader,
fragmentShader: THREE.VerticalBlurShader.fragmentShader,
uniforms: THREE.UniformsUtils.clone(THREE.VerticalBlurShader.uniforms)
});
vBlurMaterial.uniforms.tDiffuse.value = renderTargetTemp.texture;
vBlurMaterial.uniforms.v.value = 1 / height;
// fullscreen quad
const planeGeometry = new THREE.PlaneGeometry(2, 2);
const fullScreenQuad = new THREE.Mesh(planeGeometry, hBlurMaterial);
sceneRTT.add(fullScreenQuad);
// first pass
renderer.setRenderTarget(renderTargetTemp);
renderer.render(sceneRTT, cameraRTT);
renderer.setRenderTarget(null);
// second pass
fullScreenQuad.material = vBlurMaterial;
renderer.setRenderTarget(renderTargetFinal);
renderer.render(sceneRTT, cameraRTT)
renderer.setRenderTarget(null);
//
return renderTargetFinal.texture;
}
function render() {
renderer.render(scene, camera);
}