Real-Time Rendering Resources

This is the main resources page for the book Real-Time Rendering (Kindle Edition) (Google eBook), by Tomas Akenine-Möller, Eric Haines, and Naty Hoffman, 1045 pages, from A.K. Peters Ltd., 3rd edition, ISBN 978-1-56881-424-7, 2008, list price $89. BibTeX entry.

  3rd ed. cover image

Look inside, read the first three chapters, sample other chapters, or order it from Amazon or Google eBooks. The whole book is available on Books24x7 to subscribers. More information about the book's contents can be found here.

Other pages and resources hosted here:

Introduction and Overview

The rest of this page is dedicated to providing information related to the book's contents: new techniques, worthwhile websites, etc. After coverage of books and graphics APIs, the page is organized into categories based on the book. We also have a portal page that is an extremely condensed set of some of the best links available; we won't repeat these here (much). We have also trimmed out many links from this page; see the old Second Edition page if you want to look through older, possibly dead links.

What follows are categories for resources. All information is included on this single page, for ease of searching.

Books Online

See our graphics book list for upcoming, recent, and recommended books.

What follows are books that are FREE ONLINE, ordered by publication date. Do not be fooled by the price; all but two were published as physical books and each has valuable information.

cover download for free Learning Modern 3D Graphics Programming, by Jason L. McKesson, 2012, read for free, download for free.
cover download for free Computer Vision: Algorithms and Applications, by Richard Szeliski, Springer, Nov. 2010, download for free.
cover iPhone 3D Programming: Developing Graphical Applications with OpenGL ES, Philip Rideout, O'Reilly Media, May 2010, read for free. The focus is more on OpenGL ES, which is all to the good.
cover read for free Programming Vertex, Geometry, and Pixel Shaders, Second Edition, by Wolfgang Engel, Jack Hoxley, Ralf Kornmann, Niko Suni, and Jason Zink, December 2008 (no publisher), read for free. An uneven draft of a book, but extremely valuable in places. I particularly like the lighting chapter by Jack Hoxley, which gives detailed explanations of various lighting models along with working shader code.
cover GPU Gems 3, edited by Hubert Nguyen, August 2007, read for free. NVIDIA's munificence is what I assume is behind this excellent book being free.
cover read for free GPU Gems 2: Techniques for Graphics and Compute Intensive Programming, edited by Matt Pharr, March 2005, read for free. Another gift from NVIDIA; a wonderful book.
cover read for free GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics, edited by Randima Fernando, March 2004, read for free. Likewise, worthwhile and great that it's free.
cover download for free ShaderX2: Shader Programming Tips and Tricks with DirectX 9.0, edited by Wolfgang Engel, Nov. 2003, download for free, also free code download and notes. I particularly like the articles that Marwan Ansari coauthored.
cover download for free ShaderX2: Introductions and Tutorials with DirectX 9.0, edited by Wolfgang Engel, Nov. 2003, download for free, also free code download and notes. Notable are the fog article and the 82-page article on shadow volumes.
cover read for free The Cg Tutorial, by Randy Fernando and Mark J. Kilgard, March 2003, read for free.
cover download for free Direct3D ShaderX: Vertex and Pixel Shader Tips and Tricks, edited by Wolfgang Engel, June 2002, download for free, also free code download and notes.
cover read for free Michael Abrash's Graphics Programming Black Book, by Michael Abrash, July 1997, read for free. Ancient, yes, but there are still articles of general interest, and Abrash is a fine story-teller.
cover download for free Principles of Digital Image Synthesis, by Andrew S. Glassner, Morgan Kaufmann, 1995: download for free. An incredible book, and physics doesn't change (much), so despite the age this book is full of useful information.
cover download for free Simulating Humans: Computer Graphics Animation and Control, by Norman I. Badler, Cary B. Phillips, Bonnie Lynn Webber, Oxford University Press, 1993: download for free. All about the human figure and how to model it in the computer. Old, but chock full of information.

