• Godot Help
  • Trying to accomplish a 3D retro look in my game. Screens and ideas included!

My objective is to recreate the following styles in 3D using Godot 4 Stable:

img0
img1

I'm not trying to stay faithful to any platform style (psx, n64). I'm stealing retro aesthetics from where I can and at the same time use "modern" graphics techniques while remaining "retro" as possible. Don't want to use the ps1 shaders out there.

So far I've done the following in my Project Settings:

  • Change Viewport width and height to 384x216.
  • Change Window Width and Height Overrides to my window size of choice (1280x720).
  • In Stretch change Mode to viewport and Aspect to expand.
  • Disabled Anti-Aliasing.
  • Using the StandardMaterial3D (only albedo).

In other areas of my game:

  • Change material's sampling to Nearest Mipmap Anisotropic
  • Tried making art similar to the style I'm trying to accomplish.

These modifications really made a difference, but there's still missing.


I need some advise, what else could I do to accomplish this?

1) I'm noticing that the StandardMaterial3D might be a little overkill for what I need. Should I write my own shader that does the following:

  • Cell/toon shade in order to get closer to the desired image.
  • Probably only need a simple lighting model (Phong-Blinn) which only uses diffuse and specular maps, nothing else.

Or am I overthinking this and the StandardMaterial3D is just fine?

2) If writing my own shader is indeed needed, does that mean I need to to re-implement the following into my custom shader?

  • Shadows (Directional, Point, Spotlight)
  • Triplaner Texturing
  • Emission

3) If I write my own Shader, would that also mean World Environment effects would stop working for any Mesh using my custom shader? I'm referring to World Environment effects like:

  • Sky
  • SSR
  • SSAO
  • SSIL
  • SDFGI
  • GLOW
  • Volumetric Fog

4) Should I limit the color depth in the game to 256 colors or similar? I thought of using a shader I found that does that in post, but not sure if this was the proper way or is there something I should do in Project Settings instead.

Any suggestions or tips are more than welcome!

  • xyz replied to this.

    DonnieDarko You can use standard material and write a post processing shader that uses limited palette LUT to replace source colors. This can get you nice toon banding. Additionally instead of just taking a nearest LUT entry, for some parts of palette use dither patterns to mix 2 LUT entries. That way you could get those crisp pixel-sized checkers, dots or stripes.

      DonnieDarko You can do it both ways but with post process you have it all in one place and you get to keep all the advanced standard material stuff that still may look good when posterized/pixelated like ao or reflections.

      Yeah something like that pixelization shader but you'd probably want to use a look-up-table (LUT) texture instead of just algorithmically stepping the RGB values. The former lets you shift/balance/reduce your palette in various non-linear ways which can look visually very pleasing if done right. Note that LUT palettes can be generated procedurally inside Godot so you can quickly try out different variations.

        xyz Thank you so much yet again for the great tips. That site is awesome btw, lots of goodies to learn from.