Download presentation
1
CS 551 / 645: Introductory Computer Graphics
Rasterizing Triangles
2
The Rock Says This... Midterm Date - before or after reading weekend?
Final Date - Early or late in week Assignment 1 - Sun vs. SGI vs. PC Grad school orientation after class
3
Review Line rasterization Basic Incremental Algorithm
Digital Differential Analyzer Rather than solve line equation at each pixel, use evaluation of line from previous pixel and slope to approximate line equation Bresenham (Midpoint line algorithm) Use integer arithmetic and midpoint discriminator to test between two possible pixels (over vs. over-and-up)
4
Rasterizing Polygons In interactive graphics, polygons rule the world
Two main reasons: Lowest common denominator for surfaces Can represent any surface with arbitrary accuracy Splines, mathematical functions, volumetric isosurfaces… Mathematical simplicity lends itself to simple, regular rendering algorithms Like those we’re about to discuss… Such algorithms embed well in hardware
5
Rasterizing Polygons Triangle is the minimal unit of a polygon
All polygons can be broken up into triangles Convex, concave, complex Triangles are guaranteed to be: Planar Convex What exactly does it mean to be convex?
6
Convex Shapes A two-dimensional shape is convex if and only if every line segment connecting two points on the boundary is entirely contained.
7
Triangularization Convex polygons easily triangulated
Concave polygons present a challenge
8
Rasterizing Triangles
Interactive graphics hardware commonly uses edge walking or edge equation techniques for rasterizing triangles
9
Edge Walking Basic idea: Draw edges vertically
Fill in horizontal spans for each scanline Interpolate colors down edges At each scanline, interpolate edge colors across span
10
Edge Walking: Notes Order three triangle vertices in x and y
Find middle point in y dimension and compute if it is to the left or right of polygon. Also could be flat top or flat bottom triangle We know where left and right edges are. Proceed from top scanline downwards Fill each span Until breakpoint or bottom vertex is reached Advantage: can be made very fast Disadvantages: Lots of finicky special cases
11
Edge Walking: Disadvantages
Fractional offsets: Be careful when interpolating color values! Beware of gaps between adjacent edges Beware of duplicating shared edges
12
Edge Equations An edge equation is simply the equation of the line defining that edge Q: What is the implicit equation of a line? A: Ax + By + C = 0 Q: Given a point (x,y), what does plugging x & y into this equation tell us? A: Whether the point is: On the line: Ax + By + C = 0 “Above” the line: Ax + By + C > 0 “Below” the line: Ax + By + C < 0
13
Edge Equations Edge equations thus define two half-spaces:
14
Edge Equations And a triangle can be defined as the intersection of three positive half-spaces: A1x + B1y + C1 < 0 A2x + B2y + C2 < 0 A3x + B3y + C3 < 0 A1x + B1y + C1 > 0 A3x + B3y + C3 > 0 A2x + B2y + C2 > 0
15
Edge Equations So…simply turn on those pixels for which all edge equations evaluate to > 0: - - + + + -
16
Using Edge Equations Which pixels: compute min,max bounding box
Edge equations: compute from vertices Orientation: ensure area is positive (why?)
17
Computing Edge Equations
Want to calculate A, B, C for each edge from (x1, y1) and (x2, y2) Treat it as a linear system: Ax1 + By1 + C = 0 Ax2 + By2 + C = 0 Notice: two equations, three unknowns What can we solve? Goal: solve for A & B in terms of C
18
Computing Edge Equations
Set up the linear system: Multiply both sides by matrix inverse: Let C = x0 y1 - x1 y0 for convenience Then A = y0 - y1 and B = x1 - x0
19
Edge Equations So…we can find edge equation from two verts.
Given three corners C0, C1, C2 of a triangle, what are our three edges? How do we make sure the half-spaces defined by the edge equations all share the same sign on the interior of the triangle? A: Be consistent (Ex: [C0 C1], [C1 C2], [C2 C0]) How do we make sure that sign is positive? A: Test, and flip if needed (A= -A, B= -B, C= -C)
20
Edge Equations: Code Basic structure of code:
Setup: compute edge equations, bounding box (Outer loop) For each scanline in bounding box... (Inner loop) …check each pixel on scanline, evaluating edge equations and drawing the pixel if all three are positive
21
Optimize This! findBoundingBox(&xmin, &xmax, &ymin, &ymax);
setupEdges (&a0,&b0,&c0,&a1,&b1,&c1,&a2,&b2,&c2); /* Optimize this: */ for (int y = yMin; y <= yMax; y++) { for (int x = xMin; x <= xMax; x++) { float e0 = a0*x + b0*y + c0; float e1 = a1*x + b1*y + c1; float e2 = a2*x + b2*y + c2; if (e0 > 0 && e1 > 0 && e2 > 0) setPixel(x,y); }
22
Edge Equations: Speed Hacks
Some speed hacks for the inner loop: int xflag = 0; for (int x = xMin; x <= xMax; x++) { if (e0|e1|e2 > 0) { setPixel(x,y); xflag++; } else if (xflag != 0) break; e0 += a0; e1 += a1; e2 += a2; } Incremental update of edge equation values (think DDA) Early termination (why does this work?) Faster test of equation values
23
Edge Equations: Interpolating Color
Given colors (and later, other parameters) at the vertices, how to interpolate across? Idea: triangles are planar in any space: This is the “redness” parameter space Note:plane follows form z = Ax + By + C Look familiar?
24
Edge Equations: Interpolating Color
Given redness at the 3 vertices, set up the linear system of equations: The solution works out to:
25
Edge Equations: Interpolating Color
Notice that the columns in the matrix are exactly the coefficients of the edge equations! So the setup cost per parameter is basically a matrix multiply Per-pixel cost (the inner loop) cost equates to tracking another edge equation value
26
Triangle Rasterization Issues
Exactly which pixels should be lit? A: Those pixels inside the triangle edges What about pixels exactly on the edge? (Ex.) Draw them: order of triangles matters (it shouldn’t) Don’t draw them: gaps possible between triangles We need a consistent (if arbitrary) rule Example: draw pixels on left or top edge, but not on right or bottom edge
27
General Polygon Rasterization
Now that we can rasterize triangles, what about general polygons? We’ll take an edge-walking approach
28
General Polygon Rasterization
Consider the following polygon: How do we know whether a given pixel on the scanline is inside or outside the polygon? D B C A E F
29
General Polygon Rasterization
Does it still work? D B H C A G I E F
30
General Polygon Rasterization
Basic idea: use a parity test for each scanline edgeCnt = 0; for each pixel on scanline (l to r) if (oldpixel->newpixel crosses edge) edgeCnt ++; // draw the pixel if edgeCnt odd if (edgeCnt % 2) setPixel(pixel); Why does this work? What assumptions are we making?
31
Faster Polygon Rasterization
How can we optimize the code? for each scanline edgeCnt = 0; for each pixel on scanline (l to r) if (oldpixel->newpixel crosses edge) edgeCnt ++; // draw the pixel if edgeCnt odd if (edgeCnt % 2) setPixel(pixel); Big cost: testing pixels against each edge Solution: active edge table (AET)
32
Active Edge Table Idea:
Edges intersecting a given scanline are likely to intersect the next scanline The order of edge intersections doesn’t change much from scanline to scanline
33
Active Edge Table Algorithm: Sort all edges by their minimum y coord
Starting at bottom, add edges with Ymin= 0 to AET For each scanline: Sort edges in AET by x intersection Walk from left to right, setting pixels by parity rule Increment scanline Retire edges with Ymax < Y Add edges with Ymin > Y Recalculate edge intersections (how?) Stop when Y > Ymax for last edges
34
Next Topic: Clipping We’ve been assuming that all primitives (lines, triangles, polygons) lie entirely within the viewport In general, this assumption will not hold:
35
Clipping Analytically calculating the portions of primitives within the viewport
36
Why Clip? Bad idea to rasterize outside of framebuffer bounds
Also, don’t waste time scan converting pixels outside window
37
Clipping The naïve approach to clipping lines:
for each line segment for each edge of viewport find intersection points pick “nearest” point if anything is left, draw it What do we mean by “nearest”? How can we optimize this?
38
Trivial Accepts Big optimization: trivial accept/rejects
How can we quickly determine whether a line segment is entirely inside the viewport? A: test both endpoints.
39
Trivial Rejects How can we know a line is outside viewport?
A: if both endpoints on wrong side of same edge, can trivially reject line
40
Cohen-Sutherland Line Clipping
Divide viewplane into regions defined by viewport edges Assign each region a 4-bit outcode: 1001 1000 1010 0001 0000 0010 0101 0100 0110
41
Cohen-Sutherland Line Clipping
How do we set the bits in the outcode? How do you suppose we use them? 1001 1000 1010 0001 0000 0010 0101 0100 0110
42
Cohen-Sutherland Line Clipping
Set bits with simple tests x > xmax y < ymin etc. Assign an outcode to each vertex of line If both outcodes = 0, trivial accept bitwise AND vertex outcodes together If result 0, trivial reject
43
Cohen-Sutherland Line Clipping
If line cannot be trivially accepted or rejected, subdivide so that one or both segments can be discarded Pick an edge that the line crosses (how?) Intersect line with edge (how?) Discard portion on wrong side of edge and assign outcode to new vertex Apply trivial accept/reject tests; repeat if necessary
44
Cohen-Sutherland Line Clipping
Outcode tests and line-edge intersects are quite fast But some lines require multiple iterations (see F&vD figure 3.40) Fundamentally more efficient algorithms: Cyrus-Beck uses parametric lines Liang-Barsky optimizes this for upright volumes
45
Coming Up… We know how to clip a single line segment
How about a polygon in 2D? How about in 3-D?
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.