Note that the ShaderX Books page gives links to various portions of these books that are available online. Excerpts of a number of graphics books are also available on Google books, including our book's third edition.

DirectX

Microsoft owns DirectX. Download the DirectX SDK for documentation and a large set of demos with sample code. Microsoft also provides many articles relevant to using DirectX effectively. Related to DirectX, XNA is for the XBox 360, for both hobbyists and professionals.

The newsgroups to read are microsoft.public.win32.programmer.directx.graphics and microsoft.public.win32.programmer.directx.graphics.shaders.

Microsoft's DirectX blog provides news and useful information about related Windows technologies. Microsoft's Gamefest has its presentations on the web (also look here).

NVIDIA and AMD/ATI each have a large number of presentations about using DirectX. AMD's DirectX samples are on a separate page, and NVIDIA's are categorized by DirectX 9 and DirectX 10.

Tom Forsyth's little FAQ on DirectX is more about performance than usage, but can still be helpful.

A DirectX 9.0 reference poster is useful for getting a detailed overview of the pipeline in one figure. Elements of a similar flowchart for DirectX 11's pipeline are provided and explained by Jack Hoxley.

There are some simple code examples for DirectX 9.0 and OpenGL at CodeSampler.com. More involved samples are at Humus-3D. Ziggyware provides XNA tutorials and tools for XBox 360 programming.

Chris Dragan maintains a Direct3D and OpenGL extension capabilities database.

OpenGL

The best source for OpenGL information is OpenGL.org. The latest OpenGL specification lives there, as well as a 3rd party OpenGL SDK. A handy resource is Microsoft's online documentation. You can search Google on "glGet" for more. An old version of the Red Book is available online.

OpenGL's history is covered well on Wikipedia.

A good way to learn OpenGL is to use it; Nate Robins's tutorials are an excellent starting place. TyphoonLabs has some tutorial chapters on OpenGL and OpenGL ES, as well as code samples. Another good set of OpenGL tutorials can be found on Neon Helium's site. More involved samples are at Humus-3D. There's also a short OpenGL Win32 tutorial. One more: an introductory GLSL tutorial.

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 OpenGL.org. GLee is an free tool for managing use of extensions. The GLEW library is an open source project which helps with the use of OpenGL extensions. Simon Green explains the useful FrameBuffer Object extension for rendering to texture. NVIDIA's extensions and a huge amount of other OpenGL related information is available at their site. AMD/ATI also has some OpenGL samples.

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. See this GLUT Tutorial. A newer version of GLUT is on SourceForge, called freeglut. There are a number of other toolkits available. For example, 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.

The authors of the OpenGL Superbible have a website with source code from the book.

Opengl.org hosts a number of useful OpenGL FAQs. SGI also has an OpenGL FAQ which is more concerned with governance, talking about the ARB and other non-technical matters.

To see what makes OpenGL tick, take a look at Mesa or SGI's sample implementation.

The OpenGL newsgroup is comp.graphics.api.opengl. An old mailing list for OpenGL game developers can be worth a search.

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. In addition, Sun's Java3D also calls OpenGL or Direct3D, but is more a scene graph and world building interface than a renderer.

OpenGL ES is the standard way to use OpenGL on smaller devices. AMD provides an emulator. Oolong is a free engine for iPhone/iPod that uses OpenGL ES 1.1. Subsets of OpenGL have even been written for the Palm: miniGL and tinyGL.

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

OpenGL is well-supported on Vista, contrary to some rumors.

For porting to the Mac, MacDx takes your DirectX calls and converts them to OpenGL. Here's a resource guide for OpenGL on the Mac. There is also a games developers' mailing list for the Mac.

The Graphics Rendering Pipeline

This DirectX 9.0 reference poster is good for getting an in-depth visual overview of a typical pipeline.

Alexey Busygin tracks a wide range of current 3D engines, as does GarageGames.

