The Missed Opportunities of Sonic 06
The Squandered Potential of Sonic 06
By Isaac Marovitz
While it is common knowledge among the fanbase that Sonic 06 contains cut content, the sheer scale of what was left on the cutting room floor is often underestimated. During the development of Marathon Recompiled, our team performed a deep dive into the game's core architecture, specifically focusing on the rendering pipeline.
A Tale of Two Aesthetics
The visual quality of Sonic 06 is wildly inconsistent. On one hand, you have areas like Crisis City, which feel atmospheric and polished. On the other, you have Castle Town, which feels vibrant utterly flat and lifeless.
| Location | Visual Features | Vibe |
|---|---|---|
| Crisis City | Dynamic lighting, particle effects, reflections | Dramatic |
| Castle Town | Basic textures, minimal depth | Depressing |
When examining the scarce footage available from the beta, the disparity becomes even more glaring. We see evidence of:
- Kingdom Valley: Full implementation of bump maps.
- Castle Town: More intricate geometry and lush vegetation.
- New City: Collision data suggesting a completely different architectural layout.
The Performance Trade-off
Interestingly, much of this "cut" content isn't actually gone; it's still residing in the game files but has been disabled in the vanilla release to maintain performance. Even with these reductions, the game struggled to hit its target frames per second (FPS) on original hardware. Given the notorious crunch Sonic Team endured, these visual flourishes were the first casualties of the deadline.
The Shader Hierarchy
The visual degradation stems from the various shader variants. Most assets rely on either the Terrain or Billboard shaders (notably, the "Billboard" shader doesn't actually use billboarding). These shaders are categorized by feature levels ranging from 00 to 07.
Below is a breakdown of the Billboard shader variants:
| Variant | Lighting | CSM | Point Lights | Dual-Texture Blend |
|---|---|---|---|---|
| 00 | None | No | No | No |
| 01 | Vertex | No | Yes | No |
| 02 | Vertex | No | No | No |
| 03 | Vertex | Yes | Yes | No |
| 04 | Pixel | Yes | No | No |
| 05 | Pixel | No | No | Yes |
| 06 | Pixel | No | Yes | Yes |
| 07 | Pixel | Yes | Yes | Yes |
The Sad Reality: The most frequently utilized shader in the game is the one with only per-vertex lighting, no Cascaded Shadow Maps (CSM), and no point lights. This is why the majority of the world looks so dull—it's essentially just basic albedo textures and ambient light.
Technical Roadblocks to Restoration
Updating these shaders isn't a simple "flip of a switch." Because the I/O layouts differ between variants, swapping them often causes the rendering techniques to break entirely. Furthermore, the .xno files (which define material textures) may not even reference the normal or bump maps, even if those files exist in the game's directory.
The Shadow Map Struggle
The Cascaded Shadow Map (CSM) system is designed to maintain consistent shadow resolution across the camera's frustum. However, this system was also subjected to last-minute "performance hacking."
The distance at which shadows render is controlled by two functions:
GenerateCSMLevels(for static terrain)GenerateCSMObjects(for dynamic entities)
While most areas use 4 cascades, levels like twn_a were downgraded to 3 for levels and 2 for objects, severely clipping the shadow distance.
Common Artifacts
- Shadow Acne: The game suffers from severe "acne" (stuttering patterns on surfaces). This is typically fixed by adding a small epsilon value to the shadow map samples: Sonic Team neglected this, and without full shader decompilation, it's difficult to patch.
- Missing Shadows: Some objects are simply flagged to not cast shadows.
- Sonic's snowboard in Crisis City
- Princess Elise's skirt in specific cutscenes
The Point Light Paradox
In theory, the lighting system is flexible, utilizing a few fixed ambient lights and several point lights for detail (like torches).
shared struct {
float4 Position;
float4 Color;
float4 Attenuation;
} g_PointLights[ 2 ];
The problem? Sonic Team capped the point lights at two per object. While this is a standard limitation for forward renderers, the level designers didn't always follow it.
- Kingdom Valley: Generally respects the 2-light limit.
- Flame Core / Dusty Desert: Attempt to render lights per object.
This causes the renderer to glitch, leading to lights "fighting" for priority and flickering in and out of existence. It appears that a late-stage decision to lower the light limit, combined with a shift toward per-vertex lighting, broke the optimization logic.