---
title: "Smoother Pixel Art with RIFE: Behind Bunny Hop’s Animation Update | Zorse Blog"
description: How we used RIFE to fill the gaps between Bunny Hop’s original poses, then recovered transparency, restored crisp pixels, and repaired a robot’s smile.
canonical: https://zorse.io/blog/smoother-pixel-art-with-rife
last-updated: 2026-10-17
---

# Smoother Pixel Art with RIFE: Behind Bunny Hop’s Animation Update

1.  [Blog](https://zorse.io/blog)
2.  Smoother Pixel Art with RIFE: Behind Bunny Hop’s Animation Update

Devlog

By [Austin Greco](https://zorse.io/about) · October 17, 2026

![Sunny follows matching jump arcs on two blue glass platforms: held original poses appear as ghosts on the left, while added in-between drawings stay solid on the right](https://zorse.io/assets/bunny-hop-rife-hero.CRbVR1vD.png)

A few extra frames can change how a character feels. In Bunny Hop’s animation update, we kept the original poses and added the movement between them. Here’s how a frame interpolation model helped—and why its output still needed careful work.

Same hop. A closer look.

Before holds the original poses; After adds the accepted in-betweens. Each side uses the same clock and hop path, rendered directly at 60fps with 6x nearest-neighbor pixel enlargement. These are controlled sprite demonstrations, not gameplay captures. Poses still hold between drawings.

[Sunny: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/yellow.mp4) · [Video poster](https://zorse.io/assets/rife/yellow.b0815f1a.png)

**Sunny** Sunny’s yellow palette on the original 22x22 logical grid. [Open video.](https://zorse.io/media/rife/yellow.mp4)

[Slimey: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/frog.mp4) · [Video poster](https://zorse.io/assets/rife/frog.e073a140.png)

**Slimey** Watch the charge, takeoff, and change from rising to falling. [Open video.](https://zorse.io/media/rife/frog.mp4)

[Robot: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/robot.mp4) · [Video poster](https://zorse.io/assets/rife/robot.e77380a2.png)

**Robot** The accepted frames keep the original head rigid as the body moves. [Open video.](https://zorse.io/media/rife/robot.mp4)

[Piggy: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/pig2.mp4) · [Video poster](https://zorse.io/assets/rife/pig2.4adfe50f.png)

**Piggy** Piggy’s original poses beside the accepted charging and jumping frames. [Open video.](https://zorse.io/media/rife/pig2.mp4)

[Cactus Jack: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/cactus3.mp4) · [Video poster](https://zorse.io/assets/rife/cactus3.c8091e83.png)

**Cactus Jack** Cactus Jack’s charge, leap, and landing, at the same zoom and timing. [Open video.](https://zorse.io/media/rife/cactus3.mp4)

[Joey: original poses on the left, accepted in-between animation on the right, rendered at 60fps](https://zorse.io/media/rife/roo.mp4) · [Video poster](https://zorse.io/assets/rife/roo.c0a7a220.png)

**Joey** Joey’s charge and hop, with the two versions kept right beside each other. [Open video.](https://zorse.io/media/rife/roo.mp4)

## The drawings were already there

Bunny Hop’s characters already had a small set of expressive poses: idle, two charging poses, jumping up, and falling down. Those drawings do a lot with very little space. But switching directly between them can make a charge or jump feel abrupt.

We wanted to keep that character and add a little continuity. The first experiment started with Bunny’s existing jump poses, asking whether a model could provide useful in-betweens without replacing the drawings that defined the animation.

![Bunny’s five original pixel-art poses: two charge poses, idle, falling, and rising](https://zorse.io/media/blog/bunny-hop-rife/source-poses.png)

The original Bunny poses, enlarged so the pixels are visible. Each source PNG is 44x44 pixels, but Bunny’s artwork follows a 22x22 logical grid: each drawn pixel occupies a 2x2 block.

## Three frames between two poses

We used [RIFE](https://rife-vfi.github.io/), a frame interpolation model that estimates an image between two input frames. For our sprites, the useful question was simple: what should the character look like a quarter, halfway, and three-quarters through a pose change?

For each pair, we enlarged the source images eight times using nearest-neighbor sampling, from 44x44 to 352x352. We then asked RIFE for frames at 25%, 50%, and 75%. The endpoints stayed the original art; only the three middle frames were generated.

That produced a five-frame sequence we could inspect. It also gave us a manageable unit of work: one transition, with its starting pose and destination always visible beside the proposed movement.

## Getting our pixels back

The first obstacle was transparency. This version of the tool processes color without transparency, so we needed a separate way to recover each sprite’s transparent background and partially transparent edges.

We tested separate black and white backgrounds to reconstruct transparency. Those runs produced mismatched limbs and holes. For Bunny, a single green background worked better: we composited the enlarged sprite onto green, interpolated it, then recovered foreground color and coverage from the result.

Other characters needed different handling. A green background is not a universal solution for a cast with green bodies and many different palettes. We used each character’s original colors to estimate which pixels belonged to the sprite and how transparent they should be. Some palettes made that calculation reliable; others required an approximation. Blobby needed particular care to keep its translucent green body and opaque black details.

Recovered transparency still left soft edges and blended shades. We reduced the result to the character’s logical grid, mapped colors back to its source palette, and restored the appropriate outline. For Bunny, that meant returning to the 22x22 grid before enlarging to the final 44x44 frame.

![Bunny charging contact sheet with raw, grid-snapped, and crisp rows, showing original endpoints and three intermediate frames](https://zorse.io/media/blog/bunny-hop-rife/charge-contact-sheet.png)

A charging experiment, from raw output to grid-snapped and crisp variants. The source poses sit at either end. These are offline processing comparisons, not gameplay captures. [View the full-size sheet.](https://zorse.io/media/blog/bunny-hop-rife/charge-contact-sheet.png)

Outline restoration recolored existing boundary pixels rather than growing the silhouette. It helped the frames read like the source art, but it could not decide whether an eye, mouth, or foot was in the right place. A valid palette is only one part of a convincing drawing.

## The robot needed its own fix

Robot made that limitation especially clear. Its head was identical across all five original poses, yet interpolation could change the smile and lose eye pixels during charging. Smoother movement was not worth a face that changed along the way.

We kept the original 22x13 head and interpolated its position instead. The body still used RIFE’s frames outside the area we corrected around the head and neck. On the crisp frames, the head’s placement snapped to native pixels.

![Enlarged Robot charging midpoint before and after preserving the original rigid head](https://zorse.io/media/blog/bunny-hop-rife/robot-head-before-after.png)

Robot’s charging midpoint before and after the head correction. The repair preserves the source eyes and smile while letting the body move. [View the full-size comparison.](https://zorse.io/media/blog/bunny-hop-rife/robot-head-before-after.png)

That was a specific repair for a specific design. It did not make every character’s face or limbs immune to distortion. Large pose changes still show some morphing, and characters such as Walrus, Lucky, and King Crab exposed color or shape artifacts. We reviewed the frames with those limitations in view.

## From an experiment to the game

The work expanded to all **32 active characters**, adding **870 intermediate frames** while preserving **161 original pose sources**. Puppy’s extra idle pose accounts for the source count exceeding five per character.

Transitions cover charge entry, charging, early and full-charge takeoff, ascent to descent, landing, and cancellation. Whenever movement runs backward between a pair of poses, the game reuses the same frames in reverse. That avoids generating two slightly different versions of the same motion.

The imported PNGs have recorded hashes—digital fingerprints that let the asset build detect when a source pose has changed and its in-between frames need updating. The build checks those records and packs the accepted frames into the shared sprite atlas, the texture that holds the game’s sprites.

Inside the game, a controller selects the frames using gameplay time and keeps the player and glow in step. The added drawings smooth the pose changes without changing the jump’s physics. The Ready demonstration uses the same animation infrastructure.

There was a cost: the shared atlas grew from 2048x1024 to 2048x2048, increasing its decoded RGBA texture budget from **8 MiB to 16 MiB**. More frames were useful, but they were not free.

## What we took from it

RIFE gave us a useful starting point for motion between drawings we already liked. The rest of the workflow mattered just as much: preserving endpoints, recovering transparency, respecting each sprite’s grid, comparing variants, and checking the result in the renderer.

The most useful repairs came from looking closely at what made each character recognizable. Sometimes that meant restoring an outline. For Robot, it meant keeping the head exactly as drawn. The model supplied possibilities; the source art and the game determined which ones belonged.

See the [Bunny Hop 1.7.0 release post](https://zorse.io/news/bunny-hop-1-7-0) for the wider update, or [try Bunny Hop](https://zorse.io/games/bunny-hop) to see the animation in motion.

## Tools used

The in-between frames were generated with RIFE v4.6 via [rife-ncnn-vulkan](https://github.com/nihui/rife-ncnn-vulkan).

[← All posts](https://zorse.io/blog) · [Play Bunny Hop](https://zorse.io/games/bunny-hop)

Source: [Smoother Pixel Art with RIFE: Behind Bunny Hop’s Animation Update](https://zorse.io/blog/smoother-pixel-art-with-rife)