Doom is the 3D killer app for system administration. Source code for Quakes I through III is available for download under GPL. The ioquake3 site builds upon Quake 3, adding a huge number of improvements (even ray tracing). There are also ports of DOOM to a huge number of platforms, and Wolfenstein is on the iPhone. Arcade emulators such as MAME allow you to port classic games to most any platform, including your digital camera.

Sourceforge has any number of renderers. The portable G3D C++ library gives many tools for vector/quaternion/matrix math, collision detection, shader programming, and other common graphics tasks. The Oolong engine is for iPhone graphics support. GarageGames' Torque engine is an extremely inexpensive game engine. Other commercial engines include: Unreal engine (very popular), CryEngine 2, Gamebryo, and Quake. Find a good table of engines on Wikipedia. Jon Jordan gives a thorough rundown of commercial engines. Mark DeLoura presents survey results for engines used by professional developers.

Open Scene Graph and SGL are both free, open source scene graph systems. Irrlicht, OGRE, and sauerbraten are open source 3D games engines with some popularity. The well-known (though unchanged since 2003) Open Inventor scene graph system is now open source. 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.

An excellent article on pure CPU-side rendering, with its tricks and pitfalls, is presented by Charles Bloom. SwiftShader is a product that does DirectX 9.0 rendering on the CPU.

Of course, one of the best game engines is Excel.

The Graphics Processing Unit

AMD's RenderMonkey toolset provides shader development tools. The toolset allows compilation and previewing of shaders, and comes with a large number of sample shaders. NVIDIA's FX Composer 2 is a similar worthwhile program; we use a number of screenshots from it in our book. The Humus 3D site has some excellent sample programs that show advanced techniques.

NVIDIA's Cg programming language is one higher level solution for programming vertex and pixel shaders for OpenGL and DirectX (and it runs on other vendors' GPUs just fine). The Cg Tutorial book is a well-written guide to this language, now free and online. This compiler has been open sourced.

The 3D Shaders site is the online part of the OpenGL Shading Language book. There's source code, shaders, errata, and useful links here. For further inspiration on shaders, visit the Renderman.org site.

The University of Waterloo has developed Sh, a metaprogramming language for GPU programming. A nuts-and-bolts description of their Sh system is on Gamasutra.

Eric wrote "An Introductory Tour of Interactive Rendering", from IEEE CG&A, Jan/Feb 2006. This is handy for giving to people who want just a taste of what the modern GPU is about.

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

Transforms

The Exploratory has a number of tutorial applets related to linear algebra and transforms. CGEMS is another collection with useful instructional material in a variety of areas. Wolfire's blog has a very basic two-part tutorial on linear algebra, here and here.

Nick Bobick has a nice article on quaternion rotation and interpolation, including code snippets. Dave Eberly's site has useful papers and code on a wide variety of geometric operations, including quaternion interpolation. Code for rotating from one vector to another rapidly using quaternions (as described in our book) is available online from Tomas.

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

Animats has a C++ version of the speedy and useful Doué's Graphics Gems vector manipulation classes (another way to manipulate vectors is Hollasch's vector macros). The Portable Game Library includes code for a Simple Geometry library.

Intel has an article on the advantages of CPU-side skinning.

Dual quaternion skinning offers improved quality at relatively little additional cost. A free Maya plugin is available.

The Graphics Gems book series contains a number of articles on transformations, with code online.

As we touch upon in our book, moving 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 with a little calculator to explore the effect.

Visual Appearance

HyperGraph covers the basics on many topics within computer graphics. The Exploratory has applets that teach about lighting models and signal processing, among other topics. CGEMS has a full tutorial for classroom use on writing shaders.

Eric Chan has a piece of code and a description of a technique for drawing antialiased lines and edges with the GPU.

Scott R. Nelson's antialiased line code is available for download. Here is a comparison generated using his program of lines 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).

24 bits of color is usually enough, but not always. Here's an image showing concentric bands only one pixel intensity value apart. Most monitors will show some banding somewhere on the image.

