Unreal Geomorph Level-Of-Detail Notes
Erik de Neve - Epic Games, Inc.
Last updated May 19 1999
LOD tech introduction
The Unreal engine has
always been able to handle large open spaces quite well, but with
large sized scenes, and with multi-player deathmatch and team
games as well, there is an increased risk of many actors being
visible at the same time.
By using distance-dependent simplification, the speed penalty for
rendering actor meshes diminishes greatly as their smaller size
farther away allows them to be drawn using fewer polygons.
Unreal's new continuous-LOD (Level-Of-Detail) rendering offers a
way to make the rendering of all polygonal actors in the engine
scaleable, fully compatible with all existing static and
animating mesh content.
Polygons gradually disappear in a sequence which is fixed at
content-compilation time (building the .U files) for each mesh.
Such a continuous sequence of shapes, known as a 'geomorph', is
constructed by automatic evaluation of the shape of a mesh,
notably edge sizes and surface curvature.
Unreal's unique smooth LOD morphing ability makes the culling of
polygons less conspicuous, notably close up, and is achieved by
preemptive shrinkage of mesh faces in an overlapping
a-synchronous fashion, while the texture mapping is smoothly
adapted also.
Version
224 LOD note for licensees and mod authors
The mesh LOD as
active in Unreal 224 does not give the optimal achievable
speedup, as it uses very conservative default LOD strength
settings. This was necessary to achieve backward compatibility
with the entire Unreal 1 content without the team having to go
back and check/tweak the settings for individual meshes.
There is one arbitrary hard-coded global LOD factor which
licensees can change in UnMeshRnLod.h:
FLOAT MeshVertLOD = 430.f ..........
Useful settings fall between 150 and 450; smaller numbers result
in more aggressive LOD culling.The MLOD console command can be
helpful for testing adjustment of this global strength
interactively.
The optimal tradeoff between speed and detail for individual
meshes can be tweaked to satisfaction further by using the mesh
LOD script parameters explained below.
Console commands
Mainly for in-game
testing purposes; to see the LOD-culling and morphing in
action,set MLMODE 3, then zoom in with the sniper rifle (or
directly using the FOV command) to see how the distant meshes are
simplified, then fly closer in slomo+ghost mode to see it morph
into full detail again.
On the UT bots, you can see the backpack appear, an antenna
suddenly extends upwards, the microphone snakes its way back
around the head, etc.
Click here for some sample screenshots.
MLOD X
A strength scaling factor centered on 1.0, to scale the strength
of the LOD culling -
higher values strengthen the LOD fall-off with distance.
MLMODE
X
0 Draw everything at full (or at
MLFIX-ed) detail.
1 Normal level-of-detail mode
2 Disable smooth morphing.
3 Ignore the field-of-view effect on LOD
(great for debugging!)
4 Disable smooth morphing, ignore
field-of-view.
MLFIX X
A float in the range 0.0-1.0 which, when in MLMODE 0, causes
all meshes to be drawn using this proportion of their vertices.
Mesh LOD script parameters
Here's a specific
script variable example. None of these extra parameters are
required.
LOD importing can be on or off by default (depending on how it is
hardcoded in UnEdSrv.cpp)
#exec MESH IMPORT MESH=LodMesh ANIVFILE=MODELS\AnyMesh_a.3D
DATAFILE=MODELS\AnyMesh_d.3D X=0 Y=0 Z=0 MLOD=1 LODSTYLE=0
LODFRAME=19
#exec MESH LODPARAMS MESH=LodMesh STRENGTH=1.0 MINVERTS=14
MORPH=0.25 ZDISP=90.0
MESH IMPORT parameters:
MLOD | Boolean , meshLOD switch
( if 0, the mesh will always be rendered at full detail
). Always use MLOD=0 if you want to disable any detail loss, rather than putting extreme STRENGTH or MINVERTS values in the LODPARAMS. |
LODSTYLE | A bit field with switches
to change the style of building the pre-collapse
sequence. By default, none of these bits are set. Useful ones right now are 8 and 2 in particular. 1: Value curvature over length. 2: Protect the edges of doublesided polygons - like the CTF flags. 4: Try to respect texture seams more. Use this if there is too much 'stretching' going on. 8: Value length over curvature. Needed for unwelded, multi-element, or otherwise 'open' meshes like the new superhealth. 16: Translucent polygons will be collapsed less early in the LOD sequence. (Broken in the 224 code base.) |
LODFRAME | When there are multiple
animation frames, you can pick a representative one other
than the default 0th frame to be sampled for generating the collapse sequence. |
LODNOTEX | If set, causes texture
coordinates to be ignored when importing. Results in modest memory and performance savings for complex environment-mapped meshes. |
LODOLD | Maintain the original
order of animation vertices as they are imported. If
active, this means some internal reorganization will be
done at load time, instead of compile time. Included to make differential patching of older content feasible. |
MESH LODPARAMS parameters:
STRENGTH | Per-mesh linear LOD scaler. Default = 1.0. Tweak this higher for more aggressive LOD-culling, lower if you see the mesh distort too early . |
MINVERTS | The minimum number of vertices you want your mesh to always retain at the farthest distances. Useful for some really simple objects (boxes, trees, birds...) that need to look good even at a fair distance. |
MORPH | 0.0 for no morphing, any
other value up to 1.0 indicates the proportion of
vertices that are allowed to contribute to the smooth
morphing. More means less popping, but at the cost of more CPU time. Useful values are 0.25 - 0.4, the default is currently 0.3. |
ZDISP | In world units ( the
standard player height is 60 ) this pushes away the
distance at which the LOD culling kicks in. More
precisely, the fraction of vertices drawn scales with the distance Z as follows: 1 / ( STRENGTH * (Z - ZDISP) ), where (Z-ZDISP) is clamped at a minimum of 1.0. |