Why Your Pixel Art Looks Blurry in Godot 4—and How to Fix It

Why Your Pixel Art Looks Blurry in Godot 4—and How to Fix It

If a sprite looks sharp in your image editor but soft in Godot, start with texture filtering. If its edges are sharp but individual pixels have uneven widths, inspect scaling instead. If it only shimmers while moving, isolate the camera and sprite transforms.

Those are three different symptoms. This guide gives you a small, repeatable comparison for Godot 4.3 and later, where integer stretch scaling is available. The linked documentation covers Godot 4.5 and 4.6; use the version selector if your editor differs.

Build a reference you can recognize

Create a transparent 16 × 16 PNG in your image editor. Draw a one-pixel white outline around its edge and alternate black and white pixels along one row. Export at the original size without resampling. This simple pattern makes blended edges and uneven pixel widths easier to see than a detailed character.

In Godot, create a Node2D scene with a Sprite2D child and assign the PNG to its Texture property. Keep its scale at (1, 1), position it at whole-number coordinates, and leave out the camera, animation, and shaders for this first comparison.

Fix soft edges on the sprite

Select Sprite2D. In the Inspector, find the inherited CanvasItem property Texture → Filter and choose Nearest. Use the Inspector search if the section is collapsed. Compare the stationary sprite before and after.

Nearest samples the nearest texture pixel; Linear blends neighboring samples. CanvasItem can also inherit filtering from its parent, which explains why two otherwise similar sprites may behave differently. See the CanvasItem filtering reference.

If this fixes the sprite, decide whether to apply Nearest locally or through the relevant parent or project default. Keep smooth filtering where the art actually needs it.

Fix uneven pixel sizes with a concrete scaling test

For a low-resolution pixel-art experiment, use these settings in Project Settings → Display → Window:

  • Viewport Width: 320; Viewport Height: 180.
  • Stretch Mode: viewport.
  • Stretch Aspect: keep.
  • Stretch Scale Mode: integer.

Center the test sprite at (160, 90). At a 960 × 540 drawable window area, the viewport scales by three: the 16-pixel sprite spans 48 screen pixels. At 1280 × 720, it scales by four and spans 64. These are arithmetic expectations, not benchmark results.

Resize the window between those sizes. With integer scaling, unused space can become borders rather than stretching each source pixel unevenly. Compare Fractional briefly to see the difference, then restore Integer. This is a starting configuration for a fixed low-resolution look, not a requirement for every 2D game. See Godot’s multiple-resolution guide.

If it only breaks while moving

Return your real artwork to the scene. Move the character while the camera stays still, then hold the character still and move the camera. Check slow horizontal and diagonal movement. This separates a static sampling issue from motion-related stepping or shimmer.

Do not add camera smoothing, position rounding, and pixel snapping in one pass. Compare each change against the same movement. A crisp screenshot cannot establish whether a moving scene looks right.

Check the result outside the editor

Run an export at your intended window sizes. Capture an unscaled screenshot and view it at 100% or a whole-number enlargement. A smoothly resized image preview can introduce softness after the game has rendered correctly.

Keep the little test pattern in your project. When a new sprite looks wrong, it gives you a reference for deciding whether the source art, filtering, scaling, or motion changed.

Looking for artwork to explore next? Browse Dongu’s Rat Packs, checking the pack’s dimensions and terms before integrating assets into your project.