rasterization

45
Rasterization Aaron Bloomfield CS 445: Introduction to Graphics Fall 2006 (Slide set originally by David Luebke)

Upload: jason

Post on 07-Jan-2016

21 views

Category:

Documents


0 download

DESCRIPTION

Rasterization. Aaron Bloomfield CS 445: Introduction to Graphics Fall 2006 (Slide set originally by David Luebke). Transform. Illuminate. Transform. Clip. Project. Rasterize. The Rendering Pipeline: A Tour. Model & Camera Parameters. Rendering Pipeline. Framebuffer. Display. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Rasterization

Rasterization

Aaron BloomfieldCS 445: Introduction to Graphics

Fall 2006(Slide set originally by David Luebke)

Page 2: Rasterization

2

The Rendering Pipeline: A Tour

Transform

Illuminate

Transform

Clip

Project

Rasterize

Model & CameraModel & CameraParametersParameters Rendering PipelineRendering Pipeline FramebufferFramebuffer DisplayDisplay

Page 3: Rasterization

3

After Rasterization, what’s next?

Visible surface determination

Anti-aliasing (image from here)

Page 4: Rasterization

44

OutlineOutline

Rasterizing PolygonsRasterizing Polygons

• Rasterizing TrianglesRasterizing Triangles

• Edge WalkingEdge Walking

• Edge EquationsEdge Equations

• Rasterizing Polygons (again)Rasterizing Polygons (again)

Page 5: Rasterization

5

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

Page 6: Rasterization

6

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?

Page 7: Rasterization

7

Convex Shapes

A two-dimensional shape is convex if and only if every line segment connecting two points on the boundary is entirely contained.

Page 8: Rasterization

8

Convex Shapes

Why do we want convex shapes for rasterization? One good answer: because any scan line is

guaranteed to contain at most one segment or span of a triangle Another answer coming up later Note: Can also use an algorithm which handles concave

polygons. It is more complex than what we’ll present here!

Page 9: Rasterization

9

Decomposing Polys Into Tris

Any convex polygon can be trivially decomposed into triangles Draw it

Any concave or complex polygon can be decomposed into triangles, too Non-trivial!

Page 10: Rasterization

1010

OutlineOutline

• Rasterizing PolygonsRasterizing PolygonsRasterizing TrianglesRasterizing Triangles

• Edge WalkingEdge Walking

• Edge EquationsEdge Equations

• Rasterizing Polygons (again)Rasterizing Polygons (again)

Page 11: Rasterization

11

Rasterizing Triangles

Interactive graphics hardware commonly uses edge walking or edge equation techniques for rasterizing triangles

Two techniques we won’t talk about much: Recursive subdivision of primitive into micropolygons

(REYES, Renderman) Recursive subdivision of screen (Warnock)

Page 12: Rasterization

12

Recursive Triangle Subdivision

Page 13: Rasterization

13

Recursive Screen Subdivision

Page 14: Rasterization

1414

OutlineOutline

• Rasterizing PolygonsRasterizing Polygons

• Rasterizing TrianglesRasterizing TrianglesEdge WalkingEdge Walking

• Edge EquationsEdge Equations

• Rasterizing Polygons (again)Rasterizing Polygons (again)

Page 15: Rasterization

15

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

Page 16: Rasterization

16

Edge Walking: Notes

Order vertices in x and y Walk down left and right edges

Fill each span Until breakpoint or bottom vertex is reached

Advantage: can be made very fast Disadvantages:

Lots of finicky special cases Tough to get right Need to pay attention to fractional offsets

Page 17: Rasterization

17

Edge Walking: Notes

Fractional offsets:

Be careful when interpolating color values! Also: beware gaps between adjacent edges

Page 18: Rasterization

1818

OutlineOutline

• Rasterizing PolygonsRasterizing Polygons

• Rasterizing TrianglesRasterizing Triangles

• Edge WalkingEdge WalkingEdge EquationsEdge Equations

• Rasterizing Polygons (again)Rasterizing Polygons (again)

Page 19: Rasterization

19

Edge Equations

An edge equation is simply the equation of the line containing that edge Q: What is the equation of a 2D 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

Page 20: Rasterization

20

Edge Equations

Edge equations thus define two half-spaces:

Page 21: Rasterization

21

Edge Equations

And a triangle can be defined as the intersection of three positive half-spaces:

A1x + B1y + C1 < 0

