Visibility Aaron Bloomfield CS 445: Introduction to Graphics Fall 2006

advertisement
Visibility
Aaron Bloomfield
CS 445: Introduction to Graphics
Fall 2006
(Slide set originally by David Luebke)
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
2
Occlusion

For most interesting scenes, some polygons will
overlap:

To render the correct image, we need to determine
which polygons occlude which
3
Painter’s Algorithm

Simple approach: render the polygons from back
to front, “painting over” previous polygons:


Draw blue, then green, then pink
Will this work in general?
4
Painter’s Algorithm: Problems


Intersecting polygons present a problem
Even non-intersecting polygons can form a cycle
with no valid visibility order:
5
Analytic Visibility Algorithms

Early visibility algorithms computed the set of
visible polygon fragments directly, then rendered
the fragments to a display:

Now known as analytic visibility algorithms
6
Analytic Visibility Algorithms

What is the minimum worst-case cost of computing
the fragments for a scene composed of n
polygons?

Answer:
O(n2)
7
Analytic Visibility Algorithms


So, for about a decade (late 60s to late 70s) there
was intense interest in finding efficient algorithms
for hidden surface removal
We’ll talk about two analytic visibility algorithms:


Binary Space-Partition (BSP) Trees
Warnock’s Algorithm
8
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
9
Binary Space Partition Trees (1979)

Basic algorithm

For each triangle (or polygon) t in the scene





Find the plane that t implicitly forms
Let the eyepoint be on one side of t
Then t can be drawn before all triangles on the other side of t
So we draw the “far” stuff first, then t, then the “near” stuff
Restrictions

Only works on a scene where no polygons crosses a
plane defined by another polygon


This also means you can’t have a cycle
This restriction is relaxed by a preprocessing step

Split up such triangles into multiple triangles
10
Binary Space Partition Trees

BSP tree: organize all of space (hence partition)
into a binary tree

Preprocess: overlay a binary tree on objects in the
scene



This includes the step of splitting a primitive that crosses a plane
into multiple primitives
Runtime: correctly traversing this tree enumerates
objects from back to front
Idea: divide space recursively into half-spaces by
choosing splitting planes


Splitting planes can be arbitrarily oriented
Notice: nodes are always convex
11
BSP Trees: Objects
9
6
8
7
5
4
1
2
3
12
BSP Trees: Objects
9
6
8
7
5
6
7
8
9
1
2
3
4
5
4
1
2
3
13
BSP Trees: Objects
9
6
8
7
5
7
4
1
2
8
9
5
6
2
3
4
1
3
14
BSP Trees: Objects
9
6
8
7
5
1
4
1
2
3
8
7
9
6
5
3
2
4
15
BSP Trees: Objects
9
6
8
7
5
1
4
1
2
3
8
6
7
9
5
3
2
4
16
Rendering BSP Trees
renderBSP(BSPtree *T)
BSPtree *near, far;
if (eye on left side of T->plane)
near = T->left; far = T->right;
else
near = T->right; far = T->left;
renderBSP(far);
if (T is a leaf node)
renderObject(T)
renderBSP(near);
17
Rendering BSP Trees
9
6
8
7
5
1
4
1
2
3
8
6
7
9
5
3
2
4
18
Rendering BSP Trees
9
6
8
7
5
1
4
1
2
3
8
6
7
9
5
3
2
4
19
Polygons: BSP Tree Construction


Split along the plane containing any polygon
Classify all polygons into positive or negative halfspace of the plane




If a polygon intersects plane, split it into two
The aforementioned preprocessing step
Recurse down the negative half-space
Recurse down the positive half-space
20
Polygons: BSP Tree Traversal

Query: given a viewpoint, produce an ordered list of
(possibly split) polygons from back to front:
BSPnode::Draw(Vec3 viewpt)
Classify viewpt: in + or - half-space of node->plane?
// Call that the “near” half-space
farchild->draw(viewpt);
render node->polygon; // always on node->plane
nearchild->draw(viewpt);

Intuitively: at each partition, draw the stuff on the farther
side, then the polygon on the partition, then the stuff on
the nearer side
21
Discussion: BSP Tree Cons


No bunnies were harmed in my example
But what if a splitting plane passes through an
object?

Split the object; give half to each node:
Ouch

