Calin P wrote the hardware rasterizer for his own PS1 emulator, P-chan, before writing the PSX-style shader he uses in his game. So his complaint carries weight: most PlayStation-look tutorials are wrong about the hardware in at least one respect. The post walks what the GPU actually did and then bolts each quirk onto a single Godot 4 spatial shader.

The corrections are specific, and each one changes what you would write:

  • The GPU is a fixed-function pipeline — it draws every polygon the same way apart from draw-call parameters. One material for the whole game, everything batched through instanced rendering (Forward+ only; different textures break batching).
  • It draws in rgb5, never 24-bit. Colours clamp to 5 bits per channel, and the clamp must happen before dithering, not after.
  • Dithering is Sony’s 4×4 matrix toggled per polygon — and flat-shaded, unmodulated triangles cannot be dithered at all on real hardware. The standard “fullscreen dither” approach is nonsense.
  • Textures are never filtered and never perspective-corrected. Affine UV interpolation warps textures badly at grazing angles, which is why PS1 games leaned on fixed camera angles and subdivided meshes.
  • There is no depth buffer. Triangles are depth-sorted on the CPU and painted in submission order, so intersecting geometry simply covers. Reproducing this means flat per-triangle depth — and subdivided floors. Silent Hill’s tiled floor exists precisely to dodge this and the affine warping.
  • Vertex wobble comes from integer-only coordinates (no subpixel rendering), not from a grid-snap effect.
  • The famous Silent Hill fog renders the world twice per triangle. It cost geometry budget; the story that it was an optimisation is a myth.
  • Lighting was per-vertex and CPU-side through the GTE, capped at three dynamic lights. Godot’s per-fragment light() doesn’t match, so he packs light data into an RGBF texture and passes it as a global uniform.

What makes the piece worth keeping is the method rather than any single trick: every look decision is derived from a hardware constraint, which is what lets him tell you which widely-copied advice is cargo cult. If you are chasing a period-correct aesthetic, that is the difference between copying shader code and understanding what you are copying.

And the fidelity is honest about its cost — the goal was to bring back the annoying parts of the original hardware too. Flat triangle depth and affine warping are bugs in any modern engine; here they are the point.