A2 x + B

2 y + C2 < 0

A 3x

+ B 3

y +

C 3 <

0

A1x + B1y + C1 > 0

A 3x

+ B 3

y +

C 3 >

0 A2 x + B

2 y + C2 > 0

Page 22: Rasterization

22

Edge Equations

So…simply turn on those pixels for which all edge equations evaluate to > 0:

+++-

--

Page 23: Rasterization

23

Using Edge Equations

An aside: How do you suppose edge equations are implemented in hardware?

How would you implement an edge-equation rasterizer in software? Which pixels do you consider? How do you compute the edge equations? How do you orient them correctly?

Page 24: Rasterization

24

Using Edge Equations

Which pixels: compute min,max bounding box

Edge equations: compute from vertices Orientation: ensure area is positive (why?)

Page 25: Rasterization

25

Computing a Bounding Box

Easy to do Surprising number of speed hacks possible

See McMillan’s Java code for an example

Page 26: Rasterization

26

Computing Edge Equations

Want to calculate A, B, C (of the line equation) for each edge from (xi, yi) and (xj, yj)

Treat it as a linear system:Ax1 + By1 + C = 0

Ax2 + By2 + C = 0

Notice: two equations, three unknowns Does this make sense? What can we solve? Goal: solve for A & B in terms of C

Page 27: Rasterization

27

Computing Edge Equations

Set up the linear system:

Multiply both sidesby matrix inverse:

Let C = x0 y1 - x1 y0 for convenience

Then A = y0 - y1 and B = x1 - x0

1

1

11

00C

B

A

yx

yx

01

01

0110 xx

yy

yxyx

C

B

A

Page 28: Rasterization

28

Edge Equations: Numerical Issues

Calculating C = x0 y1 - x1 y0 involves some

numerical precision issues When is it bad to subtract two floating-point numbers? A: When they are of similar magnitude

Example: 1.234x104 - 1.233x104 = 1.000x101

We lose most of the significant digits in result

In general, (x0,y0) and (x1,y1) (corner vertices of a triangle) are fairly close, so we have a problem

Page 29: Rasterization

29

Edge Equations: Numerical Issues

We can avoid the problem in this case by using our definitions of A and B:

A = y0 - y1 B = x1 - x0 C = x0 y1 - x1 y0

Thus:

C = -Ax0 - By0 or C = -Ax1 - By1

Why is this better? Which should we choose?

Trick question! Average the two to avoid bias:

C = -[A(x0+x1) + B(y0+y1)] / 2

Page 30: Rasterization

30

Edge Equations

So…we can find edge equation from two verts. Given three corners C0, C1, C0 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)

Page 31: Rasterization

31

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

Page 32: Rasterization

32

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);

}

}

Page 33: Rasterization

33

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

Page 34: Rasterization

34

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 Also need to do this

for green and blue Note: plane follows form

z = Ax + By + C Look familiar?

Page 35: Rasterization

35

Edge Equations: Interpolating Color

Given redness at the 3 vertices, set up the linear system of equations:

The solution works out to:

Page 36: Rasterization

36

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

Page 37: Rasterization

37

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 Example: draw pixels on left or top edge, but not on

right or bottom edge

Page 38: Rasterization

3838

OutlineOutline

• Rasterizing PolygonsRasterizing Polygons

• Rasterizing TrianglesRasterizing Triangles

• Edge WalkingEdge Walking

• Edge EquationsEdge EquationsRasterizing Polygons (again)Rasterizing Polygons (again)

Page 39: Rasterization

39

General Polygon Rasterization

Now that we can rasterize triangles, what about general polygons?

We’ll not take an edge-equations approach (why?)

Page 40: Rasterization

40

General Polygon Rasterization

Consider the following polygon:

How do we know whether a given pixel on the scanline is inside or outside the polygon?

A

B

C

D

E

F

Page 41: Rasterization

41

General Polygon Rasterization

Does it still work?

A

B

C

D

E

F

G I

H

Page 42: Rasterization

42

General Polygon Rasterization

Basic idea: use a parity testfor 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?

Page 43: Rasterization

43

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)

Page 44: Rasterization

44

Active Edge Table

Idea: Edges intersecting a given scanline are likely to intersect

the next scanline Within a scanline, the order of edge intersections

doesn’t change much from scanline to scanline

Page 45: Rasterization

45

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 and resort (how?)

Stop when Y > Ymax for last edges