What if you could dynamically adjust the resolution or scale of a Viewport in real-time, based on camera movement or zoom level. So you could adjust to the zoom and make it as sharp or blury as you wanted?
I have no idea this would work. But, what if Instead of relying only on ProjectSettings.display/window, explicitly set the Viewport’s size:
$PlayerViewport.size = get_viewport().size
Do this in _ready() or on window resize.
Now Let’s say you have a Viewport inside a ViewportContainer, and a Camera2D moving in and out.
Scene Setup
Main (Node2D)
├── Camera2D
├── ViewportContainer
│ └── Viewport (named PlayerViewport)
│ └── PlayerScene
Script on Your Main Node
@onready var player_viewport := $ViewportContainer/PlayerViewport
@onready var player_camera := $Camera2D
func _process(delta):
var zoom_level = player_camera.zoom.length()
# The more you zoom in, the higher the viewport resolution
var base_res = Vector2(480, 272)
var scaled_res = base_res * clamp(zoom_level, 0.5, 2.0)
player_viewport.size = scaled_res.floor()
This maybe should increases or decreases the resolution of the Viewport as the camera zooms in or out. When you zoom in (closer to subject), resolution increases = more sharpness. Zoom out = resolution drops = more blur.
Then for maybe a Smoother Transition
Instead of snapping, we interpolate smoothly:
var target_res = base_res * clamp(zoom_level, 0.5, 2.0)
player_viewport.size = player_viewport.size.lerp(target_res.floor(), 0.1)