renderTransmissionPass method
void
renderTransmissionPass(
- List<
RenderItem> opaqueObjects, - List<
RenderItem> transmissiveObjects, - Object3D scene,
- 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;
}