Real-time Depth of Field (quick and dirty)

Jon Watte 2003-01-26
hplus-gl at mindcontrol dot org

Project, source and executable for Windows XP using glut32. Project builds with MSVC version 7; might be possible to port to other versions and other platforms, but I haven't done so. Please excuse the fragmented code; this is slashed out of a separate test projects of mine.

Download zip file (about a megabyte)

Your OpenGL implementation needs to support GENERATE_MIPMAP and TEXTURE_LOD_BIAS to work correctly. Else you'll probably get asserts, although you can probably take these out and get "something" on the screen.

This code uses only vanilla OpenGL; it does not require any fancy vendor-specific extensions, nor the ARB_fragment_shader extension. That's basically the positive: the negative is that it looks awful (hey, it's using vanilla OGL and is easy to understand; you can't have it all in the same project).

Using GENERATE_MIPMAP, TEXTURE_LOD_BIAS and CopyTexSubImage to render depth of field in two passes. First, render the scene smaller to generate the "blurred" image, and put a function of distance-from-camera in the alpha channel. Second, apply this texture in DECAL mode using projective texturing that maps the screen projection onto geometry; this is done with TexGen in EYE_LINEAR space.

This technique is very dependent on the quality of your MIP map generation, and the size of the blur texture you choose to use.

To run the sample: in a command-line window, change to the directory where the .exe lives, and start it with dof.exe. Move left/right and front/back with arrow keys. Toggle blurring with the "b" key. Quit with Escape. WARNING: You'll need to be in 32-bit mode for this to work correctly.

If you start with "-w" it will run in windowed mode.

There are alternate ways of doing depth blur. For example, you can treat the entire screen as a texture, either using multiple render targets, or using rectangular textures. You can read the depth buffer and invert to figure out depth position, and do a sampling based on that (ATI has a nice ps2.0-based demo doing this for the Radeon 9700).

Send fan mail to your favourite community volounteer, and send hate mail to whatever environmental polluter or green house gas emitter stokes your ire.

Depth of Field