Creating Anaglyphs using OpenGL
orA simple example using the OpenGL accumulation buffer
Written by Paul Bourke
August 2000
See also:
Correctly forming stereo pairs
Further anaglyph examples
Introduction
Would you like to experiment with interactive stereographics but your graphics card doesn't support stereographics or even left and right buffers? Have you lost or never had a pair of LCD shutter glasses and don't want to pay for a pair? The following shows how to create anaglyphs using OpenGL and the accumulation buffer. It supports all the major filter colours and illustrates how to correctly form stereo pairs. A number of simple geometric forms are supplied to illustrate the principle, it should be a very simple task to add other models and provide more sophisticated interaction. While anaglyphs are somewhat the "old fashioned" way of creating stereographic images, they are still effective, even if they are limited to monochromatic images.
Approach Stereographics primarily requires that two images (one for each eye) are presented independently to our two eyes. If these two views of a 3D model are computed correctly the human brain will fuse them and give us a stronger depth perception than we normally get with a single image There are a number of ways this can be achieved, this document deals with anaglyphs in which the left and right eye images are made up of two independent colours. By wearing glasses with matching filters, the left eye image is delivered to the left eye and the right eye image to the right eye. ![]() Whatever technique is used, the scene needs to be rendered twice, once for each eye position. The two resulting images need to be filtered and combined before being presented to the user. The two images are most conveniently added together by using the accumulation buffer. There are only a small number of things that need to be changed to an existing OpenGL program in order for it to support anaglyphs, these are outlined below.
In order to draw the left and right eye scene in the appropriate colour for the filters in the glasses, one could specify one colour when drawing the left eye image and another for the right eye image. This is a bit clumsy, a much easier way is to only specify colours in the scene as different shades of grey and apply glColorMask() to do the filtering automatically. For more details on the whole process see the source code. Source codeanaglyph.c and anaglyph.h
Example models | ![]() |
Feedback from Michael Callahan
If you're rendering with the hardware red and blue (for example, using color masks), then the colors do not overlap at all. So if you aren't already using the blend function for something else, the accumulation buffer is unnecessary:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); // set camera for blue eye, red will be filtered. // draw scene glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE); // set camera for red eye, blue will be filtered. // draw scene
Feedback from Daniel van Vugt
Daniel van Vugt pointed out that the accumulation buffer isn't actually needed resulting in a much faster implementation.
"Because the two images do not overlap in colour space, no kind of blending or accumulation is actually doing anything. Just remember to clear the depth buffer for each image, but don't clear the colour buffer between the two images."
New, faster, source code