Godot PSX Style Demo
Godot PSX Style Demo
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
- 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
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.
Any chance you could make this open source?
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.
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.
Thanks for pointing this out!