Low Res Graphics with Voxels 🧊
Check out the source code. If you do, make sure to use the latest Godot 4 version!
Goal
In this blog post we will recreate this look in godot:
Game Scene
The base game scene we are working with, looks like this:
It can be anything you want really - I chose to build a basic boat on water. ⛵️🌊
Important to note though - set your stretch mode to viewport
:
Scene Setup
Our "container scene" basically just holds both our UI and our Game:
The whole trick is setting the TextureRect
texture to a new ViewportTexture
and when it asks you to select a Subviewport, you pick the SubviewPort
that contains your main gameplay scene from before.
Beta bugs?
Because I've found some buggy behaviour when attaching the ViewportTexture
to GameTextureRect
- and that's how it's supposed to be - you can set the texture at runtime as a workaround. The error only occurs when the texture is set in the editor. This way we don't set it, but let gdscript take care of it for us:
# attach this script to the GameTextureRect
extends TextureRect
@onready var game_viewport = $GameViewport
# Called when the node enters the scene tree for the first time.
func _ready():
texture = game_viewport.get_texture() as ViewportTexture
texture.set_viewport_path_in_scene("GameTextureRect/GameViewport")
I'll keep an eye on the issue, as this should only be a beta-workaround.
Do whatever you want
Now the TextureRect
-Node needs two properties. First, we set it's Layout -> Anchors Preset
to Full Rect
. And also, we need to set the Texture -> Filter
to Nearest Mipmap
!
After we can resize our game's resolution however we like:
The TextureRect
will scale it to fit our window dimensions, and produce a "pixelated" look!
Basically it makes our 1920x1080
game render through a 240x135
lense.
Why?
The main reason why you would use a SubViewport
, is because of the ability to have your whole UI on a separate layer.
You can also set the Viewport Width/Height
to a small size and use Window Width/Height Override
to make the actual window bigger - it will achieve the same look, but it will also upscale your UI and make it very hard to work with. Especially once you end up needing to make your font_size = 2px
. 🤔