Node Based Terrain Generation


Over the years, I’ve work on a side project – a C++ OpenGL rendering engine that I use as a staging ground for experiments with procedural generation. One feature I had particularly had fun implementing, was adding heightmap rendering, with a node based graph built ontop of DearImGUI, with a mask painter alongside (the effects of which are shown above). This particular sub-project arose out of a frustration for quick iteration in engine on interesting maps created from multiple types of noise (perlin, simplex, worley, etcetera). This way I’m also able to serialize the graph and eventually would like to embed custom algorithms as nodes in a Lua or Wren script. I took a lot of inspiration from my experiences with Substance Designer (perhaps this is obvious :D).

I have a few basic nodes, where you have add, sub, mul, div, min, max in order to blend different heightmaps generated by various functions. I also have various other functions that tend to pop up in the literature for algorithms you might want to apply to your terrain, like thermal and hydraulic erosion, curvature, slope, gradient, laplacian, fault fractals, clamping, colors, or constant floats, perhaps a heightmap you want to import from a real or otherwise external data source.

Worley Noise based heightmap
simplex noise with domain warping multiplied by classic FBM turbulent perlin noise
simplex noise FBM turbulence with domain warping applied

Above I show several weird examples of the results with different types of noise, after all, I’m not trying to achieve realism with my experiments, but seeing what interesting formations arise from the chaos.

Next on the list is clouds, FFT for tiling, night and day cycle, combined with my water simulations (a blog post for another day).

Leave a Comment

Your email address will not be published. Required fields are marked *