My erosion filter is out! Video, blog post, and shader source.

It emulates erosion without simulation, so it's fast, GPU friendly, and trivial to generate in chunks.

Explainer video:
https://www.youtube.com/watch?v=r4V21_uUK8Y

Companion blog post:
https://blog.runevision.com/2026/03/fast-and-gorgeous-erosion-filter.html

#ProcGen #vfx #GameDev

Here's the Shadertoy where you can paint eroded mountains and islands with your mouse, right in the browser:
https://www.shadertoy.com/view/sf23W1

#ProcGen #vfx #GameDev

Here's the other Shadertoy, that shows off various animated parameter changes in erosion strength, scale, detail, and ridge and crease rounding.
https://www.shadertoy.com/view/wXcfWn

(You can temporarily control the camera angle while dragging with the mouse.)

#ProcGen #vfx #GameDev

@runevision In terms of The Big Forest, are we going to be able to walk down roads carving their way along your eroded mountains?
@nick Probably, in some form! The terrain in The Big Forest will be generated primarily based on level design, but I want to try to apply erosion in a subtle way.
@runevision Aah, I didn't realise there was level design happening in TBF. For some reason I had assumed it was all seed based
@nick It is, I mean procedural level design. :)
@runevision most excellent. Did I tell you that you have a superpower of going really deep into rabbit holes like that, emerging with fantastic stuff?

@aras Thanks a lot Aras! Yeah I think you have mentioned it before :)

My skills as a programmer are very spotty and uneven, but I do try to make the most of the things I excel at, and am fortunate to be in a position where I can focus on that.

Now, if I could also learn one day how to do profiling properly...

@runevision I agree. Superpower!

This is awesome. I want to use it.

@benthroop Please do! Would love to see that! :)
@aras @runevision I love just reading Rune's articles and posts, seeing all the shapes and terrains take form. I may not use ProcGen in my current projects but it feeds the mind and keeps me thinking and appreciating beauty. Thank you, Rune.
@runevision Is that... Terragen in a (few) shader(s)? I love it!

@runevision

This looks really great, good job.

Look forward to reading about it.

@runevision

I've read the post now. Fantastic work. Probably the best, most realistic, looking terrain generation I've seen.

@runevision This is some astounding work! The results it's generating in real time are kinda mind-blowing.
@JeremiahFieldhaven Glad you like it! I'm looking forward to see what people do with it :)
@runevision This is really cool! Thank you for the detailed explanation.
@runevision Thank you for the detailed explanations. It's really fascinating.
@runevision nicely done, interesting work.

@runevision

Wow, that is very cool.

@runevision Thank you, this made my day! 🤩 I didn't realise that the basic idea was so simple, with at best half-baked explanations of "gavoronoise" out there. You explained it clearly and succinctly.

In part 3 of the video, it seems like you're still using the absolute height value to decide whether something is a minimum or a maximum. Could the *second* derivative be used for that instead? I think it might work for stacked fading too.

@thomastc I'm glad you found the explanations helpful! :)

About the fade target, you're right that altitude is not robust for the input fade target, since e.g. some valley could be higher up than some mountain peak. I'm not sure there's a perfect solution, and I kind of let it be up to the user to decide what to base the input fade target parameter on. I just base it on altitude in all my demonstrations. 1/?

@thomastc I did think about using the second derivative (curvature), but then every function involved in producing the input height has to return those second order derivatives, or alternative it has to be done numerically which is either slow (multi-sampling) or rather inaccurate (shader derivatives). 2/?

@thomastc On top of that, curvature does not produce a value that's between -1 and 1 as the fade target needs, so you'd have to combine it with other things (like first derivative) to wrangle it into a useful range. That's absolutely possible, but hand-tweaking the particulars may still be needed.

So yeah I considered it but don't really have a good solution. I'm curious if others will find a better way to handle this. 3/3

@runevision this is wonderful!

That’s impressive! Some good looking terrain coming out of that.

@runevision

@runevision Not only is the technique rad but the video is also very good. Thank you for putting so much effort into helping people understand.
@jonikorpi Thanks a lot, glad you liked it! It’s one of those things where if I had known up front how much work it would be, I wouldn’t have done it. But now it’s finally done and out, and I’m happy it’s so well received.
@runevision Amazing results and explainer video!
@runevision Fantastic writeup, thanks!
Generating a good input heightmap is explicitly beyond the scope of this article, but that feels like the next logical thing to look at. I've been wondering if there's a good way to make sure that following down a slope will end up at a lake or ocean, i.e. controlling the local minima. Maybe a large scale voronoi system could determine the maxima and minima in such a way that finer scale voronois could preserve these while forking the channels between them.

@runevision Maybe at some point these finer voronoi octaves could transition into an algorithm like the one you described here.

You know, in case you needed another nerd snipe.

Bonus points for meanders and oxbow lakes.

@johnnesky Yeah plenty of follow up research one could do! It'll have to be someone else than me though :)

@runevision Brilliant. That's exactly what I was pondering about a week or so ago: https://tglad.blogspot.com/2026/03/fluvial-landscapes.html

I didn't get far, but this looks great so I'll enjoy reading about it.

Fluvial landscapes

A topic I return to from time to time is fluvial landscapes. These are common in nature but don't seem to fit naturally into any of the stan...