Unformatted text preview: Introduction to
Computer Graphics
CS 445 / 645
Lecture 9
Chapter 4: Rasterization
L. McMillan
MIT 6.837 notes What made line drawing faster?
Symmetry and Differential Analyzer
Symmetry
f ( x ) = mx + b
f ( x + 1) = m( x + 1) + b = mx + m + b
= f (x ) + ¢
¢ = f ( x + 1) ¡ f ( x )
= mx ¡ mx + m + b ¡ b
=m
f ( x + 1) = f ( x ) + m The Rendering Pipeline
Transform
Illuminate ModelWorld
WorldCamera Transform
Clip
Project
Rasterize Model & Camera
Parameters Rendering Pipeline Framebuffer Display Switch to MIT Slides
Course slides from Leonard McMillan’s MIT
Course
Course (6.837) from Fall ‘98
Course Rasterizing Polygons
In interactive graphics, polygons rule the world
Two main reasons:
• Lowest common denominator for surfaces
– Can represent any surface with arbitrary accuracy
Can
with
– Splines, mathematical functions, volumetric isosurfaces…
• Mathematical simplicity lends itself to simple, regular rendering
Mathematical
algorithms
algorithms
– Like those we’re about to discuss…
Like
– Such algorithms embed well in hardware Rasterizing Polygons
Triangle is the minimal unit
Triangle
minimal
of a polygon
of
• All polygons can be broken up into
All
triangles
triangles
• Triangles are guaranteed to be:
– Planar
– Convex Triangulation
Convex polygons easily
Convex
triangulated (Delaunay)
triangulated Concave polygons present
Concave
a challenge
challenge Triangle Rasterization Issues
Sliver Triangle Rasterization Issues
Moving Slivers
Moving Triangle Rasterization Issues
Shared Edge Ordering Rasterizing Triangles
Interactive graphics hardware commonly uses
Interactive
edge walking or edge equation techniques for
edge
edge
rasterizing triangles
rasterizing Edge Walking
Basic idea:
Basic
• Draw edges vertically
– Interpolate colors down edges
• Fill in horizontal spans for each
Fill
scanline
scanline
– At each scanline, interpolate
At
edge colors across span
edge 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
Find
of polygon. Also could be flat top or flat bottom triangle
of 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:
Disadvantages:
• Lots of finicky special cases Edge Walking: Disadvantages
Fractional offsets: Be careful when interpolating color values!
Beware of gaps between adjacent edges
Beware of duplicating shared edges Triangle Rasterization Issues
Color Interpolation Triangle Rasterization Issues
Shared Edge Ordering Edge Equations
An edge equation is simply the equation of the line
An
defining that edge
defining
• Q: What is the implicit equation of a line?
Q: What
• A: Ax + By + C = 0
A: Ax
• Q: Given a point (x,y), what does plugging x & y into this equation tell
Q: Given
),
us?
us?
• A: Whether the point is:
– On the line: Ax + By + C = 0
On
– “Above” the line: Ax + By + C > 0
Above”
– “Below” the line: Ax + By + C < 0
Below” Edge Equations
Edge equations thus define two halfspaces:
Edge
halfspaces Edge Equations Ax Ax
2 2 +B +B 2 2 +B
3 Ax +B
3 Ax y+ y+ 3 y+ C<
3
0
3y +
C3 >
0 And a triangle can be defined as the intersection
And
of three positive halfspaces:
of 0
+ C1 >
By
A 1x + 1
<0
y + C1
B
A 1x + 1 C<
2
0
C
2>
0 Edge Equations
So…simply turn on those pixels for which all edge
So…simply
equations evaluate to > 0:
equations + +
+ Using Edge Equations
Which pixels: compute min,max bounding box Edge equations: compute from vertices Computing Edge Equations
Want to calculate A, B, C for each edge from (x1, y1) and
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 Computing Edge Equations
Set up the linear system: x 0 y 0 A
1 x1 y1 B = −C 1
Multiply both sides A y1 − y 0 −C
by matrix inverse:
B = x 0 y1 − x1 y 0 x1 − x 0 Let C = x0 y1  x1 y0 for convenience
Let
• Then A = y0  y1 and B = x0 – x1
Then Edge Equations
So…we can find edge equation from two verts.
So…we
Given three corners P0, P1, P2 of a triangle, what are our
three edges?
three
How do we make sure the halfspaces defined by the
How
edge equations all share the same sign on the
interior of the triangle?
interior
A: Be consistent (Ex: [P0 P1], [P1 P2], [P2 P0])
A:
[P
How do we make sure that sign is positive?
A: Test, and flip if needed (A= A, B= B, C= C) Edge Equations: Code
Basic structure of code:
• Setup: compute edge equations, bounding box
• (Outer loop) For each scanline in bounding box...
(Outer
• (Inner loop) …check each pixel on scanline,
(Inner
evaluating edge equations and drawing the pixel if all
three are positive
three 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);
}} Edge Equations: Speed Hacks
Some speed hacks for the inner loop:
int xflag = 0;
for (int x = xMin; x <= xMax; x++) {
if (e0e1e2 > 0) {
setPixel(x,y);
xflag++;
} else if (xflag != 0) break;
e0 += a0; e1 += a1; e2 += a2;
}
• Incremental update of edge equation values
(think DDA)
(think
• Early termination (why does this work?)
• Faster test of equation values Triangle Rasterization Issues
Exactly which pixels should be lit?
A: Those pixels inside the triangle edges
What about pixels exactly on the edge?
• Draw them: order of triangles matters (it shouldn’t)
• Don’t draw them: gaps possible between triangles We need a consistent (if arbitrary) rule
We
• Example: draw pixels on left or top edge, but not on
Example:
right or bottom edge
right General Polygon Rasterization
Now that we can rasterize triangles, what about
Now
general polygons?
general
We’ll take an edgewalking approach General Polygon Rasterization
Consider the following polygon:
D B
C A E
F How do we know whether a given pixel on the
How
scanline is inside or outside the polygon?
scanline Polygon Rasterization
InsideOutside Points Polygon Rasterization
InsideOutside Points General Polygon Rasterization
Basic idea: use a parity test
Basic
parity
for each scanline
edgeCnt = 0;
edgeCnt
for each pixel on scanline (l to r)
for
if (oldpixel>newpixel crosses edge)
edgeCnt ++;
edgeCnt
// draw the pixel if edgeCnt odd
//
if (edgeCnt % 2)
if
setPixel(pixel);
setPixel(pixel); General Polygon Rasterization
Count your vertices carefully
• If exactly on pixel boundary?
• Shared vertices?
• Vertices defining horizontal
edge?
– Consider AB versus IH G
I F H
E
C J
A D
B Faster Polygon Rasterization
How can we optimize the code?
for each scanline
edgeCnt = 0;
edgeCnt
for each pixel on scanline (l to r)
for
if (oldpixel>newpixel crosses edge)
edgeCnt ++;
edgeCnt
// draw the pixel if edgeCnt odd
//
if (edgeCnt % 2)
if
setPixel(pixel);
setPixel(pixel); Big cost: testing pixels against each edge
Solution: active edge table (AET)
Solution: active Active Edge Table
Idea:
Idea:
• Edges intersecting a given scanline are likely to intersect
Edges
the next scanline
the
• The order of edge intersections doesn’t change much from
The
scanline to scanline
scanline Active Edge Table
Algorithm: scanline from bottom to top…
Algorithm: scanline
• 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 Review: Polygon Rasterization
For scanline, determine all polygon edges that intersect current scanline
Sort edge intersections with scanline in least to greatest order
Use parity count to determine when pixels are drawn
Horizontal lines do not contribute to parity count
Ymin endpoints do contribute to parity count
Ymax endpoints do not contribute to parity count Not drawn because H is max of AH
And HG does not contribute H F Not drawn because D is min of ED
And increments counter to 2.
DC doesn’t contribute G E D
A C
B Bottom edge drawn because A is min of AH. AB does not contribute ...
View
Full Document
 Spring '08
 BLOOMFIELD,A
 Geometry, Computer Graphics, Pixel, triangle, Raster graphics, Rasterisation, Scanline

Click to edit the document details