Storing semitransparent textures so that the colors are premultiplied by the alphas makes compositing and blending operations much faster to compute. Tom Forsyth gives a rundown of the math and formats involved.

Transparency is difficult to perform correctly in a single pass when using a Z-buffer. Steve Baker gives a good summary of the basics of the problem and traditional solutions. NVIDIA's developer site and the Humus 3D site each have sample code for using stencil routing to provide order-independent transparency.

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. Robert Berger also provides test images and has a succinct overview of the subject.

Font antialiasing via sub-pixel LCD rendering is dealt with in depth on the Anti-Grain Geometry site. Experiments in antialiasing geometry via texturing are described on this page.

The nHancer utility pages include a clever way to visually compare antialiasing schemes and anisotropic filtering.

Texturing

Extremetech made an interesting side-by-side comparison of filtering techniques used by ATI and NVIDIA. They also have an article on antialiasing and anisotropic filtering of textures.

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. The book based on these notes is much updated.

Gamasutra has a old but informative article on the theory behind mipmapping.

S3TC texture compression has become a standard part of DirectX, renamed DXTn texture compression. A free manipulation and compression library is available for manipulating DXTn (DDS) format textures (the package also converts heightfields to normal maps). Source code is available. The Unreal developer network has an excellent article on DXTC compression and quality comparison. 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.

The PSU near-regular texture database is a useful research repository for textures with repeating patterns. The USC-SIPI Image Database has many classic images (Lena, Mandrill) and other texture samples for research. For free stock images, check stock.xchng.

Humus has some textures available for experimentation.

Eric Lengyel provides a concise presentation of how to compute tangent space basis vectors.

We mention this overview in the book, and it's worth another mention here: a thorough survey of displacement mapping techniques.

Just because a paper is old does not mean it's dated. 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.

ATI has a program called MeshMapper which generates normal, displacement, and ambient occlusion maps from a low and high resolution model.

Manuel M. Oliveira's page on relief mapping has his related papers, videos, and demos.

Megatexturing is something id has been promoting, but with little technical description. An implementation that appears similar is now available.

Advanced 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 a set of interactive tutorials on color perception, using Java applets to illustrate various concepts. One favorite is that for metamers, showing how various spectra convert to RGB colors.

Poynton's color space FAQ contains much solid information on the topic. The CVRL website has a huge amount of easily downloadable primary research data relating to color. A chromaticity diagram applet from the RIT Introduction to Color page made the image used in the book. There are numerous other webpages on colorimetry and related topics, such as this overview, this on chromaticity diagrams, and rod and cone information.

Color spectra data for real objects is available for download.

Bruce Lindbloom's site summarizes color conversion equations, and includes a table for converting between the popular color spaces (see his "Math" link). There are some useful notes on correct and efficient conversion between RGB and YUV color spaces. Interestingly, the chromaticity function is not a simple triangle, as it is usually shown.

BRDF data is available from Cornell and Columbia-Utrecht Universities. FreeSnell has the refractive indices and coefficients of extinction for many materials, as well as a thin-film simulator.

Some interesting presentations from a GDC 2008 tutorial presentation on advanced shading are available.

Crytek's site has a number of papers explaining many of their algorithms, such as deferred lighting.

Area and Environmental Lighting

This detailed article gives a great tour of the lighting effects for the game Resistance: Fall of Man. The use of mouse-over to flip between screenshots is particularly instructive.

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.

Humus has a large set of cube maps available for experimentation.

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

Global Illumination

Meshula.net has a good summary article on screen-space ambient occlusion techniques, with nice example images. The implementer of SSAO for the game Crysis gives some guidance on implementing their scheme. Starcraft 2 uses SSAO; Aras' blog discusses blurring to get rid of noise in SSAO images. Another approach is detailed by Iñigo Quilez.

