VRAM Is a Layout, Not a Texture Folder
The original PlayStation has 1 MB of VRAM, but treating that number as a simple texture budget is misleading. VRAM is a 1024 x 512 field of 16-bit words shared by display buffers, texture data, and color lookup tables.
Every rendering decision changes that layout. Resolution, color depth, double buffering, texture format, and palette placement all consume the same address space.
Start with the Display Buffers
Polygon Engine targets a 320 x 240 frame. In 15-bit display mode, one frame occupies approximately:
320 x 240 x 2 bytes = 153,600 bytes
Double buffering needs two display areas, so about 307,200 bytes are committed before textures enter the picture. Alignment, drawing regions, and the chosen VRAM arrangement matter in addition to the raw byte count.
The two buffers solve a different problem from a z-buffer. One is displayed while the GPU draws the next frame into the other. Swapping them prevents the viewer from seeing a partially rendered frame. Neither buffer stores per-pixel depth.
Texture Pages
The GPU addresses texture data through texture-page state plus per-vertex u, v coordinates. A texture page represents a 256 x 256 texel coordinate space, but its width in VRAM words depends on pixel format:
| Texture format | Bits per texel | Texels per 16-bit VRAM word | Palette required |
|---|---|---|---|
| 4-bit indexed | 4 | 4 | 16-color CLUT |
| 8-bit indexed | 8 | 2 | 256-color CLUT |
| 15-bit direct | 16 stored bits | 1 | No |
Indexed textures trade palette restrictions for density. A 4-bit texture stores four texels in the same VRAM width used by one direct-color texel. That can be a major saving when the art works with a small palette.
The page is not a standalone texture object. Several imported images can occupy regions within a page, provided their coordinates, format, and CLUT references remain valid.
CLUTs Are Real VRAM Data
A CLUT is a row of 16-bit colors stored in VRAM. Four-bit textures select among 16 entries; eight-bit textures select among 256.
This creates useful art techniques:
- reuse one indexed image with different palettes,
- keep UI icons compact,
- reserve direct color for gradients or assets that cannot share a palette.
It also creates failure cases. A texture can fit while its palette rows do not. Two images can overlap because their texel dimensions were converted to VRAM words incorrectly. A CLUT placed inside a display area can be overwritten by rendering.
VRAM validation has to understand placement, not only file size.
Why Textures Warp
The GPU interpolates texture coordinates affinely in screen space. It does not perform perspective-correct interpolation. A large polygon viewed at an angle therefore shows the familiar PS1 texture swim or warp.
More texture resolution does not fix the interpolation model. The practical controls are geometric:
- keep walls and floors modular,
- avoid one polygon spanning a large depth range,
- subdivide surfaces where the artifact is unacceptable,
- keep UV seams and T-junctions under control,
- use the visual character intentionally instead of expecting modern stability.
Subdivision improves local interpolation but increases transformed vertices, primitives, packet memory, and ordering work. It is always a budget trade.
Polygon Engine's Import Contract
Polygon Engine converts source images into PS1-oriented .tex data. Import metadata records the format, dimensions, palette requirements, and estimated VRAM use. The build then performs deterministic page and CLUT packing.
The current runtime supports:
- up to
64texture assets, 20texture-page slots in the allocator,- project-visible VRAM placement and budget validation.
Those are engine limits, not claims about the theoretical maximum of the hardware. They keep runtime tables and the build allocator bounded.
If packing fails, the useful question is not only "Are my textures too large?" It is also:
- Are too many assets using direct color?
- Can several images share a palette?
- Are UI textures consuming world-texture space?
- Is an image reserving a large rectangular region with little useful content?
- Does the chosen display layout leave the expected free region?
Dithering and the Final Image
The GPU performs color calculations with more precision than the 15-bit display result and can apply dithering when reducing the output. Polygon Engine exposes dithering because it helps gradients and lighting survive the final color quantization.
Dithering does not create more VRAM or remove banding in every case. It changes the spatial pattern of the error, which often reads better on low-resolution output.
VRAM is one of the clearest examples of PS1 development as systems work. Texture import, screen setup, material design, UI art, and runtime rendering all meet in the same 1 MB map.