Real-Time Rendering

Last changed: November 18, 2007

This is the Web site for the book Real-Time Rendering, by Tomas Akenine-Möller and Eric Haines, ~880 pages, from A.K. Peters Ltd., 2nd edition, ISBN 1568811829, list price $64.
  2nd ed. cover image

Ordering information and excerpts from the book can be found here. The rest of this page is supplemental material and links.

Book related resources include:

Here are the book chapters and links to resources:

Introduction (Recent Books) Rendering Pipeline Transforms
Visual Appearance Texturing Advanced Lighting and Shading
Non-Photorealistic Rendering Image-Based Rendering Acceleration Algorithms
Pipeline Optimization Polygonal Techniques Curves and Curved Surfaces
Intersection Test Methods Collision Detection Graphics Hardware (IHVs and News)
The Future (FAQs) (OpenGL) (DirectX)
Linear Algebra Trigonometry Bibliography

This website has two locations, identical in content, which are worth bookmarking in case one server becomes unavailable: http://tog.acm.org/resources/RTR and http://www.realtimerendering.com.

Thanks to all who bought this and other books by clicking through to Amazon and B&N; money earned by doing so has paid for this site's costs for the next few years.

Since we are constantly adding new links (and deleting stale ones), the newest additions are shown in this color, fading to this color, then this color, then to black, over a period of a few months.


Introduction

Our Bibliography page has links to many of the references in our book. Papers listed there will not also be listed on this page, unless the article is particularly noteworthy.

If you are interested in slides based on our book that could form the basis for course lectures, visit Tomas' course site. Do not be daunted by the Swedish there, just scroll down to the "Föreläsning" area; the PDFs linked there are in English. Better yet, Tomas' powerpoint slides are now available.

Eric has an article, "An Introductory Tour of Interactive Rendering", from IEEE CG&A, Jan/Feb 2006.

There are many graphics related links pages, including ACM TOG's software and literature areas, Technomagi's, and Tomas Arce's (also see his homepage). Frédo Durand's page has links to researchers, labs, conferences and publications. Karim Ratib's page has links to older research literature in his Applications/Computer Graphics/Publications subdirectory. We have a portal page that summarizes popular and useful links.

The Exploratory at Brown University has a wide range of computer graphics applets. These cover areas such as linear algebra, color science, image processing, and hierarchy of transformations. Patrick Min at Princeton has also made Java applets to aid in understanding computer graphics concepts.

HyperGraph covers the basics on many topics within computer graphics. A source for quick summaries of various graphics algorithms is The White Flame Page of Learning. Zed3d, an entire book on introductory and intermediate graphics (with code), is available online for free. It is 5 years old and not maintained by the author, who notes it has "many many errors", but it does give a different view of the world (and the price is right).

Recent Books

One good source for books on interactive 3D graphics is the database at 3D Links.

Looking at Amazon's best-selling DirectX and OpenGL book lists can be helpful.

Some books which have come out in the past few years and are relevant to the field:

We also maintain a recommended book list (somewhat dated at this point), with brief reviews. The Dan Sunday's Geometry Algorithms site gives a good list of some of the best books on, what else, geometry algorithms, as well as a best buys list. They also highly recommend the new Schneider and Eberly book (as do we).

Rendering Pipeline

Alexey Busygin tracks a wide range of current 3D engines. Karsten Isakovic maintains an all-encompassing 3D engines list, many with source code available (though not updated since mid-2000). GarageGames has a newer list. One free source engine worth pointing out is Mesa, an OpenGL clone which runs on almost everything and even has some accelerator support. SGI themselves have released a sample OpenGL implementation to the open source community, to encourage Linux driver creation.

The Direct3D pipeline is detailed online, with supporting equations. Similar treatment for OpenGL can be found in the online version of the Red Book, in Chapter 3, Viewing.

Doom is the 3D killer app for system administration. Source code for Castle Wolfenstein 3D, DOOM, Heretic and Hexen, and Quakes I through III are available for download under GPL. There are also ports of DOOM to a huge number of platforms. More coolness: the source code for "No One Lives Forever" has been released to the public.

Mike McShaffry has game code related to his book free to download and reuse under Creative Commons.

Genesis3D is a commercial rendering engine that has an open source license. WildTangent has purchased Genesis3D and developed an interesting system which runs DirectX in a browser window, and is developing an inexpensive game development platform. Sourceforge has any number of renderers (also check here), such as Orion3D. The portable G3D C++ library gives many tools for vector/quaternion/matrix math, collision detection, shader programming, and other common graphics tasks. For fast, cross-platform access to the frame-buffer, try the open-source SDL (Simple DirectMedia Layer); Marius Andra has some tutorials about it. RenderWare, Unreal engine, LithTech engine, Quake, and Lugh3D engines are some commercial renderers with many special effects. Commercial general purpose game engines include the extremely inexpensive ($100) GarageGames' Torque engine (here's how to get a demo license), Egerter's Power Render engine, NetImmerse (now with Gamecube support), and SN Systems. An interesting (though now dead) offshoot from gaming engines is that the Unreal engine was used for interactive architectural walkthroughs.

Anfy 3D is a small, fast software-only 3D renderer in Java. The open source GL4Java system can provide hardware support for Java applications.

Michael Wimmer has a somewhat dated, but fairly complete list of graphics APIs and scene graphs. The well-know Open Inventor scene graph system is now open source. Open Scene Graph and SGL are both free, open source scene graph systems. OGRE is a modern object-oriented system for developing interactive applications, especially games. Coin is an open source retained mode scene graph library based on Open Inventor. The Hoops3D application framework, a professional scene graph system used in CAD applications, is now open source and free for personal use on Linux systems. Ur Studios has announced GEL (Graph Evaluation Language), an open-source scene graph API which supports multi-user distributed processing. SGI's Performer is available in demo form to develop on for free, running on Linux and IRIX. Intrinsic Graphics, formed by some of the designers of SGI's Performer, has announced a graphics development system for games with Performer-like capabilities and more. Yet another engine is the G3D provided by Morgan McGuire.

An excellent article on pure software rendering, with all its tricks and pitfalls, is presented by Charles Bloom. Software rendering is not dead; for example, see Nicolas Capens' efforts. Brian Collins has also made a software-only renderer, SGS, with many features. Another software-only renderer: Kribi. Pixomatic is a new commercial product that takes a similar approach; see some benchmarks at the bottom of this page. It's available in UT2003, for example, allowing people with old graphics cards and portables to still play newer games.

Transforms

The Exploratory has a number of tutorial applets related to linear algebra and transforms.

Dave Eberly's site has useful papers and code on a wide variety of geometric operations, including quaternion interpolation. Nick Bobick also has a nice article on quaternion rotation and interpolation. Code for rotating from one vector to another rapidly using quaternions (as described in the book) is available online. If you need a further explanation of quaternions, you might try this article.

Scott Johnson discusses ways to make creating transforms easier, including a shorthand notation used in robotics.

Flipcode has a 3D geometry primer online. Animats has a C++ version of the speedy and useful Doué's Graphics Gems vector manipulation classes (if you prefer pure C, consider using Hollasch's vector macros). The Portable Game Library includes code for a Simple Geometry library. The Math3d library is open source and includes C++ classes for vector, quaternion, matrix, ray, line, plane, and AABB's (however, such operations as intersection between these objects are currently not implemented).

MSDN Magazine has a tutorial on skinning with vertex shaders. Intel has an article on CPU-side skinning. Keshav Channa has a tutorial on skinning using DirectX 8.0. Pose Space Deformation is another approach to the problem which overcomes some problems with skinning. And, you name it, they have it, SourceForge hosts a free, open-source skeletal animation system.

Paul Bourke's site includes information on geometry and projection, and includes many basic geometric operations as well as more advanced (e.g. anamorphic projections).

The Graphics Gems book series contains a number of good articles on transformations, with code online. Sample chapters from the book Practical Linear Algebra are available. The book Numerical Recipes is available online, and contains information on topics such as linear and spline interpolation (and much else).

A comparison of the cost of Cramer's Rule vs. Gaussian Elimination for different size matrices can be found in an online version of a book on computational science.

Putting your z-buffer's near plane as far from the eye as possible is a good idea. Steve Baker has an article on this topic.

For more transform related information, see the Linear Algebra section.

Visual Appearance

Lacroix has an article about modern dynamic lighting on the GPU.

The Exploratory has applets that teach about lighting models and signal processing, among other topics. Pellucid is a Java applet that allows you to manipulate the VRML lighting model, which is similar to the lighting model covered in this chapter.

Scott R. Nelson's antialiased line code is available for download. Here is a comparison generated using his program of lines improperly drawn with gamma=1.0 (note the severe roping and Moíre patterns) and properly drawn with gamma=2.2. Note that you must view these files with a 2.2 gamma display system (e.g. on a PC). Eric Chan has a piece of code and a description of a technique for drawing antialiased lines with the GPU.