Masaki Kawase has a demo (including source) of projective texturing, indexed shadow mapping using an alpha priority buffer, reflection, anisotropic filtering, and other effects. Quite ancient, but nicely done.

NVIDIA has kindly made a shadows page with all their shadow samples and white papers.

The OpenSG project has a very nice summary page by Nico Hempe showing different soft shadow algorithms and how they perform. Andrew Lauritzen gives some further details on variant schemes for variance shadow maps, along with a demo. Find a parallel-split shadow maps (aka cascading shadow maps) demo here. Xavier Decoret has a list of interactive shadowing research articles up to 2006.

To see the original soft reflection and transparency images by Paul Diefenbach, visit his site.

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

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

Some very nice examples of caustics mapping can be found on the U. of Central Florida site. A pleasant visualization of how the coffee-cup caustic is formed is available.

A gallery of game screenshots shows the evolution of how water is rendered in games.

The video at Geomerics shows their package performing dynamic indirect lighting.

Realistic skin shading with subsurface scattering at interactive rates is a continuing area of research. J.I. Styles provides his HLSL shaders for this task. Daniel Pohl is doing some nice work with taking real applications (i.e., games) and converting them to ray tracing. See his site for more information. John Carmack has his own take, noting that ray tracing efforts have mostly been catch-up oriented; he proposes his own "sparse voxel octree" structure (more on that someday, we hope).

For current interactive ray tracing research, a good starting spot are the paper listings for the IEEE/EG Symposium on Interactive Ray Tracing and on High Performance Graphics. Arauna and OpenRT are two well-known interactive ray tracers available to researchers. There is an active research forum on the topic of real-time ray tracing.

Baking the results of precomputed global illumination algorithms is a common solution. Illuminate Labs has a nice gallery of images from games where their baking software is used.

Image-Based Effects

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. One cool thing is a panorama video, which you can control as it plays.

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; we use one of Mark's images in our book. Niniane Wang's clouds page is also worth a look.

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

This summary page of filter functions is useful.

Kyle Schouviller explains the math used in Photoshop blend modes, Nathan gives more of these functions, Nico provides GLSL shaders.

High dynamic range environment map image data is available at Paul Debevec'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. The HDR Labs site provides free high-resolution sIBL-format environments, a new one each month. 360 Cities also has panoramas. Michael Herf has Photoshop plugins for more artistic blurs and Fresnel effects. Masaki Kawase has a classic demo showing HDR lighting, glare, depth of field, motion blur, Fresnel effects, and more; we use a screenshot in our book. HDR is covered in the DirectX SDK, among other places, but here's one more article.

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.

HDR, motion blur, fur rendering, collision detection, and much else is discussed for the game Shadow of the Colossus. McTaggart describes HDR-related effects in Valve's Source engine, with many instructive images. Depth-of-field and motion blur techniques for the game Lost Planet are discussed on meshula.net, as well as fur rendering (explained further in our book). There's more from Beyond3D here and here.

An entire (short) book on image-based rendering is available for limited preview on Google Books.

For volume rendering software, look at the ACM TOG software page for some leads. One programmer has gone so far as to represent entire scenes with opaque voxels, ray-casting with CUDA to render. If you want to know just a bit about volume rendering, Kyle Hayward's 101 and 102 tutorials are worth a look.

Non-Photorealistic Rendering

A list of non-photorealistic rendering (NPR) articles to the beginning of 2007 was created by Stefan Schlechtweg. A somewhat dated but excellent NPR resources page has been put together by Craig Reynolds. Amy and Bruce Gooch have an NPR page that's also somewhat old, but the BibTex entries are handy, and many have the abstracts.

Even gibbets can be stylized, see NPRQuake.

Polygonal Techniques

The Brown Mesh Set is a large collection of 1,139 models, extremely useful for research. The Stanford 3D Scanning Repository contains the famous bunny model, happy buddha, dragon, armadillo, and other dense polygonal meshes. The Power Plant model is a 13 million triangle model that has been used extensively as a benchmark.

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 book Computational Geometry in C, but it is mostly for educational purposes. OpenGL can do your tessellation for you. 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.

