2.4 KiB
Rendering pipeline
The original game renders both 2d and 3d elements to the same memory buffer, called gBack_screen
.
Another variable, gRender_screen
, points into that memory buffer and is where the 3d scene is drawn on top of any existing 2d pixels.
Rendering is done in a (standard for the time) 8 bit paletted mode.
+-----------------------------------------+
|gBack_screen |
| +------------------------+ |
| | gRender_screen | |
| | | |
| | | |
| | | |
| | | |
| +------------------------+ |
| |
+-----------------------------------------+
The RenderAFrame
function does the following:
- Render 2d background content (horizon, map, etc) to
gBack_screen
- Start 3d scene rendering
- Render 3d environment to
gRender_screen
- End 3d scene rendering
- Render 2d foreground content into
gBack_screen
(HUD, messages, etc) - Swap buffers
If the rearview mirror is rendered, steps 3-4 are repeated, this time rendering into gRearview_screen
Palette manipulation
The game palette is updated frequently:
- Fade screen to black
- Fade screen back up to normal brightness
- Different palettes for the menu interface and for game play
- The "On drugs" powerup
Palette animations run in a tight loop, assuming they are writing to the system color palette, so do not re-render the 3d scene etc. We handle this by hooking the palette functions and reusing the last-rendered scene from our framebuffer.
OpenGL implementation
Start 3d rendering hook
- Capture the current
gBack_screen
and convert it to a 32 bit OpenGL texture, and render it as a full-screen quad. - Configure OpenGL framebuffer to do render-to-texture
- Clear
gBack_screen
Render model hook
- Render the model as an OpenGL VBO, convert referenced materials to OpenGL textures.
End 3d rendering hook
Render the framebuffer from above as a full-screen quad.
Swap buffers hook
- Again capture
gBack_screen
to pick up HUD elements rendered after the 3d scene, convert it to 32 bit, and render it as a full-screen quad. - Generate a palette-manipulation image which is blended over the top of everything as a full-screen quad to handle palette animations.