Worst case: can create up to O(n3) objects!
22
BSP Trees

A BSP Tree increases storage requirements by
splitting polygons


What is the worst-case storage cost of a BSP tree on n
polygons?
But rendering a BSP tree is fairly efficient

What is the expected cost of a single query, for a given
viewpoint, on a BSP tree with m nodes?
23
BSP Demo

Nice demo:


http://symbolcraft.com/graphics/bsp/index.html
Also has a link to the BSP Tree FAQ
24
Summary: BSP Trees

Pros:


Simple, elegant scheme
Only writes to framebuffer (i.e., painters algorithm)


Thus once very popular for video games (but no longer, at
least on PC platform)
Still very useful for other reasons (more later)
25
Summary: BSP Trees

Cons:



Computationally intense preprocess stage restricts
algorithm to static scenes
Worst-case time to construct tree: O(n3)
Splitting increases polygon count

Again, O(n3) worst case
26
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
27
Warnock’s Algorithm (1969)

Elegant scheme based on a powerful general
approach common in graphics: if the situation is
too complex, subdivide


Start with a root viewport and a list of all primitives
Then recursively:



Clip objects to viewport
If number of objects incident to viewport is zero or one, visibility
is trivial
Otherwise, subdivide into smaller viewports, distribute primitives
among them, and recurse
28
Warnock’s Algorithm


What is the
terminating
condition?
How to
determine the
correct visible
surface in this
case?
29
Warnock’s Algorithm

Pros:



Very elegant scheme
Extends to any primitive type
Cons:


Hard to embed hierarchical schemes in hardware
Complex scenes usually have small polygons and high
depth complexity

Thus most screen regions come down to the single-pixel case
30
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
31
The Z-Buffer Algorithm


Both BSP trees and Warnock’s algorithm were
proposed when memory was expensive
Ed Catmull (mid-70s) proposed a radical new
approach called the z-buffer


(He went on to help found a little company named Pixar)
The big idea: resolve visibility independently at
each pixel
32
The Z-Buffer Algorithm

We know how to rasterize polygons into an image
discretized into pixels:
33
The Z-Buffer Algorithm

What happens if multiple primitives occupy the
same pixel on the screen? Which is allowed to
paint the pixel?
34
The Z-Buffer Algorithm

Idea: retain depth (Z in eye coordinates) through
projection transform


Recall canonical viewing volumes
Can transform canonical perspective volume into
canonical parallel volume with:
1
0
M 
0

0
0
1
0
0
1
0
1  zmin
0
1

0 
 zmin

1  zmin 
0 
0
35
The Z-Buffer Algorithm

Augment framebuffer with Z-buffer or depth buffer
which stores Z value at each pixel



At frame beginning initialize all pixel depths to 
When rasterizing, interpolate depth (Z) across polygon
and store in pixel of Z-buffer
Suppress writing to a pixel if its Z value is more distant
than the Z value already stored there

“More distant”: greater than or less than, depending
36
Interpolating Z

Edge equations: Z is just another planar parameter:
z = Ax + By + C
 Look familiar?
 Total cost:


1 more parameter to
increment in inner loop
3x3 matrix multiply for setup
See interpolating color
discussion from a
previous lecture
Edge walking: can interpolate
Z along edges and across spans


37
The Z-Buffer Algorithm




How much memory does the Z-buffer use?
Does the image rendered depend on the drawing
order?
Does the time to render the image depend on the
drawing order?
How much of the pipeline do occluded polygons
traverse?


What does this imply for the front of the pipeline?
How does Z-buffer load scale with visible polygons?

With framebuffer resolution?
38
Z-Buffer Pros





Simple!!!
Easy to implement in hardware
Polygons can be processed in arbitrary order
Easily handles polygon interpenetration
Enables deferred shading


Rasterize shading parameters (e.g., surface normal) and
only shade final visible fragments
When does this help?
39
Z-Buffer Cons





Lots of memory (e.g. 1280x1024x32 bits)
Read-Modify-Write in inner loop requires fast memory
Hard to do
analytic
antialiasing
Hard to
simulate
translucent
polygons
Precision issues
(scintillating,
worse with
perspective
projection)
40
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
41
Visibility Culling

The basic idea: don’t render what can’t be seen

Off-screen: view-frustum culling


Occluded by other objects: occlusion culling