24 bits of color is usually enough, but not always. Here's an image showing concentric bands only one pixel value apart; look in particular at the bottom half of the large cube in the center.

The Z3 paper by Jouppi and Chang has a good summary of many previous antialiasing techniques.

Sun Microsystems' new XVR-4000 machine has some interesting features. It uses a 5x5 filtering kernel to reconstruct an antialiased image in real-time. It's brute force, using up to 400 samples per pixel, but looks great.

Akenine-Möller has an inexpensive multisampling scheme (1.25 samples per pixel) that compares favorably with Quincunx sampling.

Extremetech made an interesting side-by-side comparison of filtering techniques used by ATI and NVIDIA.

Baker and Boyd discuss ways to create volumetric fog, where only a given volume of space has fog in it.

Transparency is difficult to perform correctly in a single pass when using a Z-buffer. Steve Baker gives a good summary of the various approaches to solve this problem.

Poynton's web site talks about gamma correction and color spaces. Chris Cox also has a useful page, with links to many resources. Steve Westin has a nice page for setting the black level of your monitor and determining the gamma value for your viewing environment.

Texturing

The SIGGRAPH course notes for Advanced Graphics Programming Techniques Using OpenGL are available online. These contain an incredible amount of information on shading, texturing, and special effects. Sadly, the SIGGRAPH '99 course notes for Lighting and Shading Techniques for Interactive Applications are no longer on the web (that I could find).

NVIDIA's, ATI's, and Intel's (especially here) developers' sites include demos, white papers, and presentations on texturing, environment and bump mapping, and much more. These sites are invaluable for technical information and code samples. Gamasutra has a old but informative article on the theory and practice of mipmapping.

Hadwiger et al. present an algorithm which can use graphics hardware to accelerate arbitrary filter kernels (e.g. bicubic) for magnification. The method can also be applied to volume visualization.

NVIDIA has a presentation from GDC 2003 about using their hardware to implement summed area tables.

An article from NVIDIA discusses when it is more efficient to use a cube map lookup for normalizing a vector.

Polynomial Texture Mapping by Malzbender et alia at SIGGRAPH 2001 looks to be a promising approach for realistic display and capture of bump maps from actual models. A runnable demo of their work is available for a variety of systems.

Rupert Paget has a good collection of links to research about texture synthesis on his web site, which also presents his own approaches to the problem.

Some fascinating applications of texture mapping can be seen on Angus Dorbie's site.

S3TC texture compression has become a standard part of DirectX, and is now called DXTn texture compression. Information about the DXTn format can be found at Microsoft's site. A free Photoshop plugin and compression library is available for manipulating DXTn (DDS) format textures (the package also converts heightfields to normal maps). Aleksey Berillo has a thorough comparison of S3TC and FXT1. The Unreal developer network has an excellent article on DXTC compression and quality comparison. NVIDIA has sample code for reading DDS format image files. Gamasutra has a techniques and tips article about texture compression. DevIL is an open-source image conversion library that reads and writes DDS and many other formats. If you are interested in compression in general, go to DataCompression.info.

The OpenEXR image format, developed by ILM, allows higher precision formats to be written and read, including support for the 16-bit floating point "half" format used in NVIDIA's Cg format. It is an extensible format that allows arbitrary buffers of data. The latest version's "exrdisplay" program uses hardware acceleration to implement the display pipeline.

Heckbert has written a worthwhile Survey of Texture Mapping and a more in-depth work, Fundamentals of Texture Mapping and Image Warping. Many interesting applications of texture mapping are discussed at Paul Haeberli's site.

Light maps can be applied a number of ways: by doing multitexturing on the fly, or by combining the illumination and surface texture map once and caching the resulting single texture. Fluid Studios discusses their KAGE surface caching system to manage these derived textures. Michael Herf gives a more elaborate method of using light maps effectively, a software approach that might be doable with pixel shaders. Luke Hodorowicz gives a number of techniques for using dynamic light maps.

A great history of reflection mapping is available from Paul Debevec's site. Some normally difficult to obtain early papers and videos can be found here. High dynamic range environment map image data is also available at Paul's site, along with 8 bit/channel spherical map images. His HDRShop program is useful for creating and manipulating environment maps of different types (including the ability to make irradiance maps); free for non-commercial use. Michael Herf has Photoshop plugins for more artistic blurs and Fresnel effects. Masa has a great demo showing HDR lighting, glare, depth of field, motion blur, Fresnel effects, and more. Riguer gave a talk discussing his method of using pixel shader blurs to simulate depth of field.

What makes a great technical demo? One person's opinion.

A clever thing: Mark VandeWettering took Escher's mirrored ball and reversed the mapping, to obtain a cube map of the scene.

The VTP site notes a number of other ways to map to a sphere, with pros and cons of each.

Hargreaves gives methods for quick approximation of color bleeding for objects moving through an outdoor environment.

Paul Baker has an article about how to perform bump mapping using the ARB OpenGL extensions. He also has code for per pixel lighting with bump maps using NVIDIA extensions. NVIDIA has an article about mipmapping normal maps. NVIDIA explores simple compression techniques for bump maps to achieve better quality at a cheaper cost.

A new family of bump-mapping techniques are based on Kaneko's parallax bump-mapping work in 2001. The underlying concept is to do a simplified ray trace of the bump map surface's heightfield, finding which texel is actually visible at each pixel. There are a number of schemes to accelerate this process. Welsh gives a basic solution to the problem using the GPU, providing bits of source code. Donnelly creates a 3D distance map to more rapidly find the closest ray/heighfield intersection, at the cost of additional storage. Oliveira, Policarpo, and others call the algorithm "relief texture mapping" (RTM). They use an approach of sampling the texture heightfield along the projection of the ray onto the surface, using these samples to approximate where the first intersection is located. They have a implementation available in Cg, along with a video. They have also done some work on handling curved surfaces, a trickier case. See Policarpo's site for more demos and papers. Tatarchuk and Brawley have published work in the area, including this article and this presentation, showing ways to perform convincing self-shadowing and improve quality and speed. Tatarchuk and others at ATI have also made a Toyshop video showing the effect. Morgan and Max McGuire have a poster describing a similar technique, and provide source code.

Gamasutra has a pair of articles on performing refractive mapping.

Ignacio Castaño has made some free 3DSMAX tools to convert a highly polygonalized model to a bump map texture. ATI has a program called NormalMapper which generates bump maps from a high and low resolution model.

There are many sites with free textures out there. NVIDIA has a set of over 200 free tiling textures, in the DirectDraw Surface (DDS) format, with a liberal license. Another good place to look are 3D Cafe, The New Graphics BBS.

Tom Nuydens has a demo in Delphi that renders animated Perlin noise. There is also an Intel article on making noise and on generating procedural cloud textures. James and Harris presented at GDC 2003 a number of uses of procedural texture generation for animation. There is a companion web site for the book Texturing & Modeling: A Procedural Approach, 3rd Edition, which has much information on procedural texture generation.

Advanced Lighting and Shading

Phil Dutre's Global Illumination Compendium, mentioned in "Further Resources", has much useful information on BRDFs and other facets global illumination theory.

For more on radiometry definitions, James Palmer's site is one place to look. The Brown Exploratory has an interactive tutorial on color perception, using Java applets to illustrate various concepts.

There is a color space FAQ available. Well, two: Poynton's and Bourgin's. Poynton's is maintained and more extensive, Bourgin's has some tidbits on different color space conversions. The CVRL website has a huge amount of easily downloadable primary research data relating to color. A chromaticity diagram applet made the image used in the book. ExtremeTech has a recent article on color matching. There is information about the sRGB64 color management standard at Microsoft's site.

Stanford and Berkeley's Appearance Models course reading list is a good place to start for information on material appearance. NIST maintains some links to BRDF information. Steve Westin has some good information on Fresnel reflectance. BRDF data is available from Cornell and Columbia Universities.

Sloan, Kautz, and Snyder have a paper in SIGGRAPH 2002 called Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments, which discusses how to implement some global illumination effects at interactive rates. Kautz, Sloan, and Snyder's paper Fast, Arbitrary BRDF Shading for Low-Frequency Lighting Using Spherical Harmonics discuss using spherical harmonics to evaluate anisotropic BRDFs, as well as perform self-shadowing. Sloan et al. follow up in SIGGRAPH 2003 with Clustered Principal Components for Precomputed Radiance Transfer, which gives considerably more efficient ways of using such algorithms. A very nice tutorial on precomputed radiance transfer is available from SCEA. Steve Hill has written an article about using hardware-accelerated precomputed radiance transfer (PRT) for game art production.

Dave McAllister presents a method called SBRDF about implementing the Lafortune lobe model for hardware accelerated BRDFs. His thesis on the subject is also available.

