Level of Detail Generating LODs CS 446: Real-Time Rendering & Game Technology

advertisement
Level of Detail
Generating LODs
CS 446: Real-Time Rendering
& Game Technology
David Luebke
University of Virginia
Demo
• Today: Brad Wells
• Thursday: Stephen Lawrence
Real-Time Rendering
2
David Luebke
But first…
• Unstructured Lumigraph Rendering
– Buehler, C., Bosse, M., McMillan, L., Gortler, S., and Cohen, M.,
SIGGRAPH 2001
– Generalizes & formalizes use of geometric proxies in light field
reconstruction
Real-Time Rendering
3
David Luebke
Recap: The Big Question
How should we evaluate and regulate the visual
fidelity of our simplifications?
Real-Time Rendering
4
David Luebke
Recap: Measuring Fidelity
• Fidelity of a simplification to the original model is
often measured geometrically:
METRO by Visual Computing Group, CNR-Pisa
Real-Time Rendering
5
David Luebke
Recap: Measuring Error
• Most LOD algorithms measure error geometrically
– What is the distance between the original and simplified
surface?
– What is the volume between the surfaces?
– Etc
• Really this is just an approximation to the actual
visual error, which includes:
– Color, normal, & texture distortion
– Importance of silhouettes, background illumination,
semantic importance, etc.
Real-Time Rendering
6
David Luebke
Measuring Visual Error
• Measuring error
– Image-based ideas
• Lindstrom & Turk, SIGGRAPH 2000
– Perceptually-based ideas
• Luebke & Hallen, EGRW 2001
• Williams, Luebke, Cohen, Kelley & Schubert, I3D 2003
Real-Time Rendering
7
David Luebke
Generating LODs
• Next topic: generating LODs
• Several subtopics:
– Simplification operator (polygon elision mech)
• Cell collapse
• Vertex removal
• Edge collapse
– Simplification algorithm (high-level approach)
– Measuring error
• Hausdorff distance
• Quadrics
Real-Time Rendering
8
David Luebke
Generating LODs
• Simplification operator:
– Cell collapse
– Vertex removal
– Edge collapse
• Full edge collapse
• Half edge collapse
• Vertex-pair merge a.k.a. “virtual edge collapse”
Real-Time Rendering
9
David Luebke
Generating LODs
• Simplification operator:
– Cell collapse
– Vertex removal
– Edge collapse
• Full edge collapse
– Better fidelity (show why)
• Half edge collapse
– Less memory
– Sort vertices, tris into VAR array for fast rendering
• Vertex-pair merge a.k.a. “virtual edge collapse”
– Merge separate objects
Real-Time Rendering
10
David Luebke
Measuring Geometric Error
• Measuring error
– Hausdorff distance
• One-sided:
h( A, B)  max min a  b
a A
• Two-sided:
bB
H ( A, B)  max  h( A, B), h( B, A) 
– Common approximations:
• Measure vertex-vertex distance, vertex-plane distance
• METRO: Sample H(A,B) by sprinkling points on triangles
• Quadric Error Metrics: a variation of vertex-plane distance that
works well in practice
Real-Time Rendering
11
David Luebke
Edge Collapse Algorithm
V2
Collapse
V2
V1
Real-Time Rendering
12
David Luebke
Edge Collapse Benefits
• Edge collapse operation is simple
• Supports non-manifold topology:
Real-Time Rendering
13
David Luebke
Edge Collapse vs.
Vertex-Pair Merging
• Even better: vertex-pair merging merges two
vertices that:
– Share an edge, or
– Are within some threshold distance t
• Q: What does vertex-pair merging enable over edge
collapse?
Real-Time Rendering
14
David Luebke
Quadric Error Metric
• Minimize distance to all planes at a vertex
• Plane equation for each face:
v
p:
Ax + By + Cz + D  0
• Distance to vertex v :
p  v  [A
T
Real-Time Rendering
B C
15
x 
y
D ]  
1z 
David Luebke
Squared Distance
At a Vertex
D( v ) 
( p
T
v) 2
(v
T
p )( pT v )
p planes ( v )

p planes ( v )
v

T
( ppT )v
p planes ( v )

 v  ppT
pplanes ( v )
T
Real-Time Rendering
16

v

David Luebke
Quadric Derivation (cont’d)
• ppT is simply the plane equation squared:
 A2

