extends Node2D @onready var sim_viewport := $SubViewport @onready var display_sprite := $Sprite2D var tex_a: Texture2D var tex_b: Texture2D var swap = false func _ready(): # Create textures tex_a = ImageTexture.create_from_image( Image.create(sim_viewport.size.x, sim_viewport.size.y, false, Image.FORMAT_RGBAF) ) tex_b = tex_a.duplicate() # Assign one texture to the simulation shader as input $SubViewport/ColorRect.material.set("shader_parameter/trail_tex", tex_a) display_sprite.texture = tex_a func _process(_delta): # Swap textures each frame swap = !swap var src = tex_a if swap else tex_b var dst = tex_b if swap else tex_a # Assign src as input and dst as render target $SubViewport/ColorRect.material.set("shader_parameter/trail_tex", src) sim_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS display_sprite.texture = dst