There is a repository of factored BRDFs available for download; the page also gives worthwhile implementation details.

An excerpt from GPU Gems is available, about rendering skin using a number of advanced techniques.

Kim Pallister's article gives a good overview of techniques for rendering to a texture. Older information on offscreen rendering in general is presented in Brian Paul's 1997 course notes.

Wolfgang Engel has a good series of articles about vertex and pixel shaders. You can find another introductory shader article by Adrian Boeing. MSDN has a tutorial on vertex shaders. NVIDIA's and ATI's sites both have a huge amount of information on advanced techniques (in particular, see the NVEffectsBrowser for a way to quickly access a wide range of effects); keep visiting these sites, as they are frequently updated. Intel's also has some worthwhile articles, especially here. Nutty.org and Humus both have some other examples of advanced effects. An article about non-integer power functions is excerpted from the ShaderX book.

ATI's RenderMonkey toolset provides shader development tools for all DirectX 9.0 compliant graphics cards. The toolset allows compilation and previewing of shaders, and comes with a large number of sample shaders. NVIDIA's CgFX Viewer is a related program. Shader Studio is another utility for developing shaders, and ShaderWorks is yet another tool. Wolfgang Engel has an article on Gamasutra about Implementing Lighting Models With HLSL. Michal Valient has a thesis (and more) discussing using DirectX 9 to implement various shading models. He also has a tutorial for Microsoft's HLSL (High Level Shading Language) in DirectX 9 using RenderMonkey. Ron Fosner also writes about Implementing HLSL with RenderMonkey. What you probably really want to be doing for production rendering is create effects files instead, which give you a higher level of abstraction.

GPGPU.org is an excellent site for information on using GPUs for general purpose computation. Their FAQ and wiki are particularly useful.

The 3D Shaders site is the online part of the OpenGL Shading Language book. There's source code, shaders, errata, and useful links here.

NVIDIA's Cg programming language is one higher level solution for programming vertex and pixel shaders for OpenGL and DirectX. The Cg Tutorial book is a well-written guide to this language. This compiler has been open sourced. A shader repository has been created specifically for this language. At SIGGRAPH 2003 Mark et al. presented a paper on the Cg system. Other Cg related presentations are also available. The graphics3d site has a tutorial on Cg, and Tom Nuydens has an example Cg program in Delphi available for his height fog method. Cg sessions at SIGGRAPH are also available. There is even a Python framework for writing Cg effects. For inspiration on shaders, visit the Renderman.org site. Speaking of RenderMan, it can be implemented (to a fair extent) even on a PS2.

Vertigo is a shading language from Microsoft Research that focusses on procedural modeling, shading, and texturing.

The University of Waterloo has developed Sh, a metaprogramming language for GPU programming. McCool et al. discuss in Shader Metaprogramming a way to define a high-level shading language in C++ and shows the advantages of their approach. A nuts-and-bolts description of their Sh system is on Gamasutra. The Sh website is where to get the software.

Stanford has an executable version of their real-time shading language available.

Texture fetches in the vertex shader are now possible with the Shader Model 3.0. NVIDIA has a nice tutorial on this topic

NVParse is a tool from NVIDIA that simplifies the process of configuring texture shaders and register combiners, and gives improved error reporting for vertex shaders.

NVIDIA and ATI each have a large number of new presentations from GDC 2003 about shaders and related topics.

The BrookGPU is a system (language, compiler, runtime) for general-purpose computations on the GPU.

The Mac OS X release of the Graphing Calculator will, when possible, generate GPU programs on the fly from typed equations.

There is a large variety of OpenGL tutorials on advanced techniques at the OpenGL.org site.

Paul Baker's site has a large number of different demos and code for advanced techniques.

ClearCoat is SGI's (now free) implementation of Cabral et alia's 1999 SIGGRAPH paper, in which they create realistic BRDFs by blending spherical environment maps for different viewpoints.

Paul Lalonde has a paper in SIGGRAPH 2002 about creating shaders for multiple platforms from a single set of data. Florian Sauer and Sigmund Vik discuss managing different shading techniques on the Nintendo Gamecube.

To see the original soft reflection and transparency images by Paul Diefenbach, visit his site. He gives other interesting experiments in using graphics accelerators for global illumination, as well as his seminal thesis on the subject and a shorter, summary article.

Jensen and Golias's article on simulating water gives a detailed approach to the problem.

Heckbert maintains a (fairly dated, unfortunately) page on shadowing techniques, as well as links to Herf & his own work. Charles Bloom has a useful "how to" guide for generating shadow textures.

The best recent article on shadow volume theory and implementation is Everitt and Kilgard's. Also at this paper's site is the otherwise difficult-to-find Heidmann paper (the first on stencil buffered shadows) and Carmack's original thoughts on doing z-fail counting. Eric Lengyel has an article further discussing implementation details and optimizations for shadow volumes. There is also an extremely thorough article about z-fail shadow volumes and related topics at GameDev.net. NVIDIA has also introduced ultrashadows, which helps trim the amount of fill needed for shadow volume computation. Brandon Lloyd et alia discuss a number of improvements that can be made when using shadow volumes in complex environments.

Perspective shadow maps is an algorithm from 2002 that makes better use for the texels in the shadow map. This is done by creating the shadow maps in post-perspective space. Several improvements of perspective maps have been presented, including LISPSMs, trapezoidal shadow maps, and A Lixel for Every Pixel. To do shadow mapping with optimal use of the samples, alias free shadow maps is the way to go. The irregular Z-buffer is the same idea, but presents how you can actually build hardware for it.

For better performance when using shadow volumes, a hierarchical shadow volume algorithm has been developed. The idea is to perform per-pixel work only in tiles where there are shadow boundaries (however, new hardware is required for this). Chan and Durand use a similar idea, but combines the best of shadow volumes and shadow maps.

Akenine-Möller and Assarsson have a number of papers on their techniques for creating soft shadows with modified shadow volumes as well as source code.

At SIGGRAPH 2003 Govindaraju et al. presented LOD and visibility culling methods to accelerate shadow algorithms for large environments.

Masaki Kawase has a demo (including source) for NVIDIA cards of projective texturing, indexed shadow mapping using an alpha priority buffer, reflection, anisotropic filtering, and other effects. Ron Frazier has a number of articles (and code) discussing how NVIDIA's register combiners can be used to produce complex shading, lighting, and shadowing effects. Riguer presents a method and Fernando gives an efficient method for performing percentage closer filtering for shadow maps.

Hasenfratz et al. have written A Survey of Real-Time Soft Shadow Algorithms. Chan and Durand extend the shadow map to rapidly generate reasonable soft shadows. Cg code is included. Wyman and Hansen similarly extend the shadow map to create penumbral shadows. Brabec and Seidel have a paper on antialiasing shadow map edges. Willem De Boer has an article about creating smooth penumbrae with shadow maps in image space.

A software-only Java applet that shows real-time mirror reflection works surprisingly quickly on fast machines. The trailing accumulation buffer technique for motion blur can be seen in another Java applet using this same package.

Sanchez-Crespo has an article about his approach for creating underwater caustics using Cg.

Ingo Wald and Philipp Slusallek have a nice summary of current ray-tracing research in their "State of the Art in Interactive Ray Tracing" report. Their own work is also of interest, and see their gallery for some impressive results beyond what is in our book. Researchers at Stanford and the University of Illinois are examing hardware ray tracing by using pixel shaders and texturing. There is an active research forum on the topic of real-time ray tracing.

Hugo Elias has a longer one with practical tips, and Paul Nettle has another one specifically aimed at games. Paul also has a radiosity processor that generates light maps and is highly automated. Coombe et al. discuss computing radiosity using the GPU. Hart has his slides about global illumination on the GPU on his web site. There are links to other radiosity and ray tracing resources at the ACM TOG site.

Color bleeding takes on a whole new meaning when a classic radiosity test-case is used as a game environment.

A new way of simulating radiosity effects that is rapidly becoming popular is the class of "ambient occlusion" or "obscurance" techniques. We mention this idea briefly on p. 284-5 of the 2nd edition. The basic idea is to examine the nearby geometry for a given point on a surface and precompute approximately how much this geometry will affect how much ambient light reaches this point. Iones et al. gives one method of performing this type of computation, Neulander another. ATI's free normal mapper now supports generation of ambient occlusion. This technique is also used for non-interactive rendering (more information here and here).

Sub-surface scattering is a phenomena where photons are enter into some medium (e.g., skin or marble), bounces around inside the media, and then exits at some point other than the entry point. For real-time rendering, many proposals to handle this effect have been suggested, including translucent shadow maps, Merten et al's technique, and Hao et al's technique.

To create depth of field, one can render the scene, build a mipmap, and then sample the mipmap hierarchy according to the distance the pixel's depth from some focal plane. The closer to the focal plane, the less blur. Such techniques have been described by Cant et al. and by Demers, in the "Ogres and Fairies" presentation from GDC2003. A (quite) similar technique is presented by Mulder and van Liere. An algorithm for depth of field for point surfaces has also been presented.

