renderTransmissionPass method

void renderTransmissionPass(
  1. List<RenderItem> opaqueObjects,
  2. List<RenderItem> transmissiveObjects,
  3. Object3D scene,
  4. Camera camera,
)

Implementation

void renderTransmissionPass(List<RenderItem> opaqueObjects, List<RenderItem> transmissiveObjects, Object3D scene, Camera camera) {
			final overrideMaterial = scene is Scene? scene.overrideMaterial : null;

			if ( overrideMaterial != null ) {
				return;
			}

			if ( currentRenderState?.state.transmissionRenderTarget[ camera.id ] == null ) {
				currentRenderState?.state.transmissionRenderTarget[ camera.id ] = WebGLRenderTarget( 1, 1, WebGLRenderTargetOptions({
					'generateMipmaps': true,
					'type': ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,
					'minFilter': LinearMipmapLinearFilter,
					'samples': 4,
					'stencilBuffer': stencil,
					'resolveDepthBuffer': false,
					'resolveStencilBuffer': false,
        'colorSpace': ColorManagement.workingColorSpace.toString(),
      }));
			}

			final RenderTarget transmissionRenderTarget = currentRenderState?.state.transmissionRenderTarget[ camera.id ];

			final activeViewport = camera.viewport ?? _currentViewport;
			transmissionRenderTarget.setSize( (activeViewport.z * transmissionResolutionScale).toInt(), (activeViewport.w * transmissionResolutionScale).toInt());

			//

			final currentRenderTarget = getRenderTarget();
			setRenderTarget( transmissionRenderTarget );

			getClearColor( currentClearColor );
			currentClearAlpha = getClearAlpha();
			if ( currentClearAlpha < 1 ) setClearColor( Color.fromHex32(0xffffff), 0.5 );
			clear();

    if ( renderBackground ) background.render( scene );

			// Turn off the features which can affect the frag color for opaque objects pass.
			// Otherwise they are applied twice in opaque objects pass and transmission objects pass.
			final currentToneMapping = toneMapping;
			toneMapping = NoToneMapping;

			// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).
			// Transmission render pass requires viewport to match the transmissionRenderTarget.
			final currentCameraViewport = camera.viewport;
			if ( camera.viewport != null ) camera.viewport = null;

			currentRenderState?.setupLightsView( camera );

			if ( _clippingEnabled == true ) clipping.setGlobalState( clippingPlanes, camera );

			renderObjects( opaqueObjects, scene, camera );

			textures.updateMultisampleRenderTarget( transmissionRenderTarget );
			textures.updateRenderTargetMipmap( transmissionRenderTarget );

			if (!extensions.has( 'WEBGL_multisampled_render_to_texture' ) ) { // see #28131
				bool renderTargetNeedsUpdate = false;

				for ( int i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
					final renderItem = transmissiveObjects[ i ];

					final object = renderItem.object;
					final geometry = renderItem.geometry;
					final material = renderItem.material;
					final group = renderItem.group;

					if ( material!.side == DoubleSide && object!.layers.test( camera.layers ) ) {
						final currentSide = material.side;

						material.side = BackSide;
						material.needsUpdate = true;

						renderObject( object, scene, camera, geometry!, material, group );

						material.side = currentSide;
						material.needsUpdate = true;

						renderTargetNeedsUpdate = true;
					}
				}

				if ( renderTargetNeedsUpdate == true ) {
					textures.updateMultisampleRenderTarget( transmissionRenderTarget );
					textures.updateRenderTargetMipmap( transmissionRenderTarget );
				}
			}

			setRenderTarget( currentRenderTarget );
			setClearColor( currentClearColor, currentClearAlpha );

			if (currentCameraViewport != null) camera.viewport = currentCameraViewport;

			toneMapping = currentToneMapping;
}