Smooth Terrain LOD

… is live on all platforms (desktop/console/mobile)

This update includes:

  • A level of detail system, that progressively simplifies rendering geometry far away from the character/camera. This results in significant video memory reduction as well as significant performance improvement for both CPU and GPU on all quality levels (the bigger the terrain or quality level, the more significant is the difference).

  • A new compressed in-memory voxel storage that reduces the amount of memory voxel data takes, the simpler terrain is - the more significant the gain.

  • Improved tiling method, which hides texture tiling artifacts on some materials (the most obvious example is that Grass is no longer covered in axis-aligned bright streaks).

  • Significant performance improvements for water rendering for some cases (mostly apparent if you use water but don’t use any other terrain materials).

  • Improvements in logic that computes whether camera is under water or not.

All of this is active in both client and Studio; the “ExperimentalTerrainLOD” switch currently has no effect. The first item is similar in implementation to the experimental LOD that was live for the past few weeks, although it had seen a lot of tuning and bug fixes; all other items are completely new to this release.

The LOD system relies on voxel-based simplification, and as such has an unavoidable problem: if you have a single-voxel-thick layer of a certain material (such as water), and everything else is Air, it may have issues maintaining the exact height across all levels of detail. Developers who use big single-voxel planes of water are encouraged to work around this by having 4-8 voxels of thickness instead of 1, depending on the water plane size. This is now comparatively cheap.

Please post here if you are seeing issues because of this update.

41 Likes

You’ve finally made one of roblox’s prettiest, coolest, and most useful features a viable option for bulk use.

image.gif

7 Likes

Does the compression of voxel data by chance improve voxel lighting update speed at greater distances? We were having issues where time of day changing continually over time would sometimes result in voxels being lit by a previous time for seconds (the timescale we were using was 20:1 if that helps).

No - this update only affects terrain voxels.

1 Like

I seem to have found a weird bug with it, forming ‘world holes’ (like in Minecraft) in smooth terrain:

Closer up:

Attempting to walk closer to the ‘world hole’ appears to fix the rendering as it loads the higher-detail region.

Do you have a place link?

I was generating terrain in https://www.roblox.com/games/433691900/Terrain-gen-2-0 - it had StreamingEnabled turned on, but I’m trying it without to see if I can replicate the issue.

EDIT: With streaming turned off, the issue does not seem to occur.

1 Like

I think I found another bug:

Terrain LOD appears to not update correctly if the terrain is far enough from the origin (I’m at about 5.2k studs from the origin)

Here’s another view of the issue:

Terrain LOD updates correctly for the ‘chunks’ that I am standing on, however.

This is in the same place I linked earlier, with StreamingEnabled turned back on

1 Like

This looks fantastic!

20 Likes

As far as optimization goes it feels great; had one example of a place going for ~25 FPS to a constant 59.8 now.

That being said, in areas where speed is involved it feels like it goes for optimization over looks a bit too much. Like at walking speed everything looks OK, but when driving a car at 200 studs per second the terrain is updating too much. Like can we have some way to adjust it to gain back some quality over performance if we want to, like increasing the range that terrain is at max quality?

My place used to run as smooth as silk, but now I get frequent freezes for ~1/3 of a second.

The place has tons of terrain and fast runspeed.

1 Like

I don’t get any freezes on this place. You are testing in player, right? Can you post the specs of whatever you’re running it on, and a profiler dump (press Ctrl+F6, run around until you get a freeze, select Dump -> 512 frames, it will save an HTML file to C:\Users\username - PM me that)

Yeah, I’m thinking about possible APIs for LOD control. Could make sense to tweak how aggressive it is (I think there were some feedback issues with just driving that off quality level), could make sense to make the vertical distance affect LOD as well. I’ll look into that.

Btw, can you send me a link to the place that you’re talking about (with the car @ 200 s/s)?

2 Likes

I’m very happy to hear about performance improvements but I’m dissatisfied with how my islands look now.

A bit better up close.

1 Like

Not sure what they looked like before. In general if you want to preserve the material at the top it should have at the minimum occupancy not less than the material below, and preferably have an extra layer or two for safety (not always required). If the islands were supposed to have a glacier (?) bottom with a thin layer of water, you should make the layer of water a bit thicker.

2 Likes

I apologize for not being specific.

The reduction in detail for the ice water around the island leads to really big and irregular holes as seen in my picture above. The entire terrain loses it’s bumpy texture as the LOD gets lower as it moves out. The terrain in the distance also looks “mushy” because the lacking of crisp lines like the old island. I’m glad we got LOD but until I have more control over it, looking at the islands from the sky is going to be subpar.

this is fantastic. i use a big smooth terrain map for one of my games, and i was only getting around 20fps while rendering the whole thing, but now it’s a constant 60!

1 Like

This is great in some cases, but it would be terrific if it was toggable and/or adjustable. Two games I’m working on look like crap from short distances because of it, and one of the doors surrounded by terrain gets filled in around the corners.

(I can get pictures later tonight when home)

Right, so the water issue is likely because the water layer is very thin - few voxels, and I suspect low occupancy values. In general LOD code tries to maintain the “cover” material to some extent. This may be tuned a bit more - can you give me a place link? But otherwise I’d recommend making water a bit deeper, and/or using full occupancy values for water voxels where appropriate.

For example, right now you can easily mishandle occupancy for procedurally generated terrain - you can have a 3-voxel deep water with occupancy 0.01 in all 3 layers and it’d render fine and the difference between that and occupancy 1 would be just a bit of the adjustment in the water height. With LOD, the material under water can overtake water with this kind of setup.

In general I suspect that this entire island was very taxing on the GPU pre-LOD so obviously this becomes a performance-quality tradeoff.

1 Like

I don’t think toggling is a good idea. You have to think about the ecosystem with the varied hardware - like, when smooth terrain came out Quarry started using it at day 1, and good PCs were able to handle it fine - but a lot of users reported basically running out of memory, mostly due to rendering. While rendering memory was optimized at some point it still is not enough without LOD.

Now, adjusting the LOD parameters could work. I’ll need to look into how much a developer can relax LOD settings without causing issues for low-end (within reason) systems, and whether this can be tied to graphics quality or not.

2 Likes