Title: From Vertices to Fragments II
1From Vertices to Fragments II
- Software College, Shandong University
- Instructor Zhou Yuanfeng
- E-mail yuanfeng.zhou_at_gmail.com
2Review
- Cyrus-Beck clipping algorithm
- Liang-Barsky clipping algorithm
- Sutherland-Hodgman polygon clipping
- DDA line algorithm
- Bresenhams line algorithm
3Objectives
- Rasterization Polygon scan conversion algorithm
- Hidden surface removal
- Aliasing
4Polygon Scan Conversion
- Scan Conversion Fill
- How to tell inside from
- outside
- Convex easy
- Nonsimple difficult
- Odd even test
- Count edge crossings
- Winding number
odd-even fill
5Winding Number
- Count clockwise encirclements of point
- Alternate definition of inside inside if winding
number ? 0
winding number 1
winding number 2
6OpenGL Concave Polygon
- OpenGL can only fill convex polygon correctly
7OpenGL Concave Polygon
- // create tessellator
- GLUtesselator tess gluNewTess()
- // describe non-convex polygon
- gluTessBeginPolygon(tess, user_data)
- // first contour
- gluTessBeginContour(tess)
- gluTessVertex(tess, coords0,
vertex_data) - ...
- gluTessEndContour(tess)
- ...
- gluTessEndPolygon(tess)
- // delete tessellator after processing
- gluDeleteTess(tess)
8Constrained Delaunay Triangulation
9Filling in the Frame Buffer
- Fill at end of pipeline
- Convex Polygons only
- Nonconvex polygons assumed to have been
tessellated - Shades (colors) have been computed for vertices
(Gouraud shading) - Combine with z-buffer algorithm
- March across scan lines interpolating shades
- Incremental work small
10Using Interpolation
- C1 C2 C3 specified by glColor or by vertex
shading - C4 determined by interpolating between C1 and C2
- C5 determined by interpolating between C2 and C3
- interpolate between C4 and C5 along span
C1
C2
C4
scan line
C5
span
C3
11Flood Fill
- Fill can be done recursively if we know a seed
point located inside (WHITE) - Scan convert edges into buffer in edge/inside
color (BLACK)
flood_fill(int x, int y) if(read_pixel(x,y)
WHITE) write_pixel(x,y,BLACK)
flood_fill(x-1, y) flood_fill(x1, y)
flood_fill(x, y1) flood_fill(x,
y-1) //4 directions
12Flood Fill
//8 directions
13Flood Fill with Scan Line
Stack
2
2
2
1
2
2
2
3
2
2
2
2
3
1
0
14Scan Line Fill
- Can also fill by maintaining a data structure of
all intersections of polygons with scan lines - Sort by scan line
- Fill each span
vertex order generated by vertex list
desired order
15Singularities
16Data Structure
17Scan line filling
- For each scan line
- Find the intersections of the scan line with all
edges of the polygon - Sort the intersections by increasing
x-coordinate - Fill in all pixels between pairs of
intersections. - Problem
- Calculating intersections is slow.
- Solution
- Incremental computation / coherence
18Coherence of Region
Trapezoid inside and outside
19Coherence of Scan Line
- e is an integer e
- Intersections number is even
- are inside
inside
inside
inside
20Coherence of Edge
- Intersection points
- of d is le and ld
- The number of le ld
- and are on the same
edge
y63
e
d
y24
21Coherence of Edge
- Observation Not all edges intersect each
scanline. - Many edges intersected by scanline i will also be
intersected by scanline i1 - Formula for scanline s is y s, for an edge is
y mx b - Their intersection is s mxs b --gt xs
(s-b)/m - For scanline s 1, xs1 (s1 - b)/m xs
1/m - Incremental calculation xs1 xs 1/m
22Data Structure
Edge index table ET Active Edge List AEL Node
ymax The max coord y x The bottom x coord
of edge in ET, the intersection x of edge and
scan line in AEL. ?x 1/m next the
next node
Where is the end of one edge while scanning
Initial x
Current scan line and edge intersection
When yy1, xx1/m
Next edge
23Data Structure ET
6
5
2
1
y
24Data Structure AEL
AEL is the edges list which intersect with
current scan line, the next intersection can be
computed by
2
x
1/m
ymax
Active Edge List
Edge list is ordered according x increasing
25Algorithm
- Construct the Edge Table (ET)
- Active Edge List (AEL) null
- for y Ymin to Ymax
- Merge-sort ETy into AEL by x value
- Fill between pairs of x in AEL
- for each edge in AEL
- if edge.ymax y
- remove edge from AEL
- else
- edge.x edge.x dx/dy
- sort AEL by x value
- end scan_fill
26Hidden Surface Removal
- Object-space approach use pairwise testing
between polygons (objects space) - Worst case complexity O(n2) for n polygons
partially obscuring
can draw independently
27Image Space Approach
- Look at each projector (nm for an n x m frame
buffer) and find closest of k polygons - Complexity O(nmk)
- Ray tracing
- z-buffer
- Fast but with low paint quality
28Painters Algorithm
- Render polygons a back to front order so that
polygons behind others are simply painted over
Fill B then A
B behind A as seen by viewer
29Depth Sort
- Requires ordering of polygons first
- O(n log n) calculation for ordering
- Not every polygon is either in front or behind
all other polygons - Order polygons and deal with
- easy cases first, harder later
Polygons sorted by distance from COP
30Easy Cases
- (1) A lies behind all other polygons
- Can render
- (2) Polygons overlap in z but not in either x or
y - Can render independently
31Hard Cases
cyclic overlap
(3) Overlap in all directions but can one is
fully on one side of the other
(4)
penetration
32Back-Face Removal (Culling)
face is visible iff 90 ? ? ? -90 equivalently
cos ? ? 0 or v n ? 0
plane of face has form ax by cz d 0 but
after normalization n ( 0 0 1 0)T need only
test the sign of c In OpenGL we can simply
enable culling but may not work correctly if we
have nonconvex objects
33z-Buffer Algorithm
- Use a buffer called the z or depth buffer to
store the depth of the closest object at each
pixel found so far - As we render each polygon, compare the depth of
each pixel to depth in z buffer - If less, place shade of pixel in color buffer and
update z buffer
34z-Buffer Algorithm
35z-Buffer Algorithm
36Example
37Example
38Example
39Efficiency
- If we work scan line by scan line as we move
across a scan line, the depth changes satisfy
a?xb?yc?z0
Along scan line ?y 0 ?z - ?x
In screen space ?x 1
40Scan-Line Algorithm
- Can combine shading and hsr through scan line
algorithm
scan line i no need for depth information, can
only be in no or one polygon
scan line j need depth information only when
in more than one polygon
41z-Buffer Scan-Line
42Implementation
- Need a data structure to store
- Flag for each polygon (inside/outside)
- Incremental structure for scan lines that stores
which edges are encountered - Parameters for planes for intersections
43Visibility Testing
- In many real-time applications, such as games, we
want to eliminate as many objects as possible
within the application - Reduce burden on pipeline
- Reduce traffic on bus
- Partition space with Binary Spatial Partition
(BSP) Tree
44Simple Example
consider 6 parallel polygons
top view
The plane of A separates B and C from D, E and F
45BSP Tree
- Can continue recursively
- Plane of C separates B from A
- Plane of D separates E and F
- Can put this information in a BSP tree
- Use for visibility and occlusion testing
46BSP Tree
47BSP Algorithm
- Choose a polygon P from the list.
- Make a node N in the BSP tree, and add P to
the list of polygons at that node. - For each other polygon in the list
- If that polygon is wholly in front of the
plane containing P, move that polygon to the list
of nodes in front of P. - If that polygon is wholly behind the
plane containing P, move that polygon to the list
of nodes behind P. - If that polygon is intersected by the
plane containing P, split it into two polygons
and move them to the respective lists of polygons
behind and in front of P. - If that polygon lies in the plane
containing P, add it to the list of polygons at
node N. - Apply this algorithm to the list of polygons
in front of P. - Apply this algorithm to the list of polygons
behind P.
48BSP display
- Type Tree
- Tree front
- Face face
- Tree back
- End
- Algorithm DrawBSP(Tree T point w)
- //w ???
- If T is null then return endif
- If w is in front of T.face then
- DrawBSP(T.back,w)
- Draw(T.face,w)
- DrawBSP(T.front,w)
- Else // w is behind or on T.face
- DrawBSP(T.front,w)
- Draw(T.face,w)
- DrawBSP(T. back,w)
- Endif
- end
49Aliasing
- Ideal rasterized line should be 1 pixel wide
- Choosing best y for each x (or visa versa)
produces aliased raster lines
50Antialiasing by Area Averaging
- Color multiple pixels for each x depending on
coverage by ideal line
antialiased
original
magnified
51Polygon Aliasing
- Aliasing problems can be serious for polygons
- Jaggedness of edges
- Small polygons neglected
- Need compositing so color
- of one polygon does not
- totally determine color of
- pixel
All three polygons should contribute to color
52Time-domain aliasing
- Adding ray tracing line from one pixel