Hello,
I’m interested to know the approach to make really large terrains.
Take Skyrim as an example, I think the terrain was something like 41k. How did they do that?
Because it cannot be simply done with world machine and a PC with 8GB of RAM and a 4790k CPU. I already get an error message in world machine telling me I don’t have enough resources upon trying to build a 16k terrain.
Best regards,
Alireza
Skyrim’s heightmap is only 3808x3808, the terrain is slightly over 37 square kilometers, but a large chunk of that is inaccessible. There are some engine restrictions on the size of the world. Everything fits inside 128 cells, there are (were?) issues when going outside of that. From the origin 0,0 you can go +/- 64. Each cell is 32x32 pixels of the heightmap so the max you could get is 4K. They left a little room and used 3808 at 1.8 meters per pixel. Not very high quality. Skyrim’s terrain is very bland and boring.
There’s a couple of approaches to getting large terrains with high fidelity. The first thing to remember is that the complexity of your node network is the primary determination of how much RAM you need. There’s an option to only keep data for end nodes (outputs) that saves a lot of RAM since you don’t store the height info for every single device. A major studio also won’t be using machines with 8GB of RAM and a single CPU to build a world. They’ll probably run WM on a rig with 32+ cores and 256GB of RAM with RAID’d SSDs in case anything has to be paged. May not be the ideal solution, especially since the engine you’re using probably has a restriction on the maximum heightmap resolution.
Another approach is to use WM’s tiled output. Since you build many smaller tiles you don’t need anywhere near as much RAM. You can create extremely detailed, large worlds. At that point you can either import the tiles themselves into your engine, Unity and UE4 support this. Or you can take all of those tiles and create a single heightmap from them. WM can do that by importing all of the tiles and then just building it with a single output. You could probably make a script in PS that stitches them together and saves a lot of time compared to the WM build though.
Thank you for the reply. So what you mean is they created a 3808x3808 height map and stretched it to ~37k x 37k ? That’s definitely not something anybody would like to do these days.
For the tiled build the issue is it doesn’t start building tiles one by one (is there a way to do that?). It usually builds half of all the nodes and then the other half, and result’s in a freeze for hours I don’t even know if it’s working properly or I just have to restart the PC (for really large ones).
It’s probably doable in the end but when you are creating a large terrain like 32 x 32 km you’d need to do many builds just for previewing your setup throughout the node setup phase. We could preview it at lower resolutions like 4k and for final output bump it up to 32k etc. But the problem being, the resolution is so different the preview doesn’t show exactly what you get when the mountains are too small on the terrain you can only have a good view if you build it at a high resolution. And this is just so much time consuming. I probably need to let the PC run for a day to finish the build and see whats going on, then when I do changes I need to rebuild. (loop)
Skyrim is somewhere around 6km by 6km. It’s 37 km[sup]2[/sup], not 37 x 37, sorry for the confusion.
Tiled build does build each tile individually. It will dedicate one thread to a tile. So if you have a quad core it will build 4 tiles at a time. Once a thread finishes its tile it begins work on another. Are you sure you’re choosing the tiled build instead of the regular build? If you’ve set the parameters for tiled builds you should see it processing individual tiles instead of the whole node network.
A lot of studios move their heightmaps between programs like Mudbox, Photoshop, and WM (usually for erosion) to create their final output. So they generally have a very good idea of what things are going to look like before getting it all into the engine.
Is it not possible to dedicate all CPU cores to 1 tile only? and move to the 2nd tile when first one finished?
Not to my knowledge. I believe the way it is implemented is the most efficient since not all devices scale past a certain number of cores.