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: bB 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 pplanes ( 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