MeshLab is an open source system for manipulating meshes. It has a huge number of meshing operations available. The Meshlab blog has worthwhile articles, including a rundown of experiments performed comparing three different vertex normal computation techniques.

John Ratcliff's Code Suppository is an attic full of interesting code bits: mesh importer, convex hull, clipper, frustum culler, vector template, utility math code, and that's just the first few items. Follow his blog for updates.

For file format information, start at Wotsit's Format or the Graphics File Format Page; for CAD files see the CADCAM Information Center. COLLADA 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 Turbo Squid. 3dvia also has a large number of free models, as does Google's 3D warehouse.

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.

Some excellent examples of LOD popping in games are available; move your mouse in and out of each image to see the effect.

There are a number of papers summarizing simplification research to date. Luebke's is a good one, and there are also (older) 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.

Garland's QSlim is one of the fastest algorithms for simplification. Mark Duchaineau's free LibGen has simplification code buried in it (see the "surf" library and "surftools" commands). 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.

Brad Grantham has code available for stripification, which has gone through a few iterations of improvement. Martin Isenburg has done research on compressed transmission of mesh data along with stripification information.

The Virtual Terrain Project has a huge amount of useful information about terrain storage and rendering, large terrain datasets, as well as source code. Development on ROAM 2 shows how this algorithm has evolved with the GPU.

For more on clipmapping beyond the Hoppe papers, see Grafenstein's description.

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. Nils Pipenbrinck has a useful tutorial on Hermites, especially on how to use them for path control in animation. Using Google, you can find any number of course notes about the mathematics of curves, such as Ching-Kuang Shene's.

Brian Sharp has two excellent introductory articles on subdivision surfaces: one on the theory, another on implementation. 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. The NYU MRL site has a subdivision surfaces page with many resources and links.

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

We do not cover NURBS in our book, but these are important in CAD. Dean Macri has an article on using NURBS in real-time applications at Gamasutra's site and a longer version on Intel's site. Vincent Prat also has a tutorial on NURBS and trimming, along with sample source code. The source code for the book An Introduction to NURBS is available online. There is a Sourceforge NURBS manipulation library.

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

Acceleration Algorithms

The book Level of Detail for 3D Graphics covers many aspects of level of detail algorithms in depth. This book has a companion web site.

Some applets for visualizing spatial indexing schemes are available on the web.

Michael Abrash's ancient Graphics Programming Black Book is free on the web. If you want to know about practical polygon-plane based BSP splitting, this is where to start (chapter 59 on). Michael has additional quake notes available.

Scaling algorithms for use on different processors and GPUs is important for PC applications. An article on how Crysis scales among its various quality settings gives screenshots showing scaling of many different effects.

Vincent Scheib describes how to implement a display list system for DirectX 9 and 10, a technique that can provide large performance gains on multicore systems.

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

Microsoft's PIX is pretty easy to use for poking at an application (though limited; I'm looking forward to NVIDIA's NEXUS). Microsoft's tutorials are good, here's an outsider's view.

NVIDIA provides PerfKit, PerfGraph, and other related tools; AMD/ATI provides PerfStudio, ShaderAnalyzer, and many other tools. 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.

Intel's VTune is a well-known CPU-side inner loop optimization tool. For Linux, Valgrind is a popular suite of profiler and debugging tools. AQTime is one of the better general code profilers available; a listing of other profilers is available. Boost provides optimized (in most cases) libraries for common data structures.

NVIDIA's GPU Performance Guide has useful methods of improving efficiency.

Tom Forsyth's little FAQ on DirectX is primarily concerned with performance tips.

An article on modernizing the Quake 2 renderer shows how optimization has changed over the intervening years, with the emphasis being on avoiding small batches and sorting on state. Tom Forsyth gives his view on renderstate change costs.

