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.
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:
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.
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:
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.
Lacroix has an article about modern dynamic lighting on the GPU.
Visual Appearance
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Thanks to ACM TOG for providing a home
for these web pages.
- A site counter thingy. Click it to see page visits, etc.
Curves and Curved Surfaces
Intersection Testing
We created a 3D Object Intersection
page, giving references and pointers to code for a wide variety of object/object
intersection tests.
Collision Detection
Graphics Hardware
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.
The Future (resources)
FAQs and Related Sites
OpenGL
DirectX
Linear Algebra
Also see the Transforms section.
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.
Last changed: November 18, 2007