Scene Transition Screenshot Issue - Overlapping Objects & Brightness Differences

Godot Version

4.2.2

Question

Hi, can anyone help me with this? I tried to do a scene transition by taking a screenshot of the viewport and then attaching it to a sprite2D. However, the objects from the next scene seems to be overlapping the image. Also the screenshot image is brighter than the viewport which could be caused by the WorldEnvironment background mode being a canvas but I’m not sure if there’s another way to create a background image in 3D.


Screenshot 2025-02-09 at 6.07.09 PM

extends Node

const transition_node_name = "transition_node"
var is_showing_transition = false
var function_to_call: Callable

var start_position := Vector2.ZERO
var end_position := Vector2.ZERO
var swipe_threshold := 100  

enum TransitionType {
	swipeLeft = 1,
	swipeRight = 2
}

func setup_sprite():
	var transition_sprite = load("res://scenes/transition_sprite.tscn").instantiate() as Sprite2D
	var image = get_viewport().get_texture().get_image()
	var transition_texture = ImageTexture.create_from_image(image)
	transition_sprite.name = transition_node_name
	transition_sprite.texture = transition_texture
	return transition_sprite

func change_scene(new_scene_location: String, transition_type: int):
	if is_showing_transition:
		return
	is_showing_transition = true
	var transition_sprite = setup_sprite()
	get_tree().change_scene_to_file(new_scene_location)
	function_to_call = show_transition.bind(transition_sprite, transition_type)
	get_tree().node_added.connect(function_to_call)

func show_transition(_new_node, transition_sprite: Sprite2D, type: TransitionType):
	if get_tree().root.get_node_or_null(transition_node_name) != null:
		return
	get_tree().root.add_child(transition_sprite)
	var transition_tween = create_tween().set_parallel()
	
	if type == TransitionType.swipeLeft:
		transition_tween.tween_property(transition_sprite, "global_position", Vector2(-1050, transition_sprite.global_position.y), 1)
	elif type == TransitionType.swipeRight:
		transition_tween.tween_property(transition_sprite, "global_position", Vector2(1050, transition_sprite.global_position.y), 2)

	transition_tween.tween_property(transition_sprite, "rotation", deg_to_rad(0), 1) 
	transition_tween.finished.connect(transition_sprite.queue_free)
	await transition_tween.finished
	
	get_tree().node_added.disconnect(function_to_call)
	is_showing_transition = false

# Detect swipe input
func _input(event):
	if event is InputEventMouseButton and event.pressed:
		start_position = event.position  # Store start position
	
	elif event is InputEventMouseMotion:
		end_position = event.position  # Update end position
	
	elif event is InputEventMouseButton and not event.pressed:
		var swipe_distance = end_position.x - start_position.x
		
		if swipe_distance < -swipe_threshold:  # Swiped left
			TransitionManager.change_scene("res://scenes/kitchen.tscn", TransitionType.swipeLeft) 
		elif swipe_distance > swipe_threshold:  # Swiped right (Fixed!)
			TransitionManager.change_scene("res://scenes/order2.tscn", TransitionType.swipeRight)