Making Graphics Like it's 1993

sklopec1 pts0 comments

staniks.github.io

Marko Stanic

Personal website and blog.

Catlantean 3D - Making Graphics Like It's 1993

Catlantean 3D is a side-project I've been slowly building in my spare time for over a year, and I intend to release it on Steam next year.

Your browser does not support the video tag.

My goal was to build a complete, shippable first-person shooter using techniques that were common in the early 90s, while allowing myself the luxury of using a modern compiler and a platform abstraction layer.

What this actually means is, the constraints I have foolishly imposed upon myself are as follows:

game must be made entirely from scratch, including the assets

all rendering must be done by hand

all sound mixing must be done by hand

320x240 target resolution

256 colors only

floating point allowed, but behavior must be consistent across platforms<br>decided on fixed point for game logic to guarantee deterministic behavior, floating point for rendering because determinism isn't that important there

must be a finished, polished game that is fun to play (not a tech-demo)

platform abstraction layer allowed, but I must pretend it's very limited (within reason):<br>frame buffer to write pixels into

keyboard/mouse input

audio buffer to write samples into

filesystem I/O

no AI slop

If this sounds unreasonable to you, that is because it is.

But I'm doing it anyway, and today I'm gonna talk about something that is typically overlooked in development blogs, and that is asset creation.

Note: Everything displayed here is work-in-progress, and heavily subject to change.

Table of Contents

Palette Rendering

VGA Graphics

The Palette

The Colormap

Creating Assets

Pre-rendered Sprites

Hand-drawn Sprites and Textures

Procedurally Generated Sprites and Textures

Maps

Conclusion

Changelog

2026-05-06 - published.

Palette Rendering

VGA Graphics

Mode 13h on VGA hardware was the famous 320x200 256-color graphics mode that defined a generation of PC games. From a programmer's perspective it was wonderfully simple: you'd have a linear frame buffer where each pixel was represented by a single byte indexing into a palette of 256 colors.

If you wanted to draw a pixel, you wrote a byte at a specific address, and that was it, there were no shaders or VRAM, or anything like that.

One byte per pixel, and that byte is an index into a palette which contains actual RGB values that would be rendered to screen. This imposes some interesting limitations; when making assets for modern games, you can throw millions of colors at an image, but when your limitation is that every pixel on screen can only be one of 256 colors, asset creation becomes a very different problem because every color choice has to be careful and deliberate.

Games like Doom and Duke Nukem are good examples of this done right. There is a certain crispiness and clarity to these graphics that arises because of these technical limitations, not in spite of them. Restriction forces deliberate choices, and deliberate choices tend to look good.

Catlantean 3D is an attempt to reproduce that feeling, but with one caveat - I'm actually going for something closer to VGA Mode-X, which is 320x240. The reason for this is, if you display 320x200 on a 4:3 display, you end up with non-square pixels! While this would be most authentic, I've chosen not to deal with this out of preference rather than objective reason.

So how does one create graphics that work within these limits?

The Palette

Everything begins with 768 bytes, carefully picked through many iterations of trial and error.

The main reasoning for picking these exact colors was the following:

one reserved for transparency (the vibrant pink)

one reserved for pure white

one reserved for pure black

I was obviously going to need a lot of blood, thus reds

shades of green and blue because I was going to have red, green and blue keys and color-coded doors

game would be set in Catlantis, which is a parody land that resembles ancient Egypt (because cat worship), so obviously, a lot of desert hues (yellows and browns)

lots of grays because the setting involves many technical installations (Catlantis is under occupation by cybernetic dog-men)

some beige hues to break up monotony over grays, and to serve as warmer replacements when darkening (more on this later)

the rest would be filled as necessary when creating textures - highly subjective and impossible to explain, other than "it looked right"

The palette did not spring into life all at once; it involved a lot of back-and-forth during asset creation, testing, and re-iterating in general.

Below are some examples of sprites and textures from the actual game:

The Colormap

Catlantean 3D is a traditional raycaster. The map consists of tiles which are all identical in size; some are walls, others are just voids with a floor and ceiling. In order to render the map, the renderer uses the DDA algorithm for each column of screen, traversing the tilemap and determining...

graphics because palette must game colors

Related Articles