Trying to use the transparent background with some post effect like the Unreal Bloom, SMAA and Tonemapping provided in the examples but it seems to break the transparency from my render.
renderer = new THREE.WebGLRenderer({ canvas, alpha: true }); renderer.setClearColor(0xFF0000, 0); composer = new EffectComposer(renderer); composer.addPass(new RenderPass(scene, camera)); // Bloom pass canvasSize = new THREE.Vector2(canvas.width, canvas.height); pass = new UnrealBloomPass(canvasSize, strength, radius, threshhold); composer.addPass(pass); // SMAA pass size = canvasSize.multiplyScalar(this.renderer.getPixelRatio()); pass = new SMAAPass(size.x, size.y); pass.renderToScreen = true composer.addPass(pass); // Tonemapping renderer.toneMappingExposure = exposure; renderer.toneMappingWhitePoint = whitePoint; renderer.toneMapping = type; composer.render();
If I deactivate the bloom pass I get a correct transparent background but when activated, I obtain a black background. I looked at the sources and it seems that it should correctly handle alpha texture channel as the format is set correctly to THREE.RGBAFormat
.
Edit: After some research, I found where does this comes from. It comes from getSeperableBlurMaterial
in jspostprocessingUnrealBloomPass.js.
The fragment’s alpha channel is always set to 1.0 which results in a complete removal of the previous alpha values when doing the additive blending at the end.
The cool thing would be to find a proper way to apply the alpha inside the Gaussian blur. Any idea how ?
Advertisement
Answer
I found a solution and this can be sorted like this : https://github.com/mrdoob/three.js/issues/14104
void main() { vec2 invSize = 1.0 / texSize; float fSigma = float(SIGMA); float weightSum = gaussianPdf(0.0, fSigma); float alphaSum = 0.0; vec3 diffuseSum = texture2D(colorTexture, vUv).rgb * weightSum; for( int i = 1; i < KERNEL_RADIUS; i ++ ) { float x = float(i); float weight = gaussianPdf(x, fSigma); vec2 uvOffset = direction * invSize * x; vec4 sample1 = texture2D( colorTexture, vUv + uvOffset); float weightAlpha = sample1.a * weight; diffuseSum += sample1.rgb * weightAlpha; alphaSum += weightAlpha; weightSum += weight; vec4 sample2 = texture2D( colorTexture, vUv - uvOffset); weightAlpha = sample2.a * weight; diffuseSum += sample2.rgb * weightAlpha; alphaSum += weightAlpha; weightSum += weight; } alphaSum /= weightSum; diffuseSum /= alphaSum; // Should apply discard here if alphaSum is 0 gl_FragColor = vec4(diffuseSum.rgb, alphaSum); }