At SIGGRAPH 2002 Tim Purcell et alia showed an ATI Radeon 9700 performing ray tracing at interactive rates, accelerated by graphics hardware. CPU-side interactive ray tracing research also continues; for example, visit Philip Slussalek's page on this topic and for OpenRT. Realstorm's free Benchmark ray tracing program is also impressive for showing how fast complex scene ray tracing can be.

Real-time ray-tracing demos have been around on a small scale since 1995. Picard gives a fascinating explanation of how the ray tracing intro "Heaven Seven" works. An amazing thing: a 256 byte program that ray traces a tube structure in real-time (and there is a site dedicated to these).

Non-Photorealistic Rendering

An excellent non-photorealistic rendering (NPR) resources page has been put together by Craig Reynolds. Amy and Bruce Gooch have a nicely organized NPR page. Mario Costa Sousa has an extensive NPR bibliography available. Stefan Schlechtweg's NPR papers page is less extensive, but has the excellent feature of including the abstracts of many papers.

More details about ATI's image-based NPR technique are available in ATI's technical papers collection.

Jeff Lander has online two articles, executable, and sample code showing one technique for NPR. Later, related code (without the articles online) can be found at the Game Developer code area under his name.

Paul Baker has code for performing cel shading and painterly rendering.

The image filtering method for edge detection, developed by ATI, can also be performed on a GeForce 3 or better: Tom Nuydens has a demo. NVIDIA has sample code showing convolution filtering using OpenGL and Cg.

Princeton and Brown collaborated to create a system to enable an artist to define a stroke style and have the system automatically use this for rendering.

Kalnins et al. have a paper in SIGGRAPH 2003 about rendering stylized silhouettes with temporal coherence in real-time. Tom Hall has a demo and paper on rapid approximate silhouette tracking.

Paul Heckbert has a collection of old but valuable news posts on accurate polygon edging techniques, including code examples.

Even gibbets can be stylized, see NPRQuake.

Image-Based Rendering

The open-source Allegro game programming library implements many sprite-related functions (see the Gamasutra article for more about this package). OpenPTC is an open source library for quick blitting to the screen; Windows, X11, and Java versions are available. TinyPTC is a small subset that is simple and fast.

Décoret et al. present at SIGGRAPH 2003 a method for generating billboard clouds. Wang discusses how Microsoft Flight Simulator 2004 does its cloud rendering via a mix of billboard and impostor techniques (paper abstract here).

Andrew Glassner has more on Chicken Crossing, a film made using image layers on a Talisman simulator. UNC Chapel Hill is one research lab with many papers on IBR related techniques. Paul Heckbert has a somewhat dated set of links to image based rendering and modeling resources.

Some excellent QuickTime VR panoramas (including the one shown in the book) are available for viewing on Ken Turkowski's page. The IVRPA is a great place to see panorama images and learn about how to make them.

To get a flavor of image based rendering, see the Virtual Camera site's demos. Though there is little going on here algorithmically, it shows the power of capturing a scene from many angles at once.

William Damon has an article on impostors and render to texture, and how to do it if render target textures is unavailable. GPGPU.org has a FAQ on their wiki which includes information on how to use render to texture.

Mark Harris' web page about the use of impostors for cloud simulation is both educational and beautiful. GL Excess is a fun demo showing off a wide range of image-based and special effects.

Sean O'Neil has an article about procedural rendering with impostors. This article also has some interesting references and links on related topics, such as terrain and tree rendering.

A free program to generate a set of textures showing an animated explosion is available for download.

Particle systems code can be found in the Game Developer magazine code site in the July 1998 archive. John van der Burg discusses data structures for particle systems on Gamasutra. A cool Java applet shows particle systems in action. David McAllister has a particle API available, along with some nice screen shots and links. Particlesystems.com tracks news and information on particle systems in general. Lutz Latta discusses how to use the GPU to compute particle paths rapidly.

Dean Calver has an article about the pros and cons of using textures storing surface attributes in textures in order to perform deferred rendering.

Related to image-based rendering is image-based modeling, a.k.a. photogrammetry. One product that reconstruct models from images: RealViz; there are undoubtedly others.

For volume rendering information, look at the ACM TOG software page for some leads. The Teem Toolkit has many useful routines for volume rendering. The OpenGL Volumizer has some interesting technical information on how SGI is approaching the volume visualization problem. NGRAIN is a product that uses CPU-side voxel rendering for visualization.

ATI has two presentations about real-time post-processing and video image processing from GDC 2003. Greg James and John O'Rorke describe how the real-time glow effect for the game Tron was done (this article is excerpted from GPU Gems).

A solution in search of a problem (actually, I just thought it was cool): a 3D space filling Hilbert curve.

Alex Evans has an interesting article about quick ways to do blurs in software and hardware.

Researchers at UNC Chapel Hill are using graphics hardware to simulate various physical phenomena such as cloud formation and reaction-diffusion.

The Jahshaka system is an open-source project to use graphics hardware to help create and preview video effects and perform editing in real-time.

Acceleration Algorithms

The recent book Level of Detail for 3D Graphics, by David Luebke et al., does a good job of discussing level of detail algorithms in depth. This book has a companion web site.

Vaughan Young has an article on Gamasutra summarizing culling techniques for first-person shooter games, excerpted from his book.

Scalability is a key idea necessary when building an application for a wide range of processor and graphics accelerator speeds. Gamasutra has an introduction to the subject. Tom Forsyth has talks on this subject, and some additional notes.

Bretton Wade's BSP FAQ is somewhat dated, but still a good place to start for binary space partitioning algorithm information. Adam James' 1999 Ph.D. thesis on BSP tree techniques for rendering is available online. It has a thorough overview of previous and related work. Some applets for visualizing spatial indexing schemes are available on the web.

An in-depth analysis shows how the GeForce 2 and 3 benefit from drawing objects in a front to back order.

Michael Abrash has an illustrated account of how the Quake rendering engine works, excerpted from his (now ancient) Black Book; he also has a shorter outline version. This engine uses an interesting mix of BSP-trees and Z-buffering. Many other old Quake programming related papers are available. Quakes I through III are available for download under GPL.

A fascinating, readable overview of the tricks and techniques used in making high-end flight simulators over the years is available online. Carl Mueller's "Architectures of Image Generators for Flight Simulators" is available in postscript form from UNC Chapel Hill's Technical Reports library.

A survey on occlusion culling algorithms is available. Seth Teller's publications page has a number of articles on occlusion culling and portals, including his thesis. Frédo Durand's thesis has a good in-depth survey of visibility techniques. Charles Bloom has a number of demos and articles on practical implementation of portals, LOD techniques, etc.

If you use SGI's Performer software, you may be interested in David Luebke's pfPortals extension, which does portal and cell culling.

The flipcode site has a set of tutorials on portals, BSP trees, and related schemes (and more). [These links are old, but are more direct than the main flipcode articles page.]

Michael Bacik has an article on Gamasutra about occlusion culling in outdoor environments.

Hybrid Graphics sells dPVS, a system for accelerating visibility and occlusion testing. The dVPS manual includes a 130 page section near the end which details visibility theory and the algorithms used in their library. The dPVS system is also described in an IEEE CG&A paper. Their demos are excellent aids for understanding how these algorithms work. In related work, Aila et al. have a paper in SIGGRAPH 2003 about how delaying triangles between the vertex and pixel shader can result in reducing the use of fill rate by performing occlusion culling.

In Feb. 2002 NVIDIA made public its extension to test object visibility using hardware. There is also small tutorial on how to use occlusion queries in DirectX.

Anselmo Lastra's talk of All the Triangles in the World gives a brief overview on the use and blending of different rendering techniques such as impostors, level of detail, etc.

For information on multiresolution modeling (LODs and more), see Garland and Heckbert's site. There are links here to papers, free and commercial software, and much else. Note that this page has not been updated since 1997, but it's a place to start.

Source code and a demo for the point rendering system QSplat is available for download. Pointstream also has an interesting renderer that uses a point cloud representation instead of polygons. Pointshop3D is a package that performs interactive editing of point-based surfaces.

Pipeline Optimization

NVIDIA has a profiling tool called NVPerfHUD, available to registered developers. John Spitzer's slides about bottleneck detection are available at NVIDIA's site. ATI has a presentation about Direct3D Performance from GDC 2003.

PowerStrip is a shareware program which provides a huge number of controls over a wide range of graphics cards. What's particularly useful for pipeline optimization is that you can reduce the speed of the GPU and see its effect on performance.

