Click or drag to resize

NeoAxis Levels

Scripting OverviewManual / NeoAxis LevelsInstallation

NeoAxis Levels

Contents
Overview

NeoAxis Levels, or just Levels, is a system which represent a set of techniques and tools to give the ability to get maximum rendering performance from modern GPUs. We did a lot of research and creative work in order to get the system. This is a complex system, consisting of many different techniques that are put together uniquely.

One of the key components of the system is the virtualized geometry technique, we call it Voxel LOD. The technique allows you to get the best rendering performance at far distances from the camera.

Screenshots below are made from 'Samples\Starter Content\Scenes\Levels.scene', City Demo and Nature Demo.

Screenshot999999999999999999999999100.png
Screenshot999999999999999999999999101.png
Screenshot999999999999999999999999099.png
Screenshot999999999999999999999999113.png
Architecture

Levels is based on a system of smooth levels of detail, each level of which can be implemented in a special way. Due to the smooth transition between levels, there is no great requirement for the visual identity of neighboring levels.

The image is good at showing the distribution of objects by distance. We are dividing the distance interval into three parts: objects near, in the middle and far. Each of part has different way to get final image on the screen.

LevelsDistances.png
Near distance

Objects nearby. We have found that the most efficient way to draw objects is to simply draw them in the usual way. Virtualized geometry is of little or no use here, due to the need to draw the full detail of the mesh. A full mesh is best drawn using standard GPU functionality (vertex-index buffer, don't use compute). It is possible to apply some optimizations, such as mesh shader, but this does not give a significant increase, because the scene will never have many objects at the near distance. Conclusion: at close range it's easiest to just draw the usual mesh as it is.

Far distance

Objects at the far distance. The main problem with drawing distant objects is their large number and the number of triangles in each mesh. Usual LOD systems don't give the ability to calculate an acceptable simplified mesh, so this is a problem. The modern world requires a lot of scalability in terms of the number of objects in the scene, and all these objects are mostly at a far distance.

After a lot of experiments we got Voxel LOD technique, which allows you to most effectively display objects at a far distance. The technique includes tools for voxelizing a mesh and a way to display a voxelized mesh. Each object in the scene is rendered using no more than 12 triangles, which solves the problem of many triangles.

If show only the last LOD, then the whole world will become voxel.

Screenshot999999999999999999999999112.png
Middle distance

Objects at the middle distance. There is an interval between near and far objects where it is inefficient to use a full mesh or Voxel LOD. On this interval we use a special LOD, which we call Careful LOD. This is the level of detail that is obtained from the original mesh, with the requirement is to reduce the number of triangles without significant visual damage. Usually 2 such levels are generated, although it is often enough to do 1 level or none.

Screenshot999999999999999999999999109 2.png
Multi materials

An integral part of the system is the support of multi materials. They make it possible to combine multiple materials into one draw call.

On the screenshot you can see a mesh with one mesh geometry, but with several materials.

Screenshot999999999999999999999999102 2.png
Batching and auto instancing

Thanks to the static batching and automatic instancing built into the engine, the system allows you to display both static and dynamic objects very efficiently. It is enough for the developer to use the appropriate components when creating the scene, the engine will take care of the rest. Dynamic instancing uses multithreaded optimizations, which gives good scaling on multiprocessor systems.

Vertex channels packing

When importing a 3D model, the system converts the channels to half or byte8 format, which reduces the size of meshes on the GPU.

Breaking into sectors by distance

The rendering pipeline of the engine splits the visible objects by distance and draws sectors from near to far. This allows to skip drawing those pixels that are not visible.

Scalability by device power

The system includes many options for customization. For example, by changing the LOD Scale you can give more quality or speed without changing the scene. You can configure to draw most objects of the scene with Voxel LOD and only a small part with real meshes.

Screenshot999999999999999999999999105.png
Screenshot999999999999999999999999106.png
Screenshot999999999999999999999999108.png
Transparent objects

Since usual meshes are used for near and middle distances, there is no problem with transparent objects. For objects at far distances the transparency is currently baked into a voxel structure, which gives an acceptable result. Alpha clip transparency is fully supported on any distances.

We have ideas how to improve the transparency on far distances, so this is not final solution.
Screenshot999999999999999999999999107.png
Mobile devices

Voxel LOD has not yet been ported to mobile devices. The system should work well on mobile devices, because it uses basic GPU capabilities and it can be well configured.

Screenshot999999999999999999999999114 2.png
Animated meshes

Voxel LOD right now not supports animated and dynamic meshes. We are planning to do research, technically is possible to update Voxel LOD in real-time on GPU.

See also
Scripting OverviewInstallation