Skip to content
Techniques & Technology

Pseudo-3D Road

OutRun's famous perspective

The technique of rendering 3D-like roads using scaled 2D lines and mathematical projection, famously used in OutRun and countless racing games of the 1980s and 1990s.

cross-platform 3dracingscalingoutrunprojection 1982–present

Overview

Pseudo-3D roads create the illusion of perspective using purely 2D techniques: scaling sprites, projecting horizontal lines, and warping the road's curve segment-by-segment. Popularised by Sega's OutRun (1986), this approach enabled smooth, fast racing games on hardware that couldn't handle true 3D polygons. The look — converging road lines, scenery rushing past, hills cresting — is unmistakable, and persists today as both nostalgia and stylistic choice.

The technique blossomed because the maths is simple (scale by inverse distance), the data is small (a list of road segments), and the visual payoff is enormous. Pole Position (1982) was the first commercial pseudo-3D road; OutRun was the high-water mark; the genre lived on through the SNES and Mega Drive eras and into modern indie revivals (Slipstream, Horizon Chase).

Fast facts

AspectDetail
Defining gameOutRun (Sega, 1986)
OriginatorPole Position (Namco, 1982)
Key insightPerspective = scale by 1/distance
Hardware needsSprite scaling (Sega Super Scaler) or fast software
Modern term"Pseudo-3D" or "fake 3D" — though related to Mode 7 in spirit

The core technique

The road is rendered as a stack of horizontal "scanline" segments, each at a different depth from the camera:

ConceptImplementation
HorizonA fixed screen Y position above which sky is drawn
Near = wideAt the bottom of the screen, road is full-width
Far = narrowAt the horizon, road converges to nearly nothing
ScalingLinear interpolation between near-width and far-width based on screen Y

Each scanline below the horizon is drawn with:

ParameterFormula
Z distancecamera_height / (y_screen - horizon_y)
Scale factor1 / (y_screen - horizon_y)
Road widthbase_width × scale
X offsetaccumulated_curve × scale (see Curves below)

Creating curves

Roads curve by accumulating an X offset per segment as Z increases:

Curve typeMethod
StraightNo X offset — segments are vertically aligned
Gentle curveSmall constant X-offset added per segment
Sharp curveLarger X-offset accumulating per segment
S-curveX-offset direction reverses partway down the road

The curve "accumulator" is the secret: rather than computing each segment's curvature independently, you accumulate the X-offset as you draw segments from far to near (or near to far, depending on style). The accumulated value gives you the natural curving look.

x_offset = 0
curve_per_segment = 0.5    // positive = right curve, negative = left

for each road_segment from horizon to bottom:
    x_offset += curve_per_segment
    draw_road_at(screen_x = centre + x_offset, screen_y = current_y)

Hills and valleys

The horizon position varies to create vertical terrain:

TerrainImplementation
FlatHorizon stays at fixed Y
Crest of hillHorizon moves up; the "next" road segments come up over the rise
Valley dipHorizon moves down; you can see further down the road
Sudden hill crestHorizon snaps; road segments visible become crowded

Pre-computed hill data (per road segment, an "elevation delta") is the standard implementation.

Sprite scaling for objects

Cars, signs, trees, and roadside objects scale as you approach them:

Distance bucketScaleEffect
Far horizon10%Tiny sprites at the horizon
Mid distance50%Half-size — visible detail
Close100%Full size — about to overtake
Past camera(off-screen)Object disappears below screen

Hardware sprite scaling (Sega Super Scaler — System 16, X Board, Y Board) made this practical at arcade scale. Home ports relied on pre-scaled sprite tables in ROM (Out Run's Mega Drive port shipped multiple scaled copies of every sprite).

See Sprite Scaling for the full deep dive on this.

The OutRun innovation

OutRun combined several novel elements:

FeatureImplementation
Hardware sprite scalingCustom Sega System 16 + X Board chips
Pre-calculated curve dataRoad segments stored as track-per-track data
Parallax layersMultiple horizon backgrounds (mountains, clouds, sea) at different scroll rates
Frame rateSmooth ~30 fps even with full road traffic
Branching tracksMulti-route stage selection (left or right path at each stage end)
Music selectionPlayer picks from radio stations during gameplay

The result was so visually compelling that it defined the arcade racing genre for years.

Platform variations

PlatformApproach
Arcade (Sega)Hardware sprite scaling — Super Scaler family
SNESMode 7 — different technique, similar visual result; F-Zero, Super Mario Kart
Mega DriveSoftware pseudo-3D road; OutRunners (1992) is a showcase
C64 / SpectrumSoftware scaling, fewer sprites; Out Run home ports
AmigaBlitter-assisted scaling; Lotus Esprit Turbo Challenge (1990)
GBAAffine-mode background (Mode 7-like); Mario Kart: Super Circuit

Modern software implementation

A simplified recipe in pseudo-code:

for screen_y from horizon to bottom:
    z = camera_height / (screen_y - horizon)
    scale = 1 / (screen_y - horizon)
    
    # Curve and elevation lookups based on z
    curve_x = curve_function(z)
    elevation_y = hill_function(z)
    
    # Draw a horizontal "slice" of road at this depth
    draw_road_segment(
        y = screen_y - elevation_y,
        scale_x = base_width * scale,
        offset_x = curve_x * scale,
        colour = stripe_pattern(z)  # alternating tarmac/centre-line colours
    )

# Draw scaled sprites sorted by Z (back-to-front)
for each object sorted_by_z desc:
    draw_sprite_scaled(object, scale = 1 / object.z)

Games using this technique

GameYearInnovation
Pole Position1982Namco's pioneer; first commercial pseudo-3D road
Hang-On1985Sega motorcycle racing; first major Super Scaler title
OutRun1986Definitive version; iconic
Continental Circus1987F1 racing
Chase H.Q.1988Police pursuit driving
Power Drift1988Multi-vehicle Super Scaler racing
Lotus Esprit Turbo Challenge1990Amiga / ST showcase
Road Rash1991Combat + racing
Top Gear1992SNES optimised pseudo-3D (not Mode 7)
Slipstream2018Modern indie pseudo-3D revival
Horizon Chase Turbo2018Modern OutRun-aesthetic homage

Why it endures

Pseudo-3D roads remain useful and appealing:

  • Retro-style indie games — the look has nostalgic value.
  • Mobile games — performance matters; pseudo-3D is much cheaper than true 3D.
  • Educational — understanding how pseudo-3D works clarifies real perspective projection.
  • Aesthetic choice — the slight unreality is part of the charm.

Legacy

Pseudo-3D roads taught a generation how perspective projection works. The mathematics — scaling by inverse distance — is the foundation of all 3D graphics, made tangible through racing games. OutRun's visual language influenced not just racing games but every game that used scaling sprites for depth: shooters (Space Harrier, After Burner), action (Power Drift), even the early Sega Saturn / Sega Genesis 3D-feeling games.

See Also