Solved by clipping
Solved by Z-buffer
The obvious question: why bother?
The (obvious) answer: efficiency

Clipping and Z-buffering take time linear to the number
of primitives
42
The Goal

Our goal: quickly eliminate large portions of the
scene which will not be visible in the final image

Not the exact visibility solution, but a quick-and-dirty
conservative estimate of which primitives might be
visible


Z-buffer & clip this for the exact solution
This conservative estimate is called the potentially
visible set or PVS
43
Visibility Culling

The remainder of this talk will cover:



View-frustum culling (briefly)
Occlusion culling in architectural environments
General occlusion culling
44
View-Frustum Culling

An old idea (Clark 76):


Organize primitives into clumps
Before rendering the primitives in a clump, test a
bounding volume against the view frustum


If the clump is entirely outside the view frustum, don’t render any
of the primitives
If the clump intersects the view frustum, add to PVS and render
normally
45
Efficient View-Frustum Culling

How big should the clumps be?

Choose minimum size so:
cost testing bounding volume << cost clipping primitives

Organize clumps into a hierarchy of bounding volumes
for more efficient testing

If a clump is entirely outside or entirely inside view frustum, no
need to test its children
46
Efficient View-Frustum Culling

What shape should the bounding volumes be?



Spheres and axis-aligned bounding boxes: simple to
calculate, cheap to test
Oriented bounding boxes converge asymptotically faster
in theory
Lots of other volumes have been proposed, but most
people still use spheres or AABBs.
47
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
48
Cells & Portals


Goal: walk through architectural models (buildings,
cities, catacombs)
These divide naturally into cells


Transparent portals connect cells


Rooms, alcoves, corridors…
Doorways, entrances, windows…
Notice: cells only see other cells through portals
49
Cells & Portals

An example:
50
Cells & Portals

Idea:

Cells form the basic unit of PVS




PVS = potentially visible set
Create an adjacency graph of cells
Starting with cell containing eyepoint, traverse graph,
rendering visible cells
A cell is only visible if it can be seen through a sequence
of portals

So cell visibility reduces to testing portal sequences for a line of
sight…
51
Cells & Portals
E
A
D
B
F
C
G
H
A
B
E
C
D
F
G
H
52
Cells & Portals
E
A
D
B
F
C
G
H
A
B
E
C
D
F
G
H
53
Cells & Portals
E
A
D
B
F
C
G
H
A
B
E
C
D
F
G
H
54
Cells & Portals
E
A
D
B
F
C
G
H
A
B
E
C
D
F
G
H
55
Cells & Portals
E
A
D
B
F
C
G
H
A
B
E
C
D
F
G
H
56
Cells & Portals
E
A
D
B
C
?
F
G
H
A
B
E
C
D
F
G
?
H
57
Cells & Portals
E
A
D
B
C
X
F
G
H
A
B
E
C
D
X
H
F
G
58
Cells & Portals

View-independent solution: find all cells a particular cell
could possibly see:
E
A
D
B
F
C
G
H
C can only see A, D, E, and H
59
Cells & Portals

View-independent solution: find all cells a particular cell
could possibly see:
E
A
D
B
F
C
G
H
H will never see F
60
Cells and Portals

Questions:



How can we detect whether a given cell is visible from a
given viewpoint?
How can we detect view-independent visibility between
cells?
The key insight:

These problems reduce to eye-portal and portal-portal
visibility
61
Cells and Portals

Airey (1990): view-independent only

Portal-portal visibility determined by ray-casting



Non-conservative portal-portal test resulted in occasional errors
in PVS
Slow preprocess
Order-of-magnitude speedups
62
Cells and Portals: History

Teller (1993): view-independent + view-dependent

Portal-portal visibility calculated by line stabbing using
linear program




Cell-cell visibility stored in stab trees
View-dependent eye-portal visibility
PVS at run time
stage
further
refines
Slow (?) preprocess
Elegant, exact scheme
63
Cells and Portals: History

Luebke & Georges (1995): view-dependent only




Eye-portal visibility determined by intersecting portal
cull boxes
No preprocess (integrate w/ modeling)
Quick, simple hack
Now-archaic public-domain library: pfPortals
64
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
65
General Occlusion Culling

When cells and portals don’t work…



Trees in a forest
A crowded train station
Need general occlusion culling algorithms:



Aggregate occlusion
Dynamic scenes
Non-polygonal scenes
66
General Occlusion Culling

I’ll discuss two algorithms:


Loose front-to-back sorting
Hierarchical Z-Buffer


Ned Greene, SIGGRAPH 93
… and current hardware support
67
Loose Front-To-Back Sorting

Can sort your geometry in roughly front-to-back
order, e.g. by:



Using an octree/BSP tree
Sorting centroids or near points of bounding volumes
Why would this help?

A: Early rejection helps whole fragment pipeline
68
Image-Space Occlusion Culling


Many general occlusion culling algorithms use an
image-space approach
Idea: solve visibility in 2D, on the image plane
69
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
70
Hierarchical Z-Buffer

Replace Z-buffer with a Z-pyramid



Lowest level: full-resolution Z-buffer
Higher levels: each pixel represents the max depth of
the four pixels “underneath” it
Basic idea: hierarchical rasterization of the
polygon, with early termination where polygon is
occluded
71
Hierarchical Z-Buffer

Idea: test polygon against highest level first



If polygon is further than distance recorded in pixel,
stop—it’s occluded
If polygon is closer, recursively check against next lower
level
If polygon is visible at lowest level, set new distance
value and propagate up
72
Hierarchical Z-Buffer

Z-pyramid exploits image-space coherence:


Polygon occluded in a pixel
nearby pixels
is probably occluded in
HZB also exploits object-space coherence

Polygons near an occluded polygon are probably
occluded
73
Hierarchical Z-Buffer

Exploiting object-space coherence:




Subdivide scene with an octree
All geometry in an octree node is contained by a cube
Before rendering the contents of a node, “render” the
faces of its cube (i.e., query the Z-pyramid)
If cube faces are occluded, ignore the entire node
74
Hierarchical Z-Buffer

HZB can exploit temporal coherence



Most polygons affecting the Z-buffer last
will affect Z-buffer this frame
HZB also operates at max efficiency
Z-pyramid already built
frame
when
So start each frame by rendering octree nodes
visible last frame
75
Hierarchical Z-Buffer: Discussion


HZB needs hardware support to be really competitive
Hardware vendors haven’t entirely bought in:



But we’re getting there…




Z-pyramid (and hierarchies in general) unfriendly to hardware
Unpredictable Z-query times generate bubbles in rendering pipe
ATI HyperZ
Similar technology in NVIDIA
Both “under the hood”, not exposed to programmer
At the user level, hardware now supports occlusion queries
76
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
77
Modern Occlusion Culling

Support from hardware would be nice


Want an “occlusion test”: would this polygon be visible if
I rendered it?
How could you use such a test?



Yay! GL_HP_OCCLUSION_TEST extension


Test portal polygons before rendering adjacent cell
Test object bounding boxes before rendering object
But only returns non-visibility
Problems:


CPU/GPU synchronization == bad
Might want to know “how visible” is the polygon
78
Modern Occlusion Culling

GL_NV_OCCLUSION_QUERY to the rescue

Non-blocking query






“Is this occlusion query done yet?”
Multiple queries in flight
Returns number of fragments visible
Note: can actually render object or not
Supports object-space coherence,
coherence
Still lots of issues for efficient culling
temporal
79
111 uses for Occlusion Queries


Occlusion culling (duh)
Others?







Approximate culling
LOD size estimation
Lens flare effects
Transparency
Collision detection (!)
Convergence testing
Side note: GL_ARB_OCCLUSION_QUERY is latest
incarnation

Fixes a possible race condition in NV_occlusion_query
logic
80
Overview










Analytic Visibility Algorithms
BSPs
Warnock's Algorithm
Z-Buffer Algorithm
Visibility Culling
Cells and Portals
Occlusion Culling
Hierarchical Z-Buffer
Modern Occlusion Culling
Fog
81
Fog filters – what’s wrong with it?
http://www.cs.mtu.edu/~shene/DigiCam/User-Guide/filter/filter-fog.html
82
Haze and the Z-buffer
83
Fog and the Z-buffer
http://www.cnykayakclub.com/pictures2003.htm
84
Water and the Z-buffer
85
Fog filters – what’s wrong with it?
http://www.cs.mtu.edu/~shene/DigiCam/User-Guide/filter/filter-fog.html
86
Download