Chris Hecker has written a number of excellent articles on compilers and speed-up techniques for the PC. For example, his More Compiler Results, and What To Do About It article shows how the simple operation of transforming a set of three vectors by a matrix could be made 3 times faster by trying different forms of the same code. Haim Barad presented an optimized matrix library (with source) for the Pentium III. For extensive coverage of how compilers optimize source code, see the Nullstone site. Tomas Arce has an interesting article on optimizing a C++ vector class, building and improving upon Jim Blinn's Optimizing C++ vector Expressions article in IEEE CG&A.

Though dated, the 3D Studio MAX R2 display architecture page is a fascinating case study (as is the R1 page), showing how a wide range of hardware is accommodated in making a modeler's user interface fast. It talks about pipeline optimization issues, software vs. hardware acceleration, Direct3D vs. OpenGL, and much else of interest.

An article on cleaning memory and partial register stalls discusses assembly level optimizations for Intel processors. There are tons of articles and resources for x86 assembler. Michael Herf has a solid article about floating point precision control and in-depth coverage of fast float to int conversion. Michael has other nice optimization tricks on his page. Rob Wyatt has a practical overview of the Pentium III architecture. Baker and Pallister discuss optimizing games on the Pentium III. Zohar and Barad discuss the use of SSE (Katmai) instructions in Implementing a 3D SIMD Geometry and Lighting Pipeline, and Gross has an article on Pentium III prefetch optimizations. The slides and other materials for the SIGGRAPH courses Aggressive Performance Optimizations for 3D Graphics and Developing Efficient Graphics Software are available online. AMD's 3DNow! technology speeds a number of common graphics operations. Dr. Dobb's Journal has an article about optimizing for 3DNow!, with the code listings available online. The processor pack for Visual C++ 6.0 provides support for 3DNow! and SSE instruction sets. Intel has a free approximate math library, with source, for fast math function calculation with SSE. Intel has a tutorial on optimizing double-precision 3D transforms using SSE2. Other assembly language related information can be found in the Google Directory.

