Last Updated: 5th March 2021
Independent Video Technical Documentation
Table of Contents
The Sony PlayStation from 1994 had an advanced polygon rendering & texture mapping GPU which lacked the traditional 2D background and sprite hardware of systems like the SNES or Sega Saturn. Almost every object on-screen was defined for the GPU as a textured polygon (or rectangle), whether it was pasted as a flat 2D image or mapped into 3D space.
The PlayStation could have its graphics stored in VRAM in 24-bit or 15-bit. When graphics are displayed on-screen, however, this is often reduced to 15-bit and this bit depth remapping can have optional dithering applied — which makes sense to reduce low-bitplane banding for darkened textures or Gouraud-shaded objects. It made no sense for simple 2D games with hand-drawn bitmap artwork or ports from old arcade games or 1980s home computers.
Even 3D games might suffer a bit if a texture had been (presumably) drawn originally in an art program that supported 16-bit or 18-bit colour, as the RGB values were locked to a depth similar to 15-bit, but just enough darker or brighter than the PS1’s native display such that all textures had a uniform dither applied to them. Observe the sky and road textures in Ridge Racer to the right to see this: that dithering isn’t blending more subtle shades in — it’s a 2×2 checkerboard pattern overlaid indiscriminately to large swathes of the screen. Yuck! (I say.)
As far as I understand it, the PlayStation’s GPU can be accessed by the CPU via “GPU commands” sent via port writes or, alternately, via DMA. These commands set up lists of polygons for rendering, set up VRAM and textures, etc. They also modify attribute registers internal to the GPU.
GPU Register GP0, command (subregister?) $E1 contains the bit which controls the above dithering per polygon/object. It is not a global setting. Some games store a command to this register that is identical for all objects, meaning only one code location to modify for disabling dithering: other games (Konami ones, eg.) have a different command and data for each type of graphic: background layers, “sprites”, polygonal effects, etc.
If you would like to find out as to how to remove the dithering effect, we have a very nice guide here.