Godot PSX Style Demo

Available on GitHub (MIT License)

A collection of shaders and materials for Godot engine that aim to recreate the following aspects of the PS1 aesthetic:

  • Vertex "snapping"
  • "Wobbly" texures through affine texture mapping
  • Limited color depth
  • Hardware dithering to hide color banding
  • Shiny chrome-like metallic surfaces
  • Billboard sprites
  • Fog to limit draw distance

Demo Controls

  • Space: Toggle camera and object movement
  • R: Reset rotation

Tips for best results

  • Use low poly models
    • Prefer smooth-shading over flat-shading wherever possible
    • Don't be afraid to include extra edge loops to smooth out texture distortion in your geometry! PS1 levels often had much higher polycounts than you might expect!
  • Keep textures as low resolution as you can
    • Make sure filtering and mip-maps are both disabled
    • Rely on a mix of vertex colours and texture maps, instead of higher detailed texture maps wherever possible
    • Posterizing your textures with a depth of 15 or 16 before import goes a long way to making them feel more "PS1"
  • Keep your internal resolution low
    • Common PS1 resolutions were 256×240, 320x240 and 512x240 (Source)
    • That being said, you can easily go widescreen by using a 16:9 resolution with similar height
  • Use as basic of a lighting set up as you can get away with
    • Modern lighting techniques are a very easy way to break the illusion of appearing like early 3D!
    • Where possible, prefer to use white ambient light, with vertex colours on geometry to fake lighting
    • Prefer additive blending to transparent blending

Originally based on: https://github.com/marmitoTH/godot-psx-shaders

Floor texture (available under CC-0): https://stealthix.itch.io/rpg-nature-tileset

PlatformsWindows, Linux, HTML5
Rated 5.0 out of 5 stars
Made withGodot
Tagsdemo, Godot, ps1, PSX (PlayStation), Retro, Shaders, tech-demo


godot-psx-style-demo_v1.2_win.zip 12 MB
godot-psx-style-demo_v1.2_x11.zip 13 MB
godot-psx-style-demo_win_v1.3.zip 12 MB
godot-psx-style-demo_x11_v1.3.zip 13 MB
godot-psx-style-demo_win_v1.3.1.zip 13 MB
godot-psx-style-demo_x11_v1.3.1.zip 14 MB

Development log


Log in with itch.io to leave a comment.



This is immensely helpful. Thank you.

It's been a year (pretty much precisely) since I took a look at this. I see you've moved the color depth and dithering into postprocessing. It's now far more accurate as a result, but now we have lost the ability to dither only certain materials in our scene.

I'm guessing there was no way to get an accurate reduction in color depth without using postprocessing?

IIRC it was accurate dithering that led to moving it to a post process effect rather than object-level (had issues dithering between colours, and didn’t play nicely with transparency).

Wasn’t overly happy with cutting per-object dithering, but it was a relatively obscure hardware feature to begin with (so far you’re the first person to bring it up). Hopefully we’ll be able to get it back in 4.0 by rendering to a buffer to mask dithering, AFAIK that should do the job.

By any chance, do you still have the old version of the shader in one piece anywhere?

It’s all on the GitHub, check the older commits

Any chance you could make this open source?

(1 edit)

It is! It’s available on GitHub under MIT License


I'm slightly confused about the license. If I use this in my game, or some of it in my game, does that mean I have to make my game open source or make the code public? 

Not at all! MIT license just requires that you place a copy of this license in a visible place somewhere (as in, “I used X code, here is the license”). Godot engine itself is also MIT license, so this is a requirement you have to fulfill when releasing a Godot engine game regardless.

Credits are a good place to dump this - self plug but I did this in one of my games if you want to see an example.


Thanks so much! 

(1 edit) (+1)

Excellent stuff, but there is a problem with the lit alpha scissor shader; fog color is applied over the alpha areas.

The lit transparent version doesn't have this problem,  so presumably, it is a case of oversight with a simple fix?

[EDIT] I have fixed it by taking the code from the working transparent shader and adding

uniform float alpha_scissor : hint_range(0, 1) = 0.1;

to the declarations, and

ALPHA_SCISSOR = alpha_scissor;

to the final fragment.

I also pasted the billboard stuff in there too, although I'm fairly clueless about shaders and just bumbled through this.

Deleted 1 year ago

Fixed https://github.com/MenacingMecha/godot-psx-style-demo/commit/2d6bbeda81533de7b73c1db3c578a11677aa81b3

Thanks for pointing this out!