Problem with Multisampled Renderbuffers use background-color

Hello, everyone
I try to use background-color in Css based on this demo:

  1. add background-image in #container
#container {
	position: absolute;
	top: 70px;
	width: 100%;
	bottom: 0px;
	background-image: linear-gradient(0deg,rgba(246, 255, 255,255)10%, rgba(214,255, 255,255)70%);
}
  1. canels scene.background and setClearColor
renderer.setClearColor( 0x000000 );
renderer.setClearAlpha(0.0)
  1. change material color

My final test demo is as follows

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js WebGL 2 - Multisampled Renderbuffers</title>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<link type="text/css" rel="stylesheet" href="main.css">
		<style>
			body {
				background-color: #fff;
				color: #222;
			}

			a {
				color: #08f;
			}

			#container {
				position: absolute;
				top: 70px;
				width: 100%;
				bottom: 0px;
				background-image: linear-gradient(0deg,rgba(246, 255, 255,255)10%, rgba(214,255, 255,255)70%);
			}
		</style>
	</head>

	<body>

		<div id="info">
			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - Multisampled Renderbuffers<br />
			Left: WebGLRenderTarget, Right: WebGLMultisampleRenderTarget.
		</div>
		<div id="container">
		</div>

		<!-- Import maps polyfill -->
		<!-- Remove this when import maps will be widely supported -->
		<script async src="https://unpkg.com/es-module-shims@1.8.0/dist/es-module-shims.js"></script>

		<script type="importmap">
			{
				"imports": {
					"three": "../build/three.module.js",
					"three/addons/": "./jsm/"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three';

			import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
			import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
			import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
			import WebGL from 'three/addons/capabilities/WebGL.js';
			import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

			let camera, renderer, group, container;

			let composer1, composer2;

			const params = {

				animate: true,

			};

			init();

			function init() {

				if ( WebGL.isWebGL2Available() === false ) {

					document.body.appendChild( WebGL.getWebGL2ErrorMessage() );
					return;

				}

				container = document.getElementById( 'container' );

				camera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 10, 2000 );
				camera.position.z = 500;

				const scene = new THREE.Scene();
				//scene.background = new THREE.Color( 0xffffff );
				//scene.fog = new THREE.Fog( 0xcccccc, 100, 1500 );

				//

				const hemiLight = new THREE.HemisphereLight( 0xffffff, 0x222222, 5 );
				hemiLight.position.set( 1, 1, 1 );
				scene.add( hemiLight );

				//

				group = new THREE.Group();

				const geometry = new THREE.SphereGeometry( 10, 64, 40 );
				const material = new THREE.MeshLambertMaterial( {
					color: 0xe0e0e0,
					polygonOffset: true,
					polygonOffsetFactor: 1, // positive value pushes polygon further away
					polygonOffsetUnits: 1

				} );
				const material2 = new THREE.MeshBasicMaterial( { color: 0xe0e0e0, wireframe: false } );

				for ( let i = 0; i < 50; i ++ ) {

					const mesh = new THREE.Mesh( geometry, material );
					mesh.position.x = Math.random() * 600 - 300;
					mesh.position.y = Math.random() * 600 - 300;
					mesh.position.z = Math.random() * 600 - 300;
					mesh.rotation.x = Math.random();
					mesh.rotation.z = Math.random();
					mesh.scale.setScalar( Math.random() * 5 + 5 );
					group.add( mesh );

					const mesh2 = new THREE.Mesh( geometry, material2 );
					mesh2.position.copy( mesh.position );
					mesh2.rotation.copy( mesh.rotation );
					mesh2.scale.copy( mesh.scale );
					group.add( mesh2 );

				}

				scene.add( group );

				//

				renderer = new THREE.WebGLRenderer();
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( container.offsetWidth, container.offsetHeight );
				renderer.autoClear = false;
				container.appendChild( renderer.domElement );

				renderer.setClearColor( 0x000000 );
				renderer.setClearAlpha(0.0)

				//

				const size = renderer.getDrawingBufferSize( new THREE.Vector2() );
				const renderTarget = new THREE.WebGLRenderTarget( size.width, size.height, { samples: 4 } );

				const renderPass = new RenderPass( scene, camera );
				const outputPass = new OutputPass();

				//

				composer1 = new EffectComposer( renderer );
				composer1.addPass( renderPass );
				composer1.addPass( outputPass );

				//

				composer2 = new EffectComposer( renderer, renderTarget );
				composer2.addPass( renderPass );
				composer2.addPass( outputPass );

				//

				const gui = new GUI();
				gui.add( params, 'animate' );

				//

				window.addEventListener( 'resize', onWindowResize );

				animate();

			}

			function onWindowResize() {

				camera.aspect = container.offsetWidth / container.offsetHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( container.offsetWidth, container.offsetHeight );
				composer1.setSize( container.offsetWidth, container.offsetHeight );
				composer2.setSize( container.offsetWidth, container.offsetHeight );

			}

			function animate() {

				requestAnimationFrame( animate );

				const halfWidth = container.offsetWidth / 2;

				if ( params.animate ) {

					//group.rotation.y += 0.002;

				}

				renderer.setScissorTest( true );

				renderer.setScissor( 0, 0, halfWidth - 1, container.offsetHeight );
				composer1.render();

				renderer.setScissor( halfWidth, 0, halfWidth, container.offsetHeight );
				composer2.render();

				renderer.setScissorTest( false );

			}

		</script>
	</body>
</html>

And I found mesh edges have white serrations,


I think it’s a sampling problem after multisampled was turned on,and it was highlighted by LinearTosRGB function in OutputShader.
How should I fix this problem ? Thank you very much.

Can you try setting:

renderer.premultipliedAlpha = false when you create your renderer?

https://threejs.org/docs/#api/en/renderers/WebGLRenderer.premultipliedAlpha

I’m sorry,I tried but it didn’t seem to work.

Can you try setting:

{
premultipliedAlpha:false…

when you create your renderer?

I don’t think it can be toggled on the fly.

emmmm…It’s my problem, I set the variables after creation.
And I updated the demo according to what you said, but there were other problems
The serrations seem to have turned black.


Do you have any other suggestions, thank you anyway!

Can you try:

{
alpha:true

in your renderer constructor?

It may not work.When set to true, the default clear alpha value is 0
After renderer constructor, I also setClearAlpha in demo as follows

renderer.setClearColor( 0x000000 );
renderer.setClearAlpha(0.0)

I think it’s the same work as set alpha true in renderer constructor.

Yes it same as renderer.setClearColor( 0x000000,0 ); alpha its to see html background through transparent canvas tag and maybe for keepking alpha for multytargets which not use scene.background like sky or color and etc.