FAST AND SIMPLE AGGLOMERATIVE LBVH CONSTRUCTION

325 Views

Download Presentation
## FAST AND SIMPLE AGGLOMERATIVE LBVH CONSTRUCTION

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**FAST AND SIMPLE AGGLOMERATIVE LBVH CONSTRUCTION**Ciprian Apetrei Computer Graphics & Visual Computing (CGVC) 2014**Introduction**• Hierarchies • What are they for?**Introduction**• Hierarchies • What are they for? • Fast Construction or Better Quality?**Introduction**• Hierarchies • What are they for? • Fast Construction or Better Quality? • When do we prefer speed? • View-frustum culling • Collision detection • Particle simulation • Voxel-based global illumination**Background**• Previous GPU methods constructed the hierarchy in 4 steps: • Morton code calculation • Sorting the primitives • Hierarchy generation • Bottom-ul traversal to fit bounding-boxes**Binary radix tree**• The binary representations of each key are in lexicographical order. • The keys are partitioned according to their first differing bit. • Because the keys are ordered, each node covers a linear range of keys. • A radix tree with n keys has n-1 internal nodes.**Binary radix tree**• The binary representations of each key are in lexicographical order. • The keys are partitioned according to their first differing bit. • Because the keys are ordered, each node covers a linear range of keys. • A radix tree with n keys has n-1 internal nodes. • The parent of a node splits the hierarchy immediately before the first key of its right child and after the last keyof its left child.**Binary radix tree**3 4 7 0 1 2 5 6 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111**Algorithm Overview**• Define a numbering scheme for the nodes • Establish a connection with the keys • Gain some knowledge about the parent**Algorithm Overview**• Define a numbering scheme for the nodes • Establish a connection with the keys • Gain some knowledge about the parent • Each internal node i splits the hierarchy between keys i and i + 1 i i i+1**Algorithm Overview**• We can find the parent of a node by knowing the range of keys covered by it. • The parent splits the hierarchy either immediately before the first key or after the last key. i i i+1 Last key of the left child First key of the right child**Algorithm Overview**• To determine the parent we have to analyze the split point of the two nodes. The one that splits the hierarchy between two more similar subtrees is the direct parent. i i i+1 The metric distance between two keys indicates the dissimilarity between the left child and the right child of node i.**Algorithm Overview**• Algorithm steps: • Start from each leaf node.**Algorithm Overview**• Algorithm steps: • Start from each leaf node. • Choose the parent between the two internal nodes that split the hierarchy at the ends of the range of keys covered by the current node. • Pass the range of keys to the parent.**Algorithm Overview**• Algorithm steps: • Start from each leaf node. • Choose the parent between the two internal nodes that split the hierarchy at the ends of the range of keys covered by the current node. • Pass the range of keys to the parent. • Calculate the bounding box of the node. • Advance towards the root. • Only process a node if it has both its children set.**Binary Radix Tree Construction**0 1 2 3 4 6 5 3 4 7 0 1 2 5 6 7 0 0 1 1 2 2 3 3 5 5 6 6 7 4 4 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111 0 3 5 6 1 2 4 7**Binary Radix Tree Construction**4 4 6 7 0 2 5 0 1 3 5 6 2 1 3 3 4 7 0 1 2 5 6 7 7 0 0 1 1 2 2 3 3 5 5 6 6 4 4 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111 0 3 5 6 1 2 4 7**Binary Radix Tree Construction**1 4 4 0 3 6 5 7 0 2 5 0 1 3 5 6 2 3 3 4 7 0 1 2 5 6 7 7 0 0 1 1 2 2 3 3 5 5 6 6 4 4 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111 0 3 5 6 1 2 4 7**Binary Radix Tree Construction**3 0 1 4 4 7 0 3 6 5 7 0 2 5 0 1 3 5 6 2 3 4 7 0 1 2 5 6 7 7 0 0 1 1 2 2 3 3 5 5 6 6 4 4 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111 0 3 5 6 1 2 4 7**Binary Radix Tree Construction**3 7 0 1 4 4 7 0 3 6 5 7 0 2 5 0 1 3 5 6 2 3 4 7 0 1 2 5 6 7 7 0 0 1 1 2 2 3 3 5 5 6 6 4 4 0 0 1 0 0 0 1 1 01 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1101 1111 0 3 5 6 1 2 4 7**Pseudocode**• Pseudocode for choosing the parent: 1: defChooseParent(Left, Right, currentNode) 2: If ( Left = 0 or ( Right != nand δ(Right) < δ(Left-1) ) ) 3: then 4: parent ÃRight 5: InternalNodesparent.childAÃcurrentNode 6: RangeOfKeysparent.leftÃLeft 7: else 8: parent ÃLeft - 1 9: InternalNodesparent.childBÃcurrentNode 10: RangeOfKeysparent.rightÃRight**Outline**• General aspects about our algorithm: • Bottom-up construction • Finds the parent at each step • O(n) time complexity • Simple to implement • Can be used for constructing different types of trees • Allows an user-defined distance metric for choosing the parent.**Results**• We used the bottom-up reduction algorithm presented by Karras[2012] for implementation. • Compare against Karras binary radix tree construction and bounding-box calculation. • Evaluate performance on GeForce GT 745M • CUDA, 30-bit Morton Codes • Used Thrust library radix sort**Thank You**• Questions