Recap: 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 Recap: Image-Space Occlusion Culling Most general occlusion culling algorithms use an image-space approach – Idea: solve visibility in 2D, on the image plane – Note: gives up view-independent visibility Recap: 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 Recap: Hierarchical Z-Buffer Z-pyramid exploits image-space coherence: – Polygon occluded in a pixel is probably occluded in nearby pixels HZB also exploits object-space coherence – Polygons near an occluded polygon are probably occluded Recap: Hierarchical Z-Buffer HZB can exploit temporal coherence – Most polygons affecting the Z-buffer last frame will affect Z-buffer this frame – HZB also operates at max efficiency when Z-pyramid already built So start each frame by rendering octree nodes visible last frame Hierarchical Z-Buffer: Discussion HZB needs hardware support to be really competitive Hardware vendors haven’t entirely bought in: – Z-pyramid (and hierarchies in general) unfriendly to hardware – Unpredictable Z-query times generate bubbles in rendering pipe But there are promising trends: – ATI’s HYPER-Z technology: one-level HZB – Occlusion queries! 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? Test portal polygons before rendering adjacent cell Test object bounding boxes before rendering object – Yay! GL_HP_OCCLUSION_TEST extension – Problems: CPU/GPU synchronization == bad Might want to know “how visible” is the polygon 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, temporal coherence Still lots of issues for efficient culling Modern Occlusion Culling GL_ARB_OCCLUSION_QUERY – Deprecates NV_OCCLUSION_QUERY – Fixes a potential race condition 111 uses for NV_OCCLUSION_QUERY Occlusion culling (duh) Others? – – – – – – Approximate culling LOD size estimation Lens flare effects Transparency Collision detection (!) Convergence testing NV_OCCLUSION_QUERY: Details Go to NVIDIA presentation… Occlusion Culling: Grab Bag Portal textures – Dan Aliaga and others From-region visibility – Generalizes view-independent cell-portal problem Linear-time view-independent portal cull box approach? – Nina Amenta and others Modeling issues for cells-and-portals – Daniel Cohen-Or and others Advanced Texturing: Stupid Texture Tricks David Luebke University of Virginia Point Sprites A point sprite is a screen-aligned textured quad placed by rendering a single vertex – Ideal for particle systems – When GL_POINT_SPRITE_NV is enabled: Point antialiasing state ignored – all points quads Points are rendered with point width as usual Tex coords of points can be replaced by special “point sprite” tex coords s,t,r between 0,1 – – Tex coord r is special, can set to zero (default) or use to ‘play through’ an animation stored in 3D tex – Enable this with COORD_REPLACE_NV For hardware acceleration on GF3, set r to 0 (default) and enable coordinate replacement for tex unit 3 only See http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_point_sprite.txt See http://www.codesampler.com/oglsrc.htm; search for “point sprite” Billboards A point sprite is a certain kind of billboard – Billboards are textured polygons (usually quads) that rotate to face the viewer Build a rotation matrix for each billboard Screen-aligned billboard: quad is parallel to the screen and has a constant up vector Similar to old-school 2D sprites Useful for text, HUDs, lens flare, etc Build rotation matrix with camera u, n = -v, r=uXv World-oriented billboard Sprite’s native up vector not always appropriate World-oriented billboard: use the world up vector Still faces viewer n = -v, r=uXv Billboards Viewpoint-aligned – v = vector to eye (Fig. 8.5) – Resulting quads capture perspective distortions across view-frustum – Ex: clouds (Fig 8.6) Axially-alligned – Rotates around a fixed world-space axis – Ex: trees (Fig 8.7) – Problem: from above, look like cardboard cutouts Imposters An imposter is a billboard created on the fly to “cache” rendered imagery – Once rendered, cost of rendering an imposter is just a single textured quad – Can use for a few frames before updating – Can use for a few instances of the object Works best on distant objects (why?) Great example: portal textures – But what’s wrong with this idea? Depth Sprites Can render an object with a depth texture, so depth buffer affects and is affected by the rendering (Fig 8.16) – Can also do depth-affected lighting – Needs to be orthogonal or nearly orthogonal to look right – Under the right circumstances, might allow imposters with dynamic geometry Ex: portal texture with monster moving around in the textured room Imposters Continued Depth meshes – UNC MMR system Multitexturing Modern hardware can read from multiple textures at once, even with mipmapping Detail texturing Light mapping Bump mapping