Christer Ericson discusses how to order draw calls around for efficiency and how to optimize particle systems.

Noel Llopis explains the basics of data alignment and what to know to improve efficiency.

Concurrency now needs to be designed into rendering systems from the start. Herb Sutter's article is a good start as to why this is now so. One tool for programming in parallel is Intel's Threading Building Blocks. Nick Evanson analyzes multicore use by various games, and explains how to use the performance monitor to do such testing. Wei-Mei Hwu and David Kirk gave a course on programming massively parallel processors that is chocked-full of relevant data, as well as hardware implementation information. In particular, see the lectures page.

Michael Abrash has a series of articles (first, second, third) on optimizing a pure-CPU rasterizer. Admittedly a rare beast nowadays, but these articles has worthwhile lessons to impart about the optimization process in general.

Intersection Testing

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

Dan Sunday's GeometryAlgorithms.com (defunct, but archived) has some good summaries of algorithms for making bounding containers for various geometric primitives. John Ratcliff has a best-fit bounding volume library available (among much else).

Fast extraction of the viewing frustum planes from the view matrix is presented by Gribb and Hartmann (this topic is discussed in our book; more details are given in this article).

Collision Detection

The Physics Simulation Forum has many threads about collision detection and physical simulation.

GPGPU.org is an excellent site for information on using GPUs for general purpose computation, including collision detection. Dominik Göddeke has a set of tutorials on GPGPU, CUDA, and OpenCL.

One related hardware product is NVIDIA's PhysX processor (they purchased Ageia), a dedicated physics action accelerator.

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

  • Collision Detection Packages from UNC Chapel Hill (this is an extensive, ever-growing collection).
  • Bullet Physics Library - library for performing rigid-body collision detection and response. Open source and free for commercial use, and is integrated with Blender and COLLADA. video
  • SOLID - Software Library for Interference Detection. Now a commercial product, and GPL'ed with source available.
  • V-clip - a low level object collision library.
  • OPCODE - more memory-friendly and often faster than SOLID and RAPID, free for reuse in any application.
  • ODE - a free rigid body dynamics package which includes collision detection.
  • ColDet - a free collision detection library for generic polyhedra.
  • Havok - the most popular commercial library for games is free for non-commercial use.

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.

As a simple introduction, Collision detection and response for spheres is discussed by van den Heuvel and Jackson.

Fun collision stuff: Rube Goldberg machine (there are tons of similar videos out there), and 3000 barrels falling, exploding, etc..

Graphics Hardware

Wikipedia has some excellent articles on hardware-related topics, such as this one on color depth.

Humus gives a rundown of the various ways of computing and storing z-depths.

Valve's Steam hardware survey tracks what is used by their subscribers; incredibly valuable for knowing what is out there.

3D display technology is coming down in price, e.g. Zalman's 3D monitor is under $1000, with 3D driver support from NVIDIA.

Tech Power Up has an up-to-date summary of the clock speed, memory size, and other characteristics for every major consumer PC GPU. Tech ARP has similar charts for professional-grade GPUs.

The Accelenation site has an excellent history of the early years (1995-2002) of consumer graphics cards. Maximum PC has an extensive visual history of the GPU boards from 1995 on. For a general history of computer graphics, see Wayne Carlson's site.

Some worthwhile nuts and bolts information on hardware and algorithms can be found on Tomas' Mobile Graphics course site. Ars Technica sometimes covers GPU architectures. Their Paedia area is a good place to start.

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. Of course, knowingly violating patents causes triple damages, so you've been warned.

24 bits of color is usually enough, but not always. Here's an image showing concentric bands only one pixel value apart. On most displays some area of the image will exhibit banding.

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.

Some reverse engineering has been done on the G80 to see what really happens with various processing units. Not surprisingly, if you do pathological rendering, parallelism is destroyed.

For more on the Xbox 360's architecture, see this and this article.

