Unreal Engine relies on two things large metaverses don't have - precomputation of entire scenes in the creation tools, and extensive asset reuse. In a real metaverse, there are thousands of creators, all making assets. Second Life has over 60,000 different chairs for sale. Each was created independently. The world is assembled dynamically. There is no external "level editor" for a good metaverse, only object editors. You build the world in the world. Although some of the low-end metaverses, like Decentraland, do make you edit your entire land parcel externally and upload it as a unit.
Epic might eventually offer a more dynamic system. It would involve back-end servers doing much of the optimization that the Unreal Editor does now. Maybe in UE6 or UE7. It's certainly possible, but a big job.
Nanite does not eliminate levels of detail. It just does them within meshes, rather than external to them. In most computer graphics, you have explicit objects which appear more than once. That's called instancing. But within a mesh, there's no optimizing out duplicate submeshes. That's what Nanite does. A Nanite mesh, rather than being big lists of vertices and triangles, is a directed acyclic graph, in which common subsections are combined. So, if you have a huge area of buildings, but not that many different windows, the windows are unduplicated.
Notice that in the UE5 demos, they have lots of dirt and rocks, lots of copies of the same statue, and buildings which have a lot of repetition. That's the key here. Those are all things for which this optimization works. Even then, the download for the Matrix Awakens demo is about 16GB, which expands to about 250GB after decompression.
The instancing is recursive. A good example would be a long chain-link fence. If you zoom in close enough, you can see the bends in the wire and the flaws in the galvanizing. Maybe now and then there's a piece of trash or a leaf stuck in the fence. If you zoom out far enough, you can see kilometers of fence. That can all be one Nanite mesh. And if you need to cut a hole in the fence somewhere, that will work.
The level of detail system is automatic. The mesh representation contains within it level of detail information. Nearer areas go further down the DAG to higher levels of detail. There's a clever geometry trick which makes the transitions look good. In general, the idea is to maintain about one triangle per screen pixel. The key to all this is that there are only so many pixels on the screen, and that controls how much geometry detail needs to be displayed. So there are still levels of detail, at a fine-grained level.
All this, unfortunately, turns out to be badly matched to what GPUs do. So about 60-70% of the rendering is done in the main CPUs. Nanite really needs a new generation of GPUs, ones that are good at chasing around complex data structures with internal links and offsets.
If you want to understand Nanite, here's the 155 page paper.[1] There's a video which goes with that.
It's brilliant, but it's not magic.
Unreal Engine relies on two things large metaverses don't have - precomputation of entire scenes in the creation tools, and extensive asset reuse. In a real metaverse, there are thousands of creators, all making assets. Second Life has over 60,000 different chairs for sale. Each was created independently. The world is assembled dynamically. There is no external "level editor" for a good metaverse, only object editors. You build the world in the world. Although some of the low-end metaverses, like Decentraland, do make you edit your entire land parcel externally and upload it as a unit.
Epic might eventually offer a more dynamic system. It would involve back-end servers doing much of the optimization that the Unreal Editor does now. Maybe in UE6 or UE7. It's certainly possible, but a big job.
Nanite does not eliminate levels of detail. It just does them within meshes, rather than external to them. In most computer graphics, you have explicit objects which appear more than once. That's called instancing. But within a mesh, there's no optimizing out duplicate submeshes. That's what Nanite does. A Nanite mesh, rather than being big lists of vertices and triangles, is a directed acyclic graph, in which common subsections are combined. So, if you have a huge area of buildings, but not that many different windows, the windows are unduplicated.
Notice that in the UE5 demos, they have lots of dirt and rocks, lots of copies of the same statue, and buildings which have a lot of repetition. That's the key here. Those are all things for which this optimization works. Even then, the download for the Matrix Awakens demo is about 16GB, which expands to about 250GB after decompression.
The instancing is recursive. A good example would be a long chain-link fence. If you zoom in close enough, you can see the bends in the wire and the flaws in the galvanizing. Maybe now and then there's a piece of trash or a leaf stuck in the fence. If you zoom out far enough, you can see kilometers of fence. That can all be one Nanite mesh. And if you need to cut a hole in the fence somewhere, that will work.
The level of detail system is automatic. The mesh representation contains within it level of detail information. Nearer areas go further down the DAG to higher levels of detail. There's a clever geometry trick which makes the transitions look good. In general, the idea is to maintain about one triangle per screen pixel. The key to all this is that there are only so many pixels on the screen, and that controls how much geometry detail needs to be displayed. So there are still levels of detail, at a fine-grained level.
All this, unfortunately, turns out to be badly matched to what GPUs do. So about 60-70% of the rendering is done in the main CPUs. Nanite really needs a new generation of GPUs, ones that are good at chasing around complex data structures with internal links and offsets.
If you want to understand Nanite, here's the 155 page paper.[1] There's a video which goes with that. It's brilliant, but it's not magic.
[1] https://advances.realtimerendering.com/s2021/Karis_Nanite_SI...