Title: Sweep Fill Details
1Sweep Fill Details
- Maintain a list of active edges in case there are
multiple spans of pixels - known as Active Edge
List. - For each edge on the list, must know x-value,
maximum y value of edge, m - Maybe also depth, color
- Keep edges in a table, indexed by minimum y value
- Edge Table
- For row min to rowmax
- AELappend(AEL, ET(row))
- remove edges whose ymaxrow
- sort AEL by x-value
- fill spans
- update each edge in AEL
2Edge Table A list per row
6
Row
6
5
5
4
4
4
0
6
3
3
2
2
1
1
2
0
4
6
0
6
1
2
3
4
5
6
6
0
6
ymax
xmin
1/m
3Active Edge List just before filling each row
6
Row
6
5
5
4
0
6
6
0
6
4
4
4
0
6
6
0
6
3
3
2
0
4
6
0
6
2
2
0
4
6
0
6
2
1
2
0
4
6
0
6
1
1
2
3
4
5
6
6
0
6
ymax
x
1/m
4Edge Table
Row
6
6
5
5
4
4
3
3
2
2
1
2
1
5
6
-1
5
1
6
0
6
1
2
3
4
5
6
ymax
xmin
1/m
5Active Edge List just before filling each row
6
Row
6
5
5
4
4
3
-1
5
5
1
5
3
3
4
1
5
4
-1
5
2
2
3
1
5
5
-1
5
1
1
2
1
5
6
-1
5
1
2
3
4
5
6
6
0
6
ymax
x
1/m
6Comments
- Sort is quite fast, because AEL is usually almost
in order - OpenGL limits to convex polygons, meaning two and
only two elements in AEL at any time, and no
sorting - Can generate memory addresses (for pixel writes)
efficiently - Does not require floating point - next slide
7Dodging Floating Point
- For edge, m?x/?y, which is a rational number
- View x as xixn/?y, with xnlt?y. Store xi and xn
- Then x-gtxm is given by
- xnxn?x
- if (xngt?y) xixi1 xnxn- ?y
- Advantages
- no floating point
- can tell if x is an integer or not, and get
floor(x) and ceiling(x) easily, for the span
endpoints - Watt Sect 6.4.1 gives a confusing version
8Anti-Aliasing
- Recall We cant sample and then accurately
reconstruct an image that is not band-limited - Infinite Nyquist frequency
- Attempting to sample sharp edges gives jaggies,
or stair-step lines - Solution Band-limit by filtering (pre-filtering)
- What sort of filter will give a band-limited
result? - But when doing computer rendering, we dont have
the original continuous function
9Pre-Filtered Primitives
- We can simulate filtering by rendering thick
primitives, with ?, and compositing - Expensive, and requires the ability to do
compositing - Hardware method Keep sub-pixel masks tracking
coverage
Filter
?1/6
1/6
?2/3
2/3
over
?1/6
?1/6
?2/3
1/6
Ideal
?1/6
Pre-Filtered and composited
10Post-Filtering (Supersampling)
- Sample at a higher resolution than required for
display, and filter image down - Two basic approaches
- Generate extra samples and filter the result
(traditional super-sampling) - Generate multiple (say 4) images, each with the
image plane slightly offset. Then average the
images - Requires general perspective transformations
- Can be done in OpenGL using the accumulation
buffer - Issues of which samples to take, and how to
average them
11Where We Stand
- At this point we know how to
- Convert points from local to window coordinates
- Clip polygons and lines to the view volume
- Determine which pixels are covered by any given
line or polygon - Anti-alias
- Next thing
- Determine which polygon is in front
12Visibility
- Given a set of polygons, which is visible at each
pixel? (in front, etc.). Also called hidden
surface removal - Very large number of different algorithms known.
Two main classes - Object precision computations that decompose
polygons in world to solve - Image precision computations at the pixel level
- All the spaces in the viewing pipeline maintain
depth, so we can work in any space - World, View and Window space are all used
13Visibility Issues
- Efficiency - why render pixels many times?
- Accuracy - answer should be right, and behave
well when the viewpoint moves - Must have technology that handles large, complex
rendering databases - In many complex worlds, few things are visible
- How much of the real world can you see at any
moment? - Complexity - object precision visibility may
generate many small pieces of polygon
14Painters Algorithm (Image Precision)
- Algorithm
- Choose an order for the polygons based on some
choice (e.g. depth to a point on the polygon) - Render the polygons in that order, deepest one
first - This renders nearer polygons over further
- Difficulty
- works for some important geometries (2.5D - e.g.
VLSI) - doesnt work in this form for most geometries -
need at least better ways of determining ordering
Fails
zs
Which point for choosing ordering?
xs
15The Z-buffer (1) (Image Precision)(Watt 6.6.1)
- For each pixel on screen, have at least two
buffers - Color buffer stores the current color of each
pixel - The thing to ultimately display
- Z-Buffer stores at each pixel the depth of the
nearest thing seen so far - Also called the depth buffer
- Initialize this buffer to a value corresponding
to the furthest point (z1.0 for screen and
window space) - As a polygon is filled in, compute the depth
value of each pixel that is to be filled - if depth lt z-buffer depth, fill in pixel color
and new depth - else disregard
16The Z-buffer (2) (Watt 6.6.9)
- Advantages
- Simple and now ubiquitous in hardware
- A z-buffer is essentially what makes a graphics
card 3D - Computing the required depth values is easy
- Disadvantages
- Over-renders - worthless for very large
collections of polygons - Depth quantization errors can be annoying
- Cant easily do transparency or filtering for
anti-aliasing (Requires keeping information about
partially covered polygons)
17Z-Buffer and Transparency
- Must render in back to front order
- Otherwise, would have to store first opaque
polygon behind transparent one
Front
Partially transparent
1st or 2nd
3rd
Opaque
2nd
Opaque
1st
1st or 2nd
Recall this color and depth
18OpenGL Depth Buffer
- OpenGL defines a depth buffer as its visibility
algorithm - The enable depth testing glEnable(GL_DEPTH_TEST)
- To clear the depth buffer glClear(GL_DEPTH_BUFFER
_BIT) - To clear color and depth glClear(GL_COLOR_BUFFER_
BITGL_DEPTH_BUFFER_BIT) - The number of bits used for the depth values can
be specified (windowing system dependent, and
hardware may impose limits based on available
memory) - The comparison function can be specified
glDepthFunc()
19The A-buffer (Image Precision)(Watt 14.6)
- Handles transparent surfaces and filter
anti-aliasing - At each pixel, maintain a pointer to a list of
polygons sorted by depth, and a sub-pixel
coverage mask for each polygon - Matrix of bits saying which parts of the pixel
are covered - Algorithm When drawing a pixel
- if polygon is opaque and covers pixel, insert
into list, removing all polygons farther away - if polygon is transparent or only partially
covers pixel, insert into list, but dont remove
farther polygons
20The A-buffer (2)
- Algorithm Rendering pass
- At each pixel, traverse buffer using polygon
colors and coverage masks to composite - Advantage
- Can do more than Z-buffer
- Coverage mask idea can be used in other
visibility algorithms - Disadvantages
- Not in hardware, and slow in software
- Still at heart a z-buffer Over-rendering and
depth quantization problems
over
21Scan Line Algorithm (Image Precision)(Watt
6.6.5-6.6.7)
- Assume polygons do not intersect one another
- Except maybe at edges or vertices
- Observation across any given scan line, the
visible polygon can change only at an edge - Algorithm
- fill all polygons simultaneously
- at each scan line, have all edges that cross scan
line in AEL - keep record of current depth at current pixel -
use to decide which is in front in filling span
22Scan Line Algorithm (2)
zs
zs
xs
xs
Spans
zs
Where polygons overlap, draw front polygon
xs
23Scan Line Algorithm (3)
- Advantages
- Simple
- Potentially fewer quantization errors (more bits
available for depth) - Dont over-render (each pixel only drawn once)
- Filter anti-aliasing can be made to work (have
information about all polygons at each pixel) - Disadvantages
- Invisible polygons clog AEL, ET
- Non-intersection criteria may be hard to meet