One architecture we wanted to cover in the book but the timing did not work out was Intel's Larrabee. See the wikipedia page to track this graphics accelerator, and see this article for Intel's SIGGRAPH 2008 paper.

An excellent resource on graphics hardware architectures is the course notes for the Beyond Programmable Shaders course at SIGGRAPH, especially Kayvon Fatahalian's overview. The related blog Gates 381 is also valuable.

NVIDIA's SLI FAQ page gives some information on this technology and links to other related pages.

One popular gaming benchmark is Futuremark's 3DMark - it also has some fun eye-candy. However, even benchmarks can be manipulated a bit.

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.

There are many little utilities for checking various hardware capabilities, mostly for overclocking but also just educational to examine. GPU-Z displays the GPU's capabilities and monitors temperatures and voltages of various components. FurMark is an OpenGL stress test. GPU Caps Viewer also provides hardware information, including CUDA capabilities.

Steve Collins has a fascinating look at ancient consoles from a programmer's perspective. Emulators for many old machines can be found at the Emulator Zone. There are also many fine uses for old hardware.

The Future (resources)

The GDAlgorithms mailing list is a superb place for information on interactive computer graphics. Search their archives for information on all sorts of topics. Some of the better computer games programming sites are GameDev.net (especially their Graphics area), Gamasutra (especially their Programming area), and Game Developer magazine's site (including their code archive). An older article collection with some gems is at flipcode. If you're deeply into game industry news, check out GamesIndustry.

The Game Developers Conference (GDC) maintains an extensive archive of previous years' lectures.

The newsgroup comp.graphics.algorithms is just what it sounds like, and often has interesting threads. 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. Steve Hollasch has distilled much of the combined knowledge of the early USENET graphics community.

Time for a picture of Pixar's renderfarm.

Scene.org is all about the Demo Scene, where people make small programs chock-full of special effects. Pouët lists popular demos worth seeing; to avoid running code, you can cheat and watch most of these on YouTube.

Machinima is the practice of making movies using real-time rendering engines from 3D shooters or other games to generate or display the frames.

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.

Various game developer sites have collections of research papers, such as Insomniac Games, Valve, and Sony Computer Entertainment America. Also worth noting is Crysis-Online, which once in a great while will mention technology talks.

Where are game development offices? Here.

For general console and computer game news, see Gamespot, 1UP, IGN, GameSpy, Games Radar, or UGO, among many others. If you just want to see what the best games are, try Metacritic or GameRankings.com. VG Chartz tracks console and handheld sales along with game sales. The largest collection of demos, patches, trailers, etc, is FilePlanet; if you don't like to wait in line, NVIDIA's game demos page is useful.

Last mention: don't forget our portal for a list of some of the best resources.

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

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

Linear Algebra

Flipcode has a 3D geometry primer online.

Eric Weisstein's World of Mathematics is an incredible resource for (sometimes dense) mathematical definitions. You can find a collection of math-related definitions at Cut the Knot. Historical roots of mathematical terms can be found at the Math Word site.

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.

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.

Christer Ericson has a nice presentation on the scalar triple product, a way to compare the orientation of one line compared to another. He also has a followup article.

Trigonometry

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

Bibliography

There are wonderful link collections to the papers from SIGGRAPH and many other related conferences. SIGGRAPH's bibliography searcher searches against 21,000 computer graphics articles and books (not just SIGGRAPH publications). Frédo Durand's site is a good jump-off point for publications, researchers, and other graphics research related topics. IntroGameDev and AI Wisdom are excellent guides to articles in Gamasutra, Game Developer, and all the major book series (GPU Gems, Game Programming Gems, and ShaderX). IntroGameDev is more comprehensive, but AI Wisdom includes abstracts and other information.

Google Scholar is invaluable for finding specific research articles. CiteSeer can also be useful, as can the Collection of Computer Science Bibliographies.

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. IEEE Computer Graphics and Applications has issues from 1995 to the present available online to members. Similar sites exist for other publications.