Godot Version
4.6
Question
I’m trying to create a water effect for bodies of water in my game that looks as close as possible to this:
It’s obviously a body of water with some waves. The style is intended to be low poly, with irregular polygon shapes. Then, as waves move around, the polygon shapes adjust to keep the edges of the polygons at the peaks/ridges/high points of the waves, as they are positioned in the image.
Basically, the goal is that at any second you could take a screenshot and get something that resembles this look, but while viewing in real time, the polygon shapes would morph over time, to best represent the wave heights/shapes at any given time. Generally, though, from a player’s vision point of view, each individual polygon morphs in shape and angle etc, but doesn’t move, whereas the “waves” appear to be the things moving. The polygons are the medium that conveys the movement.
I’ve been working at this for days now, and have achieved each of the following:
- Generate good polygon shapes using various cellular noise methods.
- Generate wave heights (with or without mapping them to those polygon shapes).
- Generate procedural waves (using various methods).
But I can’t make all those things happen at the same time, respecting each other. The “polygons” need to be positioned and shaped based on the wave peaks and troughs. They need to adjust frame-by-frame to match the changing positions.
If I make the procedural wave generation primary, and try to base the polygon generation off it, I can’t get a solid, low-poly looking effect that gradually morphs from frame to frame to best represent those waves.
If I make the low-poly shapes primary (using voroni noise, for example), I can’t strongly map the wave shapes to it in a way that generates an angular, low poly look.
I considered moving vertices on a mesh with the CPU per-frame, but…as much as I love this visual style, I don’t want to use my entire CPU budget pushing ocean vertices around.
I’m starting to think that this isn’t possible to do efficiently.
Is there a way?

