cs 551 / 645: introductory computer graphics rasterizing triangles

45
CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Upload: byron-haynes

Post on 11-Jan-2016

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

CS 551 / 645: Introductory Computer Graphics

Rasterizing Triangles

Page 2: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 3: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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)

Page 4: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 5: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 6: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 7: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Triangularization

Convex polygons easily triangulated

Concave polygons present a challenge

Page 8: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Rasterizing Triangles

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

Page 9: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 10: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 11: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Edge Walking: Disadvantages

Fractional offsets:

Be careful when interpolating color values! Beware of gaps between adjacent edges Beware of duplicating shared edges

Page 12: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 13: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Edge Equations

Edge equations thus define two half-spaces:

Page 14: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 15: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Edge Equations

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

+++

-

--

Page 16: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Using Edge Equations

Which pixels: compute min,max bounding box

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

Page 17: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 18: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 19: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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)

Page 20: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 21: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 22: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 23: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 formz = Ax + By + C

– Look familiar?

Page 24: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Edge Equations: Interpolating Color Given redness at the 3 vertices, set up the

linear system of equations:

The solution works out to:

Page 25: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 26: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 27: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

General Polygon Rasterization

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

We’ll take an edge-walking approach

Page 28: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 29: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

General Polygon Rasterization

Does it still work?

A

B

C

D

E

F

G I

H

Page 30: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 31: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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 32: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 33: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 34: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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:

Page 35: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Clipping

Analytically calculating the portions of primitives within the viewport

Page 36: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Why Clip?

Bad idea to rasterize outside of framebuffer bounds

Also, don’t waste time scan converting pixels outside window

Page 37: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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?

Page 38: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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.

Page 39: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 40: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Cohen-Sutherland Line Clipping

Divide viewplane into regions defined by viewport edges

Assign each region a 4-bit outcode:

0000 00100001

1001

0101 0100

1000 1010

0110

Page 41: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Cohen-Sutherland Line Clipping

How do we set the bits in the outcode? How do you suppose we use them?

0000 00100001

1001

0101 0100

1000 1010

0110

Page 42: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Cohen-Sutherland Line Clipping

Set bits with simple testsx > 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

Page 43: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 44: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

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

Page 45: CS 551 / 645: Introductory Computer Graphics Rasterizing Triangles

Coming Up…

We know how to clip a single line segment– How about a polygon in 2D?– How about in 3-D?