Strips: Triangle and Quad Jyun-Ming Chen Reference: 1, 212
CGTopics, Spring From Blue BookBlue Book GL_TRIANGLE_STRIP For odd n, vertices n, n+1, and n+2 define triangle n. For even n, vertices n+1, n, and n+2 define triangle n. GL_QUAD_STRIP Vertices 2n-1, 2n, 2n+2, and 2n+1 define quadrilateral n.
CGTopics, Spring Using Strips Reduce number of glVertex calls Each glVertex call send a data through pipeline: matrix multiplication, … 4 6v instead of 12v 3 : 8v instead of 12v In general, n : (n+2) v n : (2n+2) v In general, n : (n+2) v n : (2n+2) v
CGTopics, Spring Syntax Sequence of vertices: follow the arrows separating the triangles ac bd e f abcdef [abc,bcd,cde,def] [abc,cbd,cde,edf] alternate winding; interpret as …. GL_TRIANGLE_STRIP For odd n, vertices n, n+1, and n+2 define triangle n. For even n, vertices n+1, n, and n+2 define triangle n.
CGTopics, Spring Swap Sometimes, additional vertices need to be added (known as swap) a b d e f c [abc,cbd,cdc,cde,cef] abcdcef [abc,bcd,cdc,dce,cef] alternate winding A penalty: need one more vertex for the swap Swap is a penalty; but breaking into two strips is more costly
CGTopics, Spring Key Difference (swap) Common edges Head-tail connected: no swap Strut exists: swap! ac bd e f a b d e f c
CGTopics, Spring Fan: a strip with many swaps b c d e a bacadae (bac, aca, cad, ada, dae) The same geometry can be given by a triangle fan: aedcb
CGTopics, Spring Exercise How can this strip be made? a b d c f g h i j e Algorithmically, how does one construct a strip given a set of connected triangles?
CGTopics, Spring Other Topics of Triangle Strips Winding: determined by the first triangle Related: glFrontFace, glCullFace Shading: Smooth: specify normal vector preceding each vertex Flat: only send (face) normal before the face- defining vertex
CGTopics, Spring Example ac bd e f abcdef (4 , 6v) All triangles are CW-winded abcdef (4 , 6v) All triangles are CCW-winded a c b e d f
CGTopics, Spring Example (Swap) abcxcdef (5 , 8v) All triangles are CCW-winded a c b e d f x ac bd e f aabcdef (4 , 7v) All triangles are CCW-winded
CGTopics, Spring Example (flat shading) ac bd e f Begin v(a) v(b) n(T 1 ), v(c) n(T 2 ), v(d) n(T 3 ), v(e) n(T 4 ), v(f) End T1T1 T2T2 T3T3 T4T4
CGTopics, Spring Remark: Flat Shading According to spec, the color/normal of flat shaded polygon depends on the last primitive-defining vertex So the code should work fine if glShadeModel(GL_FLAT) is specified However, if the shade model is changed to GL_SMOOTH, the normal vectors will be assigned to either (0,0,1) or (-1,0,0) depending on the order of traversal. Be careful! This code can be problematic!
Stripification New word for “ strip generation ”
CGTopics, Spring Greedy Stripping (SGI) Each triangle associated with an adjacency number (degree in dual graph) Start from the triangle with lowest degree, collect along the path with uncollected & fewer degree triangle Tend to minimize leaving isolated triangles
Details (OpenMesh) Assign each face with the following integer property: degree (face valence); collected For triangular mesh, four possible values for degree: 0 (isolated), 1, 2, 3 No need to sort; just start from any triangle with degree 1. When exhausted, start with degree 2, then degree 3. Output degree 0 triangle as GL_TRIANGLES Collect the triangle.idx into an STL vector Degree update When a triangle is collected, decrement the degree of its neighbors CGTopics, Spring
CGTopics, Spring Degree Update
CGTopics, Spring Supplement Strip collection is related to finding Hamliton paths in the dual graph While a single Hamilton path seems impossible, longer strips are preferred (for better rendering speed) Wikipedia: In the mathematical field of graph theory, a Hamiltonian path (or traceable path) is a path in an undirected graph which visits each vertex exactly once.
CGTopics, Spring Stripification (Kommann) Starting triangle: one with least number of adjacency that are not part of any strip Idea: process isolated triangles first Step Evaluate the weight all neighboring triangles; choose the one with minimum weight to continue the strip
CGTopics, Spring Kommann (cont) Weight evaluation Face Connectivity: 0,1,2 (# of triangles not visited) – include poorly connected triangles first Node connectivity: use connectivity of nodes of the current triangle to decide which side to add: +1 for highest connected node, -1 for all other nodes Swap required: +1(yes), -1(no)
CGTopics, Spring Weight assignment References: 1, 212
CGTopics, Spring Strip for a Cube
CGTopics, Spring Quad strip Syntax Winding (consistent) Shading smooth shading: averaging vertex colors Flat shading: the color of the last defining vertex GL_QUAD_STRIP Vertices 2n-1, 2n, 2n+2, and 2n+1 define quadrilateral n. Compare GL_QUADS Vertices 4n-3, 4n-2, 4n-1, and 4n define quadrilateral n.
CGTopics, Spring Example (quadstrip) Quads are formed as (0,1,3,2) and (2,3,5,4) Using quadstrip: we give 0,1,2,3,4,5 Using quads: we need to give 0,1,3,2, 2,3,5,4
1. Add the vertices of the (i=1) to the strip. From the “stand alone” vertex 2. Increment i, adding i 3. Consider the existence of i If no, add the “ other v ” of i If yes, find the common vertex between i & i-1 If the common vertex is the last (tail) vertex in the strip, add the “ other v ” of i If not, add the common vertex to the strip (swap), then add the “ other v ” of i 4. Proceed to step 2, until all triangles have been added CGTopics, Spring Algorithm: Strip construction Assuming all triangles are CCW-oriented i=1 Stand-alone
Step 1 Stand alone vertex Find the common vertices between D1 & D2 Take the one that’s left alone CGTopics, Spring
Step 3 Cases No Di+1 Add “other v” Di+1 (with swap) Di+1 (with no swap) CGTopics, Spring i-1 i other v i-1 i other v i+1 i-1 i other v i+1
CGTopics, Spring Example a b d c f g h i j e Add acb Add acbcd Add acbcdce Add acbcdcef Add acbcdcefg Add acbcdcefgh Add acbcdcefghgi Add acbcdcefghgij If the common vertex between i & i-1 is not end of strip, swap is needed Input: triangles to be put in a strip ( 1-8 ) Output: the vertices forming the strip (the 13 vertices)
CGTopics, Spring Remark The underlying data structure should be able to answer these queries efficiently Stand-alone vertex of triangle “ other-v ” of a triangle Common vertex of two triangles For Kommann stripification Number of unvisited neighbors of a triangle Number of triangles connecting to a vertex
[Tagging] CGTopics, Spring xxxx 0001 & 000x IsTagged ClearTag xxxx 1110 & xxx0 SetTag xxxx 0001 | xxx1 ToggleTag xxxx 0001 ^ xxxx A quicker way to find the intersection of two sets
Stripifier by OpenMesh OpenMesh/Tools/Utils The strips generated are not as good CGTopics, Spring
Stripifier CGTopics, Spring