All posts
UnityGuide

Unity Pixel Art Setup: Fix Blurry Sprites with PPU, Point Filter and the Pixel Perfect Camera

August 26, 2026 DevLoot

You drew a crisp 32x32 sprite in Aseprite. You dragged it into Unity. It looks like someone smeared vaseline on it. Then you hit Play, the character walks left, and the outline pixels start crawling and shimmering like a bad GIF.

This is the single most common wall new 2D Unity devs hit, and almost nobody explains it in the right order. The blur and the shimmer are two different bugs with two different fixes, and if you only fix one you will chase the other for a week. Here is the whole chain, top to bottom.

Problem one: the blur (your import settings)

Unity's default sprite import settings are tuned for high resolution art, not pixel art. Three of them are actively working against you.

Filter Mode: set it to Point

Filter Mode controls how Unity samples a texture when it is not displayed at its native size. The default is Bilinear, which blends neighbouring pixels together to smooth things out. For a photo scaled up that is what you want. For a 32x32 character sprite blown up 4x on screen, it turns every hard pixel edge into a gradient. Set Filter Mode to Point (no filter) and Unity samples the nearest pixel with no blending. Hard edges stay hard.

Compression: set it to None

Unity compresses textures by default to save memory and VRAM. Block compression formats work by approximating colour across 4x4 pixel blocks, which is fine for a noisy rock texture and terrible for a sprite where every pixel was placed on purpose. You get colour banding, muddy edges, and weird halos around transparency. Set Compression to None. Pixel art textures are tiny, so the memory cost is basically nothing. This is one of the rare cases where you deliberately turn compression off. (For everything else, our breakdown of texture compression formats in Unity covers when ASTC and BC7 actually earn their keep.)

Generate Mip Maps: turn it off

Mip maps are pre-scaled smaller copies of a texture used when an object is far from the camera. In a 2D game your sprites sit at a fixed distance, so mips do nothing except occasionally kick in at the wrong moment and hand you a blurry frame. Uncheck it.

Problem two: PPU, and picking a number you can live with

Pixels Per Unit is how many texture pixels equal one Unity world unit. Default is 100. That default is arbitrary, and the number itself matters less than the fact that every single sprite in your project uses the same one. Mixed PPU values is the reason your tileset is subtly a different scale than your character.

The practical way to choose: pick the PPU that makes your smallest meaningful art unit equal one world unit. If your tiles are 16x16, use 16. If your tiles are 32x32, use 32. Then a tile is exactly one unit, your Tilemap snaps to whole numbers, and physics distances read as tile counts instead of arbitrary decimals. That pays off once you start tuning jump heights and collider sizes.

The PPU number is not a quality setting. It is a unit conversion. Pick one that makes your level grid land on whole numbers and never change it again.

If you already have a project with mixed values, fix it now rather than later. Select every sprite in the Project window at once, set PPU in the Inspector, and let Unity reimport. Doing this after you have built twenty scenes means every prefab position is wrong.

Problem three: the shimmer (the Pixel Perfect Camera)

Correct import settings give you crisp sprites standing still. They do not stop the crawling you see in motion. That happens because your reference resolution does not divide evenly into the player's screen resolution, so some pixels get drawn 3 screen pixels wide and their neighbours get 4. As the camera moves, which pixel gets the extra row keeps changing. That is the shimmer.

The fix is the Pixel Perfect Camera component, which ships in the 2D Pixel Perfect package (it is included by default in URP's 2D setup). Add it to your main camera and it handles the orthographic size math for you.

The settings that matter:

  • Asset Pixels Per Unit: match this to the PPU on your sprites. If they disagree, nothing works.
  • Reference Resolution: the resolution your art is designed for. 320x180 is the popular choice because it is 16:9 and scales to 1280x720, 1920x1080 and 3840x2160 at clean integer multiples of 4x, 6x and 12x. 480x270 gives you more screen real estate with the same clean scaling.
  • Upscale Render Texture: renders the scene to a temporary texture near your reference resolution, then scales that up. You get chunky unrotated pixels and a strong retro look. Leave it off if you want smooth camera movement or rotated sprites.
  • Pixel Snapping: only available when Upscale Render Texture is off. Snaps Sprite Renderers to a world space grid at render time so things move in whole pixel steps. It does not touch actual Transform positions, so your physics stays smooth underneath.
  • Run In Edit Mode: turn this on while you are tuning so you can see the result in Game view without pressing Play. Turn it off after.

Comparison of Unity Pixel Perfect Camera rendering with Upscale Render Texture disabled and enabled

Image credit: Unity 2D Pixel Perfect package documentation

Snap settings and pivots

Two follow ups that people skip. First, go to Edit > Snap Settings and set Move X/Y/Z to 1 divided by your PPU. At 32 PPU that is 0.03125. Unity does not apply this retroactively, so select existing objects and use Snap All Axes. Second, in the Sprite Editor set Pivot to Custom and Pivot Unit Mode to Pixels. A pivot sitting on a half pixel puts every sprite that uses it permanently off grid.

If you use Cinemachine

Cinemachine and the Pixel Perfect Camera both want to control orthographic size, and they will fight over it. Add the Cinemachine Pixel Perfect extension to your virtual cameras and the conflict goes away. Skip this and you get a camera that jitters for reasons that look impossible to debug.

Sprite atlases: do it, but pad them

Once the look is right, batching is the next thing worth your time. Every sprite from a separate texture is a separate draw call, and a busy 2D scene racks those up fast. A Sprite Atlas packs them into one texture so Unity can batch them. Our post on draw calls and batching in Unity goes deeper on why that matters on mobile.

The pixel art specific catch is padding. If sprites sit flush against each other in the atlas, sampling at the edge can pull in a pixel from the neighbour, and you get a stray coloured line along the top of your tiles. Keep at least 2 to 4 pixels of padding, keep Filter Mode Point on the atlas itself, and keep compression off there too. Tight packing saves space but can bleed, so if you see edge artifacts, switch to rectangle packing first before you go hunting elsewhere.

The five minute checklist

  1. All sprites: Filter Mode Point, Compression None, Generate Mip Maps off, same PPU.
  2. Pivots set to Custom with Pivot Unit Mode Pixels.
  3. Pixel Perfect Camera on the main camera, Asset PPU matching your sprites, reference resolution at a clean 16:9 multiple.
  4. Snap Settings set to 1 divided by PPU, then Snap All Axes on existing objects.
  5. Cinemachine Pixel Perfect extension if you use virtual cameras.
  6. Sprite Atlas with padding for batching.

Run that list before you build anything real. Retrofitting it onto a project that already has scenes, prefabs and tuned physics is a genuinely miserable afternoon, and it is the reason a lot of half finished pixel art projects quietly die.

If you are shopping for tilesets and character sprites to prototype with, check what is on DevLoot. Worth noting when you buy: ask what PPU the pack was authored at, because mixing a 16 PPU tileset with 32 PPU characters is exactly the mess this whole article is about.

Unity Pixel Art Setup: Fix Blurry Sprites with PPU, Point Filter and the Pixel Perfect Camera · DevLoot