An in-depth article on various sqrt() replacements is available on A Zillion Monkeys. See the Graphics Gems series for code for quicker square roots and inverse square roots (search the tables of contents for "square"). On Intel processors, sqrt() takes about 70 cycles, and reciprocal square root 109 cycles through the FPU (according to Huddy's Scalability talk, which has some other good code optimization techniques). Richard Huddy of NVIDIA has provided us with their improved fast square root code. It avoids the odd/even exponent headaches of Lalonde's Graphics Gems approach by using the low order bit of the exponent as a part of the look up table, too. Look here for a paper by Chris Dumont for an in-depth discussion and comparison of fast inverse square root computation.

Gamasutra has an article about using cache memory, something that can make a huge difference in performance. It is also important to perform AGP writes correctly. Hixon discusses general memory management principles for game consoles.

SoftWire is a tool for compiling optimized inner loops for software renderers.

Intel's VTune is a popular inner loop optimization tool, with a free 30-day evaluation for Windows and Linux. Andi Smithers has an article at Gamasutra about the latest version of VTune. There are many general code profiling tools, such as NuMega's TrueTime and others.

Polygonal Techniques

Narkhede and Manocha's polygon tessellator code in Graphics Gems V has been improved to handle holes. O'Rourke has a tessellator available online, from his (wonderful) book Computational Geometry in C, but it is mostly for educational purposes. Held has a paper on the current state of polygon triangulation research, as well as his own solution. Or just have OpenGL do your tessellation for you. Incidentally, we've heard it said that the SGI reference implementation triangulator seems more robust than Mesa's. CGAL has a computational geometry bias, but supports many operations on polygonal models. If you need meshes with various constraints (e.g., avoiding long, thin polygons), try Jonathan Shewchuk's Triangle software.

There are a number of free modelers available for low-polygon-count models, such as Aztec (feature set here), MilkShape 3D, and many others.

For file format information, start at Wotsit's Format or the Graphics File Format Page; for CAD files see the CADCAM Information Center. Check out the COLLADA project (involving many large companies), which is a file format that will include, among other things, some support for programmable shading. For translating various file formats, 3D Links has a good list of available software. If you need large models for testing algorithms, visit the Large Geometric Models Archive. For particular objects, you might check the free collections at 3D Cafe, and Help3D.

Nate Robins has an interesting online document on surface smoothing. Gavin Bell describes a bit more about how to get the normals to point outwards, along with sample code.

Search NVIDIA's developer site for OpenGL vertex array range and fence extension information, and for DirectX vertex buffer information.

NVIDIA has a number of presentations from GDC 2003 about batching, buffers, and the proposed superbuffers OpenGL extension.

There are a number of papers summarizing simplification research to date. Luebke's is a good one (and the most recent), but there are also summaries by Garland and Heckbert, Krus et al., Erikson (look for "Overview"), O'Rourke ("Column 33"), and Hadwiger.

GTS is an open-source, LGPL polygonal manipulation library that does VIPM, stripification, hierarchical bounding box generation, and more.

For more information on multiresolution modeling and simplification, Garland and Heckbert's site has links to older papers, free and commercial software, bibliography, and more. Garland's QSlim is one of the fastest algorithms for simplification (but is GPL). Mark Duchaineau's free LibGen has simplification code buried in it (see the "surf" library and "surftools" commands). Melax's free demo does a good job of showing decimation and geomorphs in action. His feedback page is also interesting, in that it discusses practical problems and solutions concerning mesh decimation. Another free mesh simplifier is available at The Klaudius Page. Commercial versions include Awaron's RXpolyred decimator, Systems in Motion's Rational Reducer, and Triangle Software's. Intel has tutorials on multi-resolution meshes and subdivision surfaces, for use in Shockwave Studio. Martin Isenburg has a benchmark model compressor where you can set the number of bits per coordinate and view the results of using his algorithm.

Hoppe's site has a number of papers on simplification and related topics. More technical papers and demos can be found at Lindstrom's and Jon Cohen's sites. Luebke has a library available related to his view-dependent simplification research.

Brad Grantham has code available for stripification, which has gone through a few iterations of improvement. Another approach to stripification is available from David Kormann, and includes a demo. Martin Isenburg has done research on compressed transmission of mesh data along with stripification information. Pierre Terdiman has one, too.

The Virtual Terrain Project has a huge amount of useful information about terrain storage and rendering, as well as source code. Henri Hakl has written an overview of some well-know level-of-detail and culling techniques. One scheme by Duchaineau is the ROAM method, which has an excellent web site associated with it. It is explained in depth (and with more sample code) by Turner. Gyurchev gives ROAM implementation optimizations. Sander Maréchal discusses the advantages of brute force terrain rendering. Thatcher Ulrich has an article, demo, and source code for using LOD techniques for terrain models. He also has a chunked LOD terrain demo at SourceForge, and updated code from his presentation at SIGGRAPH 2002. It can handle the large terrain datasets at VTP. Seumas McNally uses binary triangle trees for terrain data management. Peter Lindstrom has extensively researched terrain simplification and LOD techniques. Mike Rayner discusses using Bézier patches in a terrain level of detail system. Scheider and Westermann have researched a more GPU-friendly terrain rendering algorithm.

DDG is an open source toolkit for graphics development, and includes a terrain rendering engine. The Coin scene graph system has CLOD terrain extensions. Beyond the VTP page listing, Intel has an article on terrain synthesis, as do Paul Bourke and Glenn Corpes. There are many noncommercial and commercial packages for terrain rendering (one nice one missing from the commercial list: 3DNature). One open source project to create a flight simulator is FlightGear.

A number of companies are working on polygonal model compression, simplification, and streaming of 3D or pseudo-3D over the web: Viewpoint (was: Metastream), Wild Tangent, Cycore Cult3D, 3D Groove, Pulse3D, RealityWave, RichFX, and Ideaworks VECTA3D. The Web3D Consortium, in charge of VRML standards, continues on.

Mesh simplification and compression is an ongoing area of study. For some of the latest research, check the SIGGRAPH 2003 papers.

Curves and Curved Surfaces

Gabe Kruger's tutorial on Bézier spline surfaces is a practical introduction to these surfaces, as is Mark DeLoura's article on bicubic Bézier surfaces and Sharp's article on Hermites and Béziers. Justin Reynen also wrote an introduction to Béziers, as has Hugo Elias. Nils Pipenbrinck has a useful tutorial on Hermites, especially on how to use them for path control in animation. Ismail Ziauddin gives some implementation details.

Mark DeLoura presents a good introduction to bicubic Bézier surfaces. ATI has information on their version of DirectX 8 N-Patch tessellation.

SIGGRAPH course notes for subdivision surfaces are available on the web. Warren and Weimer's companion website for their book on subdivision surfaces includes a discussion board, links to researchers, and demos and images. Brian Sharp has two excellent articles on subdivision surfaces: one on the theory, another on implementation. Aaron Lee has an article online on subdivision surfaces and progressive meshing. David Brickhill's article "Incredibly Dense Meshes" discusses Loop subdivision and includes code samples. The NYU MRL site has a subdivision surfaces page with many resources and links. Shiue et al. discuss generating subdivision surface meshes on the GPU, once random read/write to video memory is available. Joseph Baumgartner has a good overview article on subdivision surfaces, which includes many good online references.

Superbuffers point the way towards "drawing" geometric data to a vertex array instead of an image.

A white paper and a number of related demos of Matrox's hardware displacement mapping feature, used in their Parhelia chipset, are available. Carmack comments in his .plan file.

Paul Baker has a demonstration program with source that tessellates and renders metaballs.

We do not cover NURBS in our book (in the long-run subdivision surfaces may well replace them), but these are important in modeling. Dean Macri has an article on using NURBS in real-time applications at Gamasutra's site and a longer version on Intel's site. There is also an article at Intel's site about using SSE to generate NURBS. Vincent Prat also has a tutorial on NURBS and trimming. The source code for the book An Introduction to NURBS is available online. There is an entire NURBS manipulation library in SourceForge.

There is a short history online of the most famous spline surface model, the Utah Teapot; a program to generate it is available for download.

Intersection Testing

We created a 3D Object Intersection page, giving references and pointers to code for a wide variety of object/object intersection tests.

Dave Eberly's site has code for many object/object intersection tests. He also has code for many other operations. The Geometry Algorithms site has articles about many useful operations, as well as an excellent links page. Paul Bourke's geometry page describes a number of common geometric operations (scroll to the bottom).

The Graphics Gems book series covers a number of ray/object intersections (e.g. polygon, box, polyhedron, quadric, cylinder). See the category list online; code is also available for download. Another source for ray/object intersection routines is ray tracer code; see the ray tracer list at ACM TOG for places to look. The G3D library is an open source graphics library that includes some collision detection and response methods.

Jorrit Rouwé has a paper on swept sphere and ellipsoid collision detection.

Möller and Trumbore's ray-triangle intersection paper is available online, as is their code. Extensive testing of variants was also done by Möller.

Code for triangle-triangle intersection is available online. Code for an OBB/OBB overlap test is available in the RAPID collision detection package and in FastCar's multi-body package (trial version); FastCar also has code for a number of other intersection.

Pierre Terdiman has code for triangle/box intersection and ray/AABB intersection.

Held has published a paper about ERIT, which deals with a wide range of intersection tests. Source code is available from the author on request.

Fast extraction of the viewing frustum planes from the view matrix is presented by Gribb and Hartmann (this is discussed in the book, but is worth mentioning again here).

Steve Baker has an article on frustum culling and performing sphere/frustum intersection testing.

Miguel Gomez has an article on dynamic collision intersection tests for spheres and boxes. Telemachos has an article on dynamic collision detection and response for ellipsoids and triangles.

Dan Sunday's GeometryAlgorithms.com has some good summaries of algorithms for making bounding containers for various geometric primitives.

Collision Detection

The Physics Simulation Forum has many threads about collision detection and physical simulation. The Bullet Physics Library at this site is a library for performing rigid-body collision detection and response. The reference implementation is open source and free for commercial use, and is integrated with Blender and COLLADA.

GPGPU.org is an excellent site for information on using GPUs for general purpose computation, including collision detection.

One noteworthy announcement has been the introduction of the AGEIA PhysX processor, a dedicated physics action accelerator. NVIDIA announced SLI physics, where physics computations are offloaded to a GPU. Havok, who provide a commercial software collision detection library, plans to support GPU-accelerated physics in their HavokFX product.

The GJK algorithm is a general way to determine the distance between two convex polyhedra; code available. Gino van den Bergen has a book coming out in 2003 devoted to this algorithm.

Stan Melax presents a practical technique (used in MDK2) for using BSP trees for collision detection with a variety of different sized and shaped objects, with little additional memory cost (article's also on Gamasutra).

Jeff Lander has written a good set of articles about polygon collisions (though really more on point in polygon), collision detection using AABB's and separating planes, and collision response. Nick Bobic's article is a good place to go next for more on collision detection techniques. Thatcher Ulrich's loose octrees concept gives a useful data structure for dynamic collision detection, as the structure allows O(1) insertion and deletion of objects. A fuller version of this article is in Game Programming Gems. Ming Lin's paper collection has many articles on collision detection.

A number of free collision detection packages are available on the Web. These include source, and most have limitations on commercial reuse:

Lander and Hecker have pointers to and comments on some commercial collision detection and response packages (a.k.a. physics engines). The article's a little old, but is a good place to start. One not listed is FastCar, for vehicle simulation, which has a free downloadable version.

Chris Hecker has some older introductory articles on rigid body dynamics and collision response. There are many articles on simulating physics for games, etc, as well as books. Older notes from a SIGGRAPH course on physically based modelling are online. Gamasutra also has a number of articles on physics.

Related to collision detection, Qhull implements the Quickhull algorithm for finding convex hulls quickly. The Stony Brook Algorithm Repository has convex hull and other code in its computational geometry section.

Collision detection and response for spheres is discussed by van den Heuvel and Jackson.

Graphics Hardware

Some worthwhile nuts and bolts information on hardware and algorithms can be found on Tomas' Mobile Graphics course site. A good site for game platform architecture is Ars Technica. Their Paedia area has particularly chewy articles.

Why is hardware so fast? Pat Hanrahan has an interesting talk about this subject, and how stream processing figures into it. David Kirk has a nice summary of where hardware is right now and where it's going.

An interesting concept: open source graphics hardware.

Tech Power Up has an up-to-date summary of the clock speed, memory size, and other characteristics for every major PC GPU. Rojakpot goes a step further, with GPU information about peak fill rates, memory bandwidth, and more. They have a similar chart for laptop GPUs. ExtremeTech gives a reasonable summary of how GPUs evolved in 2005 and what to look for in 2006.

For some speculation on what the next generation of graphics hardware holds, see Scott Wasson's article. I disagree with his belief that Pixar-level quality is just around the corner - we need more memory for textures and geometry (say a gigabyte for each - doable in a few years), and much more sampling and filtering per pixel (which will suck up a lot of compute power) to achieve this goal. It's still a good overview of the current state of the art, and discusses a fair bit about the GeForce FX (then NV30) vs. ATI's R300 (i.e. the Radeon 9700).

NVIDIA has gone one step beyond madness for the übergamer: Quad SLI, in which four high-end graphics chips work on the same frame at once. 2 GB on-board memory, 96 pixel pipelines, 5.2 teraflops, and 6-speed F1-derived gearbox (wait, that last one's for the F430 Ferrari).

There are a number of papers at SIGGRAPH 2003 about using the GPU for implementing classical numerical algorithms, such as sparse matrix solvers. Mark Harris has made an extensive research and resources site about using GPUs to rapidly solve non-graphical problems. Their wikified FAQ is particularly helpful. Also see UNC Chapel Hill's page. One of the first commercial products using the GPU for something other than 3D rendering is ATI's Avivo product. Admittedly, this product doesn't wander far from the GPU's original purpose, converting video files to other formats, about five times faster than the CPU can do this operation.

What's Sony's Playstation 3 like technically? Here's a quick summary, and Wikipedia has a fair amount of data on the console. See Ars Technica (and here) for more on this architecture.

Speaking of massively parallel, read about how to use 70 Playstation 2's to make a supercomputer.

Steve Collins has a fascinating look at ancient consoles from a programmer's perspective. There are many sites about old console architectures, including: Videotopia, ICWhen, Planet Irata, Planet Sinclair, Commodore 64. Emulators for many old machines can be found at Classic Gaming.

An article on 3dfx gives a glimpse at what propelled 3D graphics cards to being a consumer product.

Anselmo Lastra's talk of All the Triangles in the World has a clever slide showing how graphics accelerators have outstripped Moore's Law for decades, and how some of the gains have been turned into quality improvements.

Some good tutorials on CPUs, memory, and other hardware elements are available at Ars Technica. There are also some in-depth articles there on the Playstation2's architecture, an interesting beastie. Paul Hsieh has a nice tutorial on graphics accelerators - a bit dated (remember the T-buffer? Fahrenheit?), but still good.

A fascinating piece of market info is provided by Valve: everyone loading new patches of Half-Life from mid-2001 on could respond to a mostly-automatic survey. Over a million people replied. Admittedly, these are perhaps fairly hardcore gamers (though, on the other hand, Half-Life is pretty ancient), but the results are surprising.

One reason little is published about commercial graphics hardware architectures is that there are trade secrets and possible patent infringement involved. The Patent Arcade site tracks patent infringement, copyright infringement, and other videogame related legal issues.

Many of the papers at the Eurographics/SIGGRAPH Graphics Hardware Workshop are available on the web through Tim Rowley's page.

3dlabs is going the route of more GPU programmability with their P10 architecture (a little more info is at 3dlabs' site).

24 bits of color is usually enough, but not always. Here's an image showing concentric bands only one pixel value apart. Matrox's Parhelia graphics accelerator includes the ability to output 10 bits per channel, as does the P10 (also see the Tom's Hardware and Anandtech articles).

Chris Hecker has written extensively on perspective correct texture mapping. An example of the errors caused by not correcting for perspective when texturing can be seen in the spinning head.

Microsoft's plans for using CPU hardware (e.g. 64 bits) is detailed by Alex Pournelle. Also available are Microsoft's graphics hardware requirements for Longhorn and related efforts.

The Xbox's security systems have been cracked, and there's money to be made cracking it further. There is another site dedicated to running Linux on the Xbox. There's even a book about it and some other consoles, and another one on still other consoles.

One case study in the second edition is about the Kyro family of chipsets, based on the PowerVR tiling architecture. Also available is the PowerVR SDK. (The bad news is that they didn't win the war.)

Intel's Extreme Graphics accelerator uses zone graphics to subdivide the screen and so save graphics memory bandwidth.

Z-fighting (where the z-depths match but you want one surface to lie atop another) can be ameliorated with z-biasing. Intel has an article about driver independent methods of doing z-biasing with DirectX.

If you have a hankering to overclock or tweak your graphics accelerator, you could start at Tom's Hardware and Tweaktown.

Immersive Technologies announced the Hyperion system at SIGGRAPH 2001, which is a system that is for computing global illumination solutions at interactive rates (they're aiming it at entertainment, i.e. games). They're trying to do this by using custom hardware, a server with lots of processors, a fast network connection, and patent-pending algorithms that allow faster intersection. Check out the whitepaper for their vision. Researchers at Stanford and the University of Illinois are examing hardware ray tracing by using pixel shaders and texturing.

The Chromium project is exploring cluster rendering systems using a tiled screen approach; there is a SIGGRAPH 2002 paper on the concepts. The Stanford FLASH project is researching hardware for data parallel rendering algorithms.

Intel has a good summary of the PCI Express interface. For hardcore semiconductor news, try the EE Times. The International Technology Roadmap for Semiconductors shows some of the hurdles ahead to maintaining Moore's Law, and where the law may break down.

Roy Latham outlines 12 features he considers important for high-end simulation work in a brief, readable 4 page article.

Paul Hsieh has written a good Web article on triple buffering and related subjects. Michael Bacik discusses handling different color depths and screen sizes in his Run-Time Pixel Format Conversion article.

A fascinating property of LCDs is that subpixel resolution rendering is possible; this is the underlying technology for Microsoft's ClearType.

An article by Joshua Walrath on how many frames per second we can perceive discusses how 60 FPS is still perceptible, but 72 FPS is sufficient (though as the screen size grows, this number needs to increase). There's a related article here.

PowerStrip is a shareware program which provides a huge number of controls over a wide range of graphics cards.

For Mac developers, develop magazine archives are maintained at the MacTech magazine site.

Two new APIs worth note: OpenMAX, which is a cross-platform system for using audio and video streams, and OpenVG, which is for hardware accelerated 2D graphics.

Tom's Hardware has an article on what affects benchmarking tests. Particularly interesting is the increasing effect of memory bandwidth. One of the most popular gaming benchmarks is MadOnion's 3DMark - it also has some fun eye-candy. However, even this benchmark can be manipulated a bit. A good list of benchmark tests for gaming and professional accelerator boards can be found on Major Geeks. Many of the PC accelerator web sites (see below), such as Tom's Hardware, measure the performance of the latest boards. Michael Herf's BltTest code is useful for measuring raw blit speed.

Two software-only solutions for making movies of interactive programs are FRAPS and HyperCam. FRAPS also measures and displays the frame rate of any 3D application.

IHVs and News

PC and console chip manufacturer sites include NVIDIA/nV News/RIVA 3D, ATI Tech/Rage3D, Matrox/Matrox Users Resource Centre, 3Dlabs, Imagination Technologies, as well as a "theoretical" manufacturer, Bitboys.

For pure PC graphics accelerator coverage, try Sharky Extreme, Tom's Hardware Guide, AnandTech, [H]ARD|OCP, HotHardware, Beyond 3D, Tweak3D, Björn's 3D World, ExtremeTech, PlanetHardware, Hardware Central, Gamers Depot, FiringSquad, Deviant PC Forums, 3DGPU, and GamePC, to name too many. To see all sorts of information about your motherboard (including temperatures), try the Motherboard Monitor. For buying graphics cards, I personally prefer newegg.com.

There are also many fine uses for old hardware.

The Future (resources)

On the games front, there is an interesting interview with Tim Sweeney, chief architect of the Unreal Engines, which talks about the near future.

One part of the future is certainly about graphics on handhelds. On the research front, Akenine-Möller and others have begun a page of links to handheld graphics research and resources. He is also a coauthor of "Graphics for the Masses: A Hardware Rasterization Architecture for Mobile Phones", which appears in SIGGRAPH 2003.

There are many sites related to computer games programming (and graphics programming in general), including (in approximate order of usefulness) Game Developer magazine's site and the related Gamasutra site (especially their Programming area, their articles area, their GDC page, and their Game Developer magazine reprint page), GameDev.net (especially their Graphics area), flipcode (especially their tutorials), CFXweb, GIG, and Games++. For even more sites and resources, see the nicely organized Game Development Search Engine. If you just want to see what the best games are, try GameRankings.com.

For general console and computer game news, see Gamespot, GameSpy, Games Domain, PC Gamer, or UGO, among many others. For the latest news and demos of purely 3D games, see 3D Files. Other fun demo/screensaver/eye-candy site include DemoNews. Other 3D gaming news sites include the Adrenaline Vault and Blue's News. The largest collection of demos, patches, trailers, etc, is FilePlanet.

Gamasutra's programming area has a wide variety of easily approachable technical articles on many facets of real-time rendering. The Game Developer magazine code site is an excellent collection of source code and demonstration programs illustrating various techniques. This magazine is free to qualified readers, and is highly recommended. Jeff Landers' site has his code and executables distributed by Game Developer, plus additional notes and screen shots. Programmers Heaven has resources and links to programming information on a wide variety of topics.

The GDAlgorithms mailing list is a superb place for information on interactive computer graphics. Search their archives (also viewable here) for information on all sorts of topics. Flipcode's forums have threads on a wide variety of game development topics, especially graphics, as does GameDev.net and Mr Gamemaker's. A small collection of papers is located at the Graphics Papers site.

There are link collections to the papers from SIGGRAPH 2003, SIGGRAPH 2002, SIGGRAPH 2001, SIGGRAPH 2000, and previous SIGGRAPHs and other conferences. SIGGRAPH's bibliography searcher searches against 13,000 computer graphics articles and books (not just SIGGRAPH publications). All papers from recent Graphics Interface conferences are available for free online. Frédo Durand's site is a good jump-off point for publications, researchers, and other graphics research related topics. The ACM TOG's Resources section has pointers to much other material and research labs. See this page's Bibliography section for more information about where to get articles online. Links to some conferences of interest: numerous SIGGRAPH-affiliated conferences such as SIGGRAPH itself and I3D, Eurographics, and the Game Developers Conference. Some presentations from older GDCs are available at the Gamasutra site (programming specific talks here). The Eurographics Symposium on Rendering is another good source of information. The Game Technology Seminars will be happening again during 2004.

"Game Developer Magazine" has some excellent, approachable articles on interactive computer graphics algorithms. Some of these articles have been reprinted on Gamasutra's site. A free subscription is available to professionals working in the industry. If you're deeply into game industry news, check out GamesIndustry.

To see what games graphics programmers are thinking about, check their plan files. John Carmack of id Software has one of the longest running plan files, which contains much interesting material in it.

Two online news magazines which include material of relevance to real-time rendering are The WAVE Report (searchable from the 3D Links site), and David Duberman's Spectrum Report. Both are worthwhile, and both are free. Computer Graphics World tracks commercial developments in the computer graphics industry in general, though it's easier to just read the magazine.

Gamasutra lists a number games industry employment opportunities. games-match.com tries to match up employers and job seekers.

We discuss using hardware renderers for movie-making. An interesting related phenomenon is Machinima, making movies using real-time rendering engines from 3D shooters to generate or display the frames. See the FAQ for more info. An older, related phenomenon is the Demo Scene; read about it in Gamasutra and check out the demos linked there. Also see the IGDA's DemoScene page for some reasonable information, including their links page. Scene.org is one of the best sites for Demo Scene news and a storehouse for a huge number of demos. Two Headed Squirrel provides commentary and screen shots of many demos, and Pouët and Demoo give nice lists of demos worth seeing. There are even demos on cell phones; Septima uses summed-area tables to do blurs in real-time. Also impressive is .kkrieger, a 96K first person shooter game developed by a demo group.

For an overview of the computational and resource costs of A Bug's Life, see Larry Gritz's talk at the Workshop on Rendering, Perception, and Measurement. Also from this workshop, Anselmo Lastra provided an interesting chart by John Poulton showing how graphics accelerators have been beating Moore's Law over the years.

The results of Stanford's graphics course video game competition for past years are available for download. These are entertaining and educational, and many come with source code.

For a nicely annotated set of graphics related links, see the good-looking textured light-sourced bouncy fun smart and stretchy links page. Many game development links can be found at the Cyber Loonies site. Yet more links here, from Michal Valient. Then go visit this one.

Have you read our book cover to cover? You can test your knowledge with the five questions in this talk.

The highest resolution full-color display device appears to be the IBM's T221, which has a resolution of 3840x2400, and can be driven by a set of processors running in parallel, using Chromium.

The non-profit organization IDGA supports various game development activities.

An open question is what is the primitive of the future: polygons, fragments, voxel splats, or something else? One man's answer: ASCII.

FAQs and Related Sites

The home for the most current graphics FAQs is the Internet FAQ Archives.

There are a number of online glossaries of terms. Apple has a Mac oriented one, and Webopedia a short general one. Schorsch has a glossary of lighting design terms available online.

Usenet news has 2% pure gold, information you cannot find anywhere else. The newsgroup comp.graphics.algorithms is just what it sounds like, and often has interesting threads. Much of the gold has been collected in one spot by Steve Hollasch. The newsgroups comp.games.development.programming.algorithms and comp.games.development.programming.misc have good material about real-time programming. If you have a specific topic in mind, Google Groups is a good way to search Usenet news for it.

OpenGL

The best source for OpenGL information is OpenGL.org. The latest OpenGL specification lives there, among much else. A handy resource is all the OpenGL reference documentation online and hyperlinked (there are a number of variants on this, Microsoft's; search Google on "glGet" for more). The 1.1 (i.e. pretty ancient) version of the entire Red Book is available online.

A good way to learn OpenGL is to use it; Nate Robins's tutorials are an excellent starting place. Another good set of OpenGL tutorials can be found on Neon Helium's site. There's also a short OpenGL Win32 tutorial. Tom Nuydens has many code examples of OpenGL functionality done in Delphi.

The OpenGL Hardware Registry lists the OpenGL capabilities for many different graphics cards. There are also a large number of demos available, showing the use of many different API calls. A list of all OpenGL extensions is maintained at SGI's site. The GLEW library is an open source project which helps with the use of OpenGL extensions. NVIDIA's extensions and a huge amount of other OpenGL related information is available at their site

Mark Kilgard's GLUT (GL Utilities Toolkit) is another good way to try out and experiment with code for many advanced features in OpenGL, and provides a basic platform independent windowing API for OpenGL. There is a FAQ about GLUT. A newer version of GLUT is on SourceForge, called freeglut. GLUI is an interface library built on top of GLUT, for making user interface buttons, checkboxes, arcballs, etc. The Fast Light Toolkit is a GUI toolkit that has GLUT emulation.

For testing the speed of an OpenGL feature, try the isfast and pdb packages.

The author of the OpenGL Superbible has a website with some tidbits on it.

Opengl.org hosts a number of useful OpenGL FAQs. SGI also has an OpenGL FAQ which is of more general interest, talking about the ARB and other non-technical matters. Inactive OpenGL FAQs, but still possibly of interest: the EFnet FAQ, and the extremely ancient newsgroup FAQ.

To see what makes OpenGL tick, take a look at Mesa or SGI's sample implementation. SGI's reference implementation is not meant to be fast, but is useful for understanding what various commands do. SGI's old but fast software OpenGL for Windows is available for download. Mesa's is more practical, and the (poorly named) Utah-GLX project is actively working on drivers for Mesa.

OpenGL continues to evolve, with a 2.0 specification.

SGI's publicly available technical publications are a useful collection of tutorials and articles. This library includes OpenGL on Silicon Graphics Systems, which has chapters on optimization.

The OpenGL newsgroup is comp.graphics.api.opengl. SGI-specific OpenGL questions can be posted to comp.sys.sgi.graphics. An active mailing list for OpenGL game developers is open to all.

OpenGL can be called from a number of languages other than C, such as Java via GL4Java, Perl via POGL or CPAN's Perl-OpenGL, Python via PyOpenGL. The best place for OS support and language binding information is on the OpenGL site. In addition, Sun's Java3D also calls OpenGL or Direct3D, but is more a scene graph and world building interface than a renderer.

Hybrid has released their implementations of OpenGL ES 1.0 and 1.1 for free evaluation and noncommercial use. They also host a forum for mobile graphics.

Subsets of OpenGL have been written for the Palm: miniGL and tinyGL. In related news, Microsoft announced it is adding DirectX capabilities to Windows CE. Microwindows is an open source project to bring MS Windows' API to smaller devices.

Mason Woo has an errata site for the OpenGL Programming Guide. Code examples from this book and other OpenGL related documents and executables are also available. Druid's GL Journal has a number of interesting articles and links for OpenGL. A tutorial on OpenGL texture objects is available from Gamasutra's site.

Glean is a free OpenGL conformance test suite. GLSetup detects the graphics card and installs the matching OpenGL drivers (though this site hasn't been updated for almost a year, so...).

A large number of IHVs has announced the formation of the Khronos Group SIG to develop OpenML, an API for integrating OpenGL graphics with video and audio.

XGL is meant for representing scenes by using an XML format that maps easily to OpenGL calls.

For porting to the Mac, MacDx takes your DirectX calls and converts them to OpenGL.

To convert OpenGL calls into vector-based Postscript, use GL2PS.

Here's a resource guide for OpenGL on the Mac. There is also a games developers' mailing list for the Mac.

Available on the web is a succinct summary of Direct3D and OpenGL and the differences between the two. For a brief (and biased) history of OpenGL and the API wars, see Microsoft and 3D Graphics. Conflict continues, with Microsoft claiming patents on vertex and pixel shading, so putting OpenGL 2.0's future in doubt.

DirectX

Microsoft maintains DirectX sites for developers and for users. DirectX 10 is the newest release available. Extensive DirectX documentation is online. The newsgroups to read are microsoft.public.win32.programmer.directx and microsoft.public.directx. The DirectX Dev mailing list is another useful resource, and you can search the archives.

NVIDIA and ATI each have a large number of presentations about using DirectX.

Some detailed DirectX reference posters are available for download.

Linear Algebra

Also see the Transforms section.

Dan Sunday has an introductory guide to linear algebra available from his (quite useful) Geometry Algorithms site.

Eric Weisstein's World of Mathematics is an incredible resource for mathematical definitions, hopefully back on the web for good.

Paul Bourke's geometry page describes a number of common geometric operations (scroll to the bottom).

Macsyma is free at last. It's now called Maxima. Macsyma is an symbolic computation program, like Mathematica and Maple: you define equations and can easily combine them, integrate, take the derivative, etc. Maxima is GNU source now, and free is cheaper than the $1495 price for Mathematica.

You can find a small collection of math related term definitions at Cut the Knot. All sorts of mathematically related links can be found at the Math Atlas site. Historical roots of mathematical terms can be found at the Math Word site.

The Exploratory has a few tutorial applets related to linear algebra and transforms. These applets are good for building an intuition and understanding of various topics. There is a nice applet for visualizing the dot product.

Trigonometry

Trig formulas, tables, and other mathematical reference material can be found at Dave's Math Tables.

Bibliography

Frédo Durand's page has links to researchers, labs, conferences, and publications. Karim Ratib's page (look under Applications/Computer Graphics) has lists and links to many journal articles available online (see his Publications subdirectory). IEEE Computer Graphics and Applications has issues from 1995 to the present available online to members. The ACM Digital Library is a paid service offering ACM proceedings and journals electronically, back to the 1980's; it is searchable for free by anyone. A yearly subscription is available (a particular bargain for students) or articles can be purchased individually. The site can also be searched and browsed by non-subscribers. Some presentations from GDC are available at the Gamasutra site. These contain some fascinating bits of information not available elsewhere.

WPI's "Advanced Topics in Computer Graphics" page has some interesting material. Under "Presentation Summaries" there are many paper summaries on a wide variety of rendering related topics.

SIGGRAPH's Bibliography Database Search is focused on computer graphics references. A general computer science reference search engine has references to many other computer graphics and computer science related sources. CiteSeer is a useful article searcher, showing both articles and letting you know what articles cite a given article. In the same vein, Google Scholar lets you search research articles. GraphicsPapers searches for paper titles and gives likely URLs for their location - nice for if Google fails you.

TOG logo Thanks to ACM TOG for providing a home for these web pages.

- A site counter thingy. Click it to see page visits, etc.


webslaves: Eric Haines / erich@acm.org
Tomas Akenine-Möller / tompa@acm.org

Last changed: November 18, 2007