strips: triangle and quad jyun-ming chen reference: 1, 212
TRANSCRIPT
Strips: Triangle and Quad
Jyun-Ming ChenReference: 1, 2
CGTopics, Spring 2010 2
From Blue 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 2010 3
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) vn: (2n+2) v
In general, n: (n+2) vn: (2n+2) v
CGTopics, Spring 2010 4
Syntax
Sequence of vertices: follow the arrows separating the triangles
a c
b d
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 2010 5
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 2010 6
Key Difference (swap)
Common edges Head-tail connected: no swap Strut exists: swap!
a c
b d
e
f
a
b d
e
f
c
CGTopics, Spring 2010 7
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 2010 8
Exercise
How can this strip be made?
a
b d
c
fg
h i
j
e
Algorithmically, how does one
construct a strip given a set of
connected triangles?
CGTopics, Spring 2010 9
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 2010 10
Example
a c
b d
e
fabcdef (4, 6v)All triangles are CW-winded
abcdef (4, 6v)All triangles are CCW-winded
a c
b
e
d f
CGTopics, Spring 2010 11
Example (Swap)
abcxcdef (5, 8v)All triangles are CCW-winded
a c
b
e
d fx
a c
b d
e
f
aabcdef (4, 7v)All triangles are CCW-winded
CGTopics, Spring 2010 12
Example (flat shading)
a c
b d
e
f Begin v(a) v(b) n(T1), v(c) n(T2), v(d) n(T3), v(e) n(T4), v(f)End
T1
T2 T3
T4
CGTopics, Spring 2010 13
Remark: Flat Shading
According to spec, the color/normal of flat shaded polygon depends on the last primitive-defining vertexSo the code should work fine if glShadeModel(GL_FLAT) is specifiedHowever, 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 2010 15
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
1
1
3
32 1
3
2
2
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 2010 16
CGTopics, Spring 2010 17
1
1
3
32 1
3
2
2
1
1
2
32 1
3
2
2
1
0
2
22 1
3
1
2
1
0
1
22 1
3
1
1
1
0
1
22 1
2
0
1
1
0
1
21 0
2
0
0
1
0
1
21 0
1
0
0 Degree Update
CGTopics, Spring 2010 18
Supplement
Strip collection is related to finding Hamliton paths in the dual graphWhile 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 2010 19
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 2010 20
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 2010 21
Weight assignment
References: 1, 2
CGTopics, Spring 2010 22
Strip for a Cube
CGTopics, Spring 2010 23
Quad strip
SyntaxWinding (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 2010 24
Example (quadstrip)0
1
2
3
4
5
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 2010 25
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 2010 26
Step 3 Cases
No Di+1 Add “other v”
Di+1 (with swap)
Di+1 (with no swap)
CGTopics, Spring 2010 27
i-1i
other v
i-1i
other v
i+1
i-1i
other v
i+1
CGTopics, Spring 2010 28
Example
a
b d
c
fg
h i
j
e
Add acb
Add acbcd
Add acbcdce
Add acbcdcef
Add acbcdcefg
Add acbcdcefgh
Add acbcdcefghgi
Add acbcdcefghgij
12
3
45
67
8
If the common vertex between i & i-1 is not end of strip, swap is needed
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 2010 29
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 2010 30
xxxx
0001&
000xIsTagged ClearTag
xxxx
1110&
xxx0SetTag
xxxx
0001|
xxx1
ToggleTag
xxxx
0001^
xxxx
A quicker way to find the intersection of two sets
Stripifier by OpenMesh
OpenMesh/Tools/UtilsThe strips generated are not as good
CGTopics, Spring 2010 31
Stripifier
CGTopics, Spring 2010 32