AB
T

pp 
 AC

AD
AD 

BD 
BC C2 CD 
2 
BD CD D 
AB
B2
AC
BC
• The ppT sum at a vertex v is a matrix, Q:
D( v )  vT Q v
Real-Time Rendering
17
David Luebke
Using Quadrics
• Construct a quadric Q for every vertex
v2
v1
The edge quadric:
Q1
Q
Q2
Q  Q1 + Q2
• Sort edges based on edge cost
– Suppose we contract to v1:
– v1’s new quadric is simply:
Real-Time Rendering
18
T

edge cost v1 Qv1
Q
David Luebke
Optimal Vertex Placement
• Each vertex has a quadric error metric Q associated
with it
– Error is zero for original vertices
– Error nonzero for vertices created by merge operation(s)
• Minimize Q to calculate optimal coordinates for
placing new vertex
– Details in paper
– Requires inverting Q
– Authors claim 40-50% less error
Real-Time Rendering
19
David Luebke
Boundary Preservation
• To preserve important boundaries, label edges as
normal or discontinuity
• For each face with a discontinuity, a plane
perpendicular intersecting the discontinuous edge is
formed.
• These planes are then converted into quadrics, and
can be weighted more heavily with respect to error
value.
Real-Time Rendering
20
David Luebke
Preventing Mesh Inversion
• Preventing foldovers:
7
8
8
2
2
10
A
9
3
A
9
5
6
3
merge
1
4
10
6
4
5
• Calculate the adjacent face normals, then test if
they would flip after simplification
• If so, that simplification can be weighted heavier or
disallowed.
Real-Time Rendering
21
David Luebke
Quadric Error Metric
• Pros:
–
–
–
–
Fast! (bunny to 100 polygons: 15 sec in 1997)
Good fidelity even for drastic reduction
Robust -- handles non-manifold surfaces
Aggregation -- can merge objects
Real-Time Rendering
22
David Luebke
Quadric Error Metric
• Cons:
– Introduces non-manifold surfaces
(bug or feature?)
– Tweak factor t is ugly
• Too large: O(n2) running time
• Correct value varies with model density
– Needs further extension to handle color
• Garland & Heckbert: 7x7 matrices for XYZRGB, etc
• Hoppe: separate matrices for color, texcoords, etc
Real-Time Rendering
23
David Luebke
View-Dependent LOD: Algorithms
• Many good published algorithms:
– Progressive Meshes by Hoppe
[SIGGRAPH 96, SIGGRAPH 97, …]
– Hierarchical Dynamic Simplification by Luebke &
Erikson [SIGGRAPH 97]
– Multitriangulation by DeFloriani et al
– Others…
Real-Time Rendering
24
David Luebke
Overview:
The VDS Algorithm
• I’ll describe (surprise) my own work
– Algorithm: VDS Implementation: VDSlib
– Similar in concept to most other algorithms
Real-Time Rendering
25
David Luebke
Overview:
The VDS Algorithm
• Overview of the VDS algorithm:
– A preprocess builds the vertex hierarchy,
a hierarchical clustering of vertices
– At run time, clusters appear to grow and shrink as the
viewpoint moves
– Clusters that become too small are collapsed, filtering
out some triangles
Real-Time Rendering
26
David Luebke
Data Structures
• The vertex hierarchy
– Represents the entire model
– Hierarchy of all vertices in model
– Queried each frame for updated scene
• The active triangle list
– Represents the current simplification
– List of triangles to be displayed
– Triangles added and deleted by operations on vertex
tree
Real-Time Rendering
27
David Luebke
The Vertex Hierarchy
• Each node in vertex hierarchy supports a subset of
the model vertices
– Leaf nodes support a single vertex from the original fullresolution model
– The root node supports all vertices
• For each node we also assign a representative
vertex or proxy
Real-Time Rendering
28
David Luebke
The Vertex Tree:
Folding And Unfolding
• Folding a node collapses its vertices to the proxy
• Unfolding the node splits the proxy back into
vertices
8
7
2
8
Fold Node A
A
A
10
10
6
9
1
4
Real-Time Rendering
6
9
3
3
Unfold Node A
5
4
29
5
David Luebke
Vertex Tree Example
8
7
R
2
D
10
E
6
9
3
10
1
A
1
4
7
4
5
C
6
8
3
9
5
Vertex hierarchy
Triangles in active list
Real-Time Rendering
2
B
30
David Luebke
Vertex Tree Example
8
7
R
2
A
D
10
E
6
9
3
10
1
A
1
4
7
4
5
C
6
8
3
9
5
Vertex hierarchy
Triangles in active list
Real-Time Rendering
2
B
31
David Luebke
Vertex Tree Example
8
R
A
D
10
E
6
9
3
10
A
1
4
7
4
5
C
6
8
3
9
5
Vertex hierarchy
Triangles in active list
Real-Time Rendering
2
B
32
David Luebke
Vertex Tree Example
8
R
A
D
10
E
6
9
3
10
B
4
1
2
B
7
4
5
C
6
8
3
9
5
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
33
David Luebke
Vertex Tree Example
8
R
A
D
10
9
E
3
10
B
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
34
David Luebke
Vertex Tree Example
8
R
A
C
9
D
10
E
3
10
B
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
35
David Luebke
Vertex Tree Example
R
A
C
D
10
E
3
10
B
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
36
David Luebke
Vertex Tree Example
R
A
C
E
D
10
E
3
10
B
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
37
David Luebke
Vertex Tree Example
R
A
E
D
10
10
B
A
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
E
38
David Luebke
Vertex Tree Example
R
A
D
E
D
10
10
B
A
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
E
39
David Luebke
Vertex Tree Example
R
D
E
D
10
B
A
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
E
40
David Luebke
Vertex Tree Example
R
D
E
D
E
R
10
B
1
2
B
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
A
41
David Luebke
Vertex Tree Example
R
D
E
R
10
A
1
7
4
5
C
6
8
3
9
Vertex hierarchy
Triangles in active list
Real-Time Rendering
2
B
42
David Luebke
The Vertex Tree
• At runtime, folds and unfolds create a cut or
boundary across the vertex tree:
This part of the model
is represented at high detail
Real-Time Rendering
This part in low detail
43
David Luebke
The Vertex Tree:
Livetris and Subtris
• Two categories of triangles affected:
8
8
7
Fold Node A
2
A
10
10
6
9
1
4
6
9
3
3
Unfold Node A
5
4
5
Node->Subtris: triangles that disappear upon folding
Node->Livetris: triangles that just change shape
Real-Time Rendering
44
David Luebke
The Vertex Tree:
Livetris and Subtris
• The key observation:
– Each node’s subtris can be computed offline to be
accessed quickly at run time
– Each node’s livetris can be maintained at run time, or
lazily evaluated upon rendering
Real-Time Rendering
45
David Luebke
View-Dependent Simplification
• Any run-time criterion for folding and unfolding
nodes may be used
• Examples of view-dependent simplification criteria:
–
–
–
–
Screenspace error threshold
Silhouette preservation
Triangle budget simplification
Gaze-directed perceptual simplification
Real-Time Rendering
46
David Luebke
Screenspace
Error Threshold
• Nodes chosen by projected area
– User sets screenspace size threshold
– Nodes which grow larger than threshold are unfolded
Real-Time Rendering
47
David Luebke
Silhouette Preservation
• Retain more detail near silhouettes
– A silhouette node supports triangles on the visual
contour
– Use tighter screenspace thresholds when examining
silhouette
nodes
Real-Time Rendering
48
David Luebke
Triangle Budget Simplification
• Minimize error within specified number of triangles
– Sort nodes by screenspace error
– Unfold node with greatest error, putting children into
sorted list
Repeat until budget is reached
Real-Time Rendering
49
David Luebke
View-Dependent Criteria:
Other Possibilities
• Specular highlights: Xia describes a fast test to
unfold likely nodes
• Surface deviation: Hoppe uses an elegant surface
deviation metric that combines silhouette
preservation and screenspace error threshold
Real-Time Rendering
50
David Luebke
View-Dependent Criteria:
Other Possibilities
• Sophisticated surface deviation metrics
• Sophisticated perceptual criteria
• Sophisticated temporal criteria
Real-Time Rendering
51
David Luebke
Implementing VDS: Optimizations
• Asynchronous simplification
– Parallelize the algorithm
• Exploiting temporal coherence
– Scene changes slowly over time
• Maintain memory coherent geometry
– Optimize for rendering
– Support for out-of-core rendering
Real-Time Rendering
52
David Luebke
Asynchronous Simplification
• Algorithm partitions into two tasks:
…
Simplify
Task
Vertex Tree
Render
Task
Active Triangle List
• Run them in parallel
Real-Time Rendering
53
David Luebke
Asynchronous Simplification
• If S = time to simplify, R = time to render:
– Single process = (S + R)
– Pipelined
= max(S, R)
– Asynchronous = R
• The goal: efficient utilization of GPU/CPU
– e.g., NV_FENCE extension for asynchronous rendering
Real-Time Rendering
54
David Luebke
Temporal Coherence
• Exploit the fact that frame-to-frame changes are
small
• Three examples:
– Active triangle list
– Vertex tree
– Budget-based simplification
Real-Time Rendering
55
David Luebke
Exploiting
Temporal Coherence
• Active triangle list
– Could calculate active triangles every frame
– But…few triangles are added or deleted
each frame
– Idea: make only incremental changes to an active
triangle list
• Simple approach: doubly-linked list of triangles
• Better: maintain coherent arrays with swapping
Real-Time Rendering
56
David Luebke
Exploiting
Temporal Coherence
• Vertex Tree
– Few nodes change per frame
– Don’t traverse whole tree
– Do local updates only
at boundary nodes
Unfolded
Nodes
Boundary Nodes
Real-Time Rendering
57
David Luebke
Temporal Coherence:
Triangle Budget Simplification
• Exploiting temporal coherence in budget-based
simplification
– Introduced by ROAM [Duchaineau 97]
– Start with tree from last frame, recalculate error for
relevant nodes
– Sort into two priority queues
• One for potential unfolds, sorted on max error
• One for potential folds, sorted on min error
Real-Time Rendering
58
David Luebke
Temporal Coherence:
Triangle Budget Simplification
• Then simplify:
– While budget is met, unfold max node
• This is the node whose folding has created the most error in
the model
– While budget is exceeded, fold min node
• This is the node that introduces the least error when folded
– Insert parents and children into queues
Repeat until errormax < errormin
Real-Time Rendering
59
David Luebke
Optimizing For Rendering
• Idea: maintain geometry in coherent arrays
Active triangles
Unfolded nodes
Real-Time Rendering
Inactive triangles
Boundary nodes
60
Inactive nodes
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C D E F G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Real-Time Rendering
61
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C D E F G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Swap D with F
Real-Time Rendering
62
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C D E F G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Swap D with F
Real-Time Rendering
63
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Swap D with F
Real-Time Rendering
64
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Move Unfolded/Boundary Marker
Real-Time Rendering
65
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H I
Inactive nodes
J K L M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
66
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H L J K
Inactive nodes
I M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
67
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H L J K
Inactive nodes
I M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
68
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
A B C F E D G H L J K
Inactive nodes
I M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
69
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes
Boundary nodes
Inactive nodes
A B C F E D G K L J H I M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
70
David Luebke
Optimizing For Rendering
• Idea: use swaps to maintain coherence
Unfolded nodes Boundary nodes
Inactive nodes
A B C F E D G K L J H I M N O P Q
Fold node D:
Deactivate D’s children (swap w/ last boundary node)
Real-Time Rendering
71
David Luebke
Optimizing For Rendering:
Vertex Arrays
• Biggest win: vertex arrays
Unfolded nodes
Boundary nodes
Inactive nodes
Vertex array!
– Actually, keep separate parallel arrays for rendering data
(coords, colors, etc)
Real-Time Rendering
72
David Luebke
Optimizing For Rendering:
Vertex Arrays on GeForce2
Triangles using
Vertex arrays
Plain old triangles ~64,000 Vertex Torus
vertex arrays
in fast memory
12
Total Rendering Seconds
10
8
6
4
2
0
Immediate Mode
Display List
Real-Time Rendering
Vertex Arrays
Per-rendering Alw ays Locked
Compiled
Compiled
Vertex Arrays Vertex Arrays
Triangles
Trianlge Strips
VAR Video
Memory (no
rew rite)
73Quads
VAR AGP
Memory (no
rew rite)
VAR Regular
Memory (no
rew rite)
Quad Strips
VAR Video
Memory
(rew ritten)
VAR AGP
Memory
(rew ritten)
VAR Regular
Memory
(rew ritten)
David Luebke
Out-of-core Rendering
• Coherent arrays lend themselves to out-of-core
simplification and rendering:
…
These need to be in memory…
Real-Time Rendering
74
These do not
David Luebke
Out-of-core Rendering
• Coherent arrays lend themselves to out-of-core
simplification and rendering:
– Only need active portions of triangle and node arrays
– Implement arrays as memory-mapped files
• Let virtual memory system manage paging
• A prefetch thread walks boundary nodes, bringing their
children into memory to avoid glitches
Real-Time Rendering
75
David Luebke
Summary:
VDS Pros
• Supports drastic simplification!
– View-dependent; handles the
Problem With Large Objects
– Hierarchical; handles the
Problem With Small Objects
– Robust; does not require (or preserve)
mesh topology
Real-Time Rendering
76
David Luebke
Summary:
VDS Pros
• Rendering can be implemented efficiently using
vertex arrays
• Supports rendering of models much larger than
main memory
Real-Time Rendering
77
David Luebke
Summary:
VDS Cons
• Increases CPU, memory overhead
• Hard to map efficiently onto GPU for efficient
utilization
Real-Time Rendering
78
David Luebke
Summary:
VDS Cons
• Be aware of mesh foldovers:
7
8
2
10
6
9
3
1
4
Real-Time Rendering
5
79
David Luebke
Summary:
VDS Cons
• Be aware of mesh foldovers:
7
8
2
10
A
9
6
3
1
4
Real-Time Rendering
5
80
David Luebke
Summary:
VDS Cons
• Be aware of mesh foldovers:
8
2
10
A
9
3
4
Real-Time Rendering
6
5
81
David Luebke
Summary:
VDS Cons
• Be aware of mesh foldovers:
– These can be very distracting artifacts
– Can prevent them at run-time
• Add a normal-flipping test to fold criterion
• Use a clever numbering scheme proposed by El-Sana and
Varshney
Real-Time Rendering
82
David Luebke
View-Dependent Versus Discrete
LOD
• View-dependent LOD is superior to traditional
discrete LOD when:
– Models contain very large individual objects (e.g.,
terrains)
– Simplification must be completely automatic (e.g.,
complex CAD models)
– Experimenting with view-dependent simplification
criteria
Real-Time Rendering
83
David Luebke
View-Dependent Versus Discrete
LOD
• Discrete LOD is often the better choice:
– Simplest programming model
– Reduced run-time CPU load
– Easier to leverage hardware:
• Compile LODs into vertex arrays/display lists
• Stripe LODs into triangle strips
• Optimize vertex cache utilization and such
Real-Time Rendering
84
David Luebke
View-Dependent Versus Discrete
LOD
• Applications that may want to use:
– Discrete LOD
• Video games (but much more on this later…)
• Simulators
• Many walkthrough-style demos
– Dynamic and view-dependent LOD
• CAD design review tools
• Medical & scientific visualization toolkits
• Terrain flyovers (a whole topic unto itself…)
Real-Time Rendering
85
David Luebke
Continuous LOD:
The Sweet Spot?
• Continuous LOD may be the right compromise
on modern PC hardware
– Benefits of fine granularity without the cost of
view-dependent evaluation
– Can be implemented efficiently with regard to
• Memory
• CPU
• GPU
Real-Time Rendering
86
David Luebke
VDSlib
• Implementation: VDSlib
– A public-domain view-dependent simplification and
rendering package
– Flexible C++ interface lets users:
• Construct vertex trees for objects or scenes
• Specify with callbacks how to simplify, cull, and render
them
– Available at http://vdslib.virginia.edu
Real-Time Rendering
87
David Luebke
GLOD
• An easy-to-use library for level of detail in OpenGL
– LOD generation
– LOD run-time management
– View-dependent LOD (using VDSlib)
http://www.cs.jhu.edu/~graphics/GLOD
Real-Time Rendering
88
David Luebke
VDSlib:
Ongoing Work
• Various research projects that have used VDSlib:
– Out-of-core LOD for interactive rendering of truly
massive models
– Perceptually-guided view-dependent LOD, including
gaze-directed techniques
– Non-photorealistic rendering using VDSlib as a
framework
Real-Time Rendering
89
David Luebke
Download