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;
			}

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

			if ( currentRenderState?.state.transmissionRenderTarget[ camera.id ] == null ||
      (activeViewport.w.toInt() != transmissionRenderTarget?.height || activeViewport.z.toInt() != transmissionRenderTarget?.width)
    ) {
      transmissionRenderTarget?.dispose();
      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(),
      }));

      transmissionRenderTarget = currentRenderState?.state.transmissionRenderTarget[ camera.id ];
			}

			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;
}