CSCE 441: Computer Graphics Hidden Surface Removal (Cont.) Jinxiang Chai
Outline Backface Culling Painter’s algorithm BSP Z-buffer Ray casting Reading: section 16-1 to 16-11, 16-14,16-15
Depth (“Z”) Buffer Simple modification to scan-conversion Maintain a separate buffer storing the closest “z” value for each pixel—depth buffer Only draw pixel if depth value is closer than stored “z” value Update buffer with closest depth value Work in normalized coordinate space [0.0…1.0]
NOTE: Can draw these shapes in any order Z-Buffering Example z = 1.0 z = 1.0 z = 0.3 z = 0.7 z = 0.3 z = 0.1 z = 1.0 z = 0.3 z = 0.1 z = 1.0 z = 0.7 z = 0.3 z = 0.1 NOTE: Can draw these shapes in any order
Depth Buffer Algorithm Initialize the depth buffer and frame buffer for every pixel - depthBuff(x,y)=1.0; - frameBuff(x,y)=backgndColor; Process each polygon in a scene, one at a time. - for each pixel (x,y), calculate the depth z (if not already known). - if z <depthBuff(x,y), compute the surface color at (x,y) and set depthBuff(x,y)=z; frameBuff(x,y)=surfColor(x,y);
How to Calculate “z”? This is easy to implement for polygon surfaces v0 p=[x,y,z] v1 v2 Given the pixel coordinates (x,y), how to calculate the z value? use plane normal
How to Calculate “z”? This is easy to implement for polygon surfaces v0 p=[x,y,z] v1 v2 Plane normal (p-v0)∙((v2-v0)x(v1-v0))=0 Plane equation: Ax+By+Cz+D=0 P=[x,y,z]
How to Calculate “z”? This is easy to implement for polygon surfaces How can we speed up the calculation? Plane equation: Ax+By+Cz+D=0 p=[x,y,z]
How to Calculate “z”? This is easy to implement for polygon surfaces How can we speed up the calculation? - scan line conversion Plane equation: Ax+By+Cz+D=0 p=[x,y,z]
Normalized project space Scanline Conversion Normalized project space view direction
How to Calculate “z”? Solution: update “z” values using scan line conversion algorithm p=[x,y,z]
How to Calculate “z”? Update “z” values using scan line conversion algorithm
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0 What’s the x,y,z value for this pixel?
How to Calculate “z”? Update “z” values using scan line conversion algorithm Plane equation: Ax+By+Cz+D=0 What’s the xk+1,yk+1,zk+1 values for the next horizontal pixel?
Depth (“Z”) Buffer Advantages Disadvantages Always works. The nearest object always determines the color of a pixel Polygon drawn in any order Commonly in hardware Disadvantages Needs a whole extra buffer (depth buffer) Requires extra storage space Still lots of overdraw
Z-buffer: opengl In opengl, depth values are normalized to [0.0,1.0] - Specify depth-buffer operations glutInitDisplayMode // with argument GLUT_DEPTH - Specify initial depth-buffer value glClear(GL_DEPTH_BUFFER_BIT) // initialize depth-buffer values to 1.0 glClearDepth (depth) // specify an initial depth-buffer value - Activate depth-testing operations glEnable (GL_DEPTH_TEST)
Hidden Surface Removal: opengl Backface culling - glEnable(GL_CULL_FACE), glDisable(GL_CULL_FACE) - glCullFace(GL_BACK) , cull polygon view direction
Outline Backface Culling Painter’s algorithm BSP Z-buffer Ray casting Reading: section 9-1 to 9-11, 9-14,9-15
Ray Casting Key idea: for every pixel, cast a ray, find the closest point on the object and draw the point
Ray Casting For each pixel enter Pij - Send a ray from eye point, c, through pij into scene - Intersect ray with each object - Select the nearest intersection Effective for scenes with curved surfaces, particularly sphere
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk)
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) Intersection with polygons?
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) Intersection with polygons? Ray equation: Plane equation: Ax+By+Cz+D=0 Plug in and calculate the parameter value t!
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) Intersection with spheres? Plug in and calculate the parameter value t!
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) Intersection with spheres? Ray equation: Sphere equation: (x-x0)2+(y-y0)2+(z-z0)2=r2 Plug in and calculate the parameter value t!
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) Intersection with curved surfaces? Ray equation: Curved surface equation: f(x,y,z)=0 Plug in and calculate the parameter value t!
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) - Q: given the set {tk}, what is the first intersection point?
Ray Casting Implementation - Might parameterize each ray as - Each object Ok returns tk>0 such that first intersection with ok occurs at r(tk) - Q: given the set {tk}, what is the first intersection point?
Ray Casting Ray casting properties: - process pixels one at a time - draw each visible pixel once - efficient algorithm needed for ray-object intersection - may (not) use pixel coherence - simple but generally not used
Summary Backface Culling Painter’s algorithm BSP Z-buffer Ray casting