Screenshots

Intersecting volumes rendered by breaking the volumes up into pieces. Intersecting volumes rendered by storing data between multiple passes in render targets. Gander running on Windows XP.
Gander running on Ubuntu Lucid Lynx. When rendering intersecting volumes, it's important to make sure samples alternate between the datasets in the overlapping sections, but ideally this would not be done in the others.  Splitting up the volumes into pieces is one way to accomplish this.  To make sure everything is still blended correctly, the pieces should be sorted from back to front.  Here only the pieces behind the overlap are shown. First try at rendering intersecting volumes by breaking them up into pieces.  Two BooleanXor nodes and one BooleanAnd node create the pieces.  Here blending is a problem because each piece blends its result into the default framebuffer, whereas they should really be picking up where the one behind it left off.  Then only when all the pieces are done should the results be sent to the screen.
Stanford CT Head dataset with a transfer function to bring out the details. Another view of the Stanford CT Head dataset showing the inside of the head.  Here the transfer function really brings out the differences between the different densities in the dataset, with the skin being blue, the muscles and brain being green, and the bones being either yellow, orange, or red. Here the user has modified the Transfer[3] uniform variable in the GUI to 0.7 to make more of the values red.
In this scene the user has moved one of the cubes upwards to clip the volume differently. Intersection using Boolean node with "AND" operator. Showing off alpha blending with the halfmoon shader.  This is also the first shot with the manipulators and the old right-click menu back when Gander still used GLUT.
Showing back face and front face culling.  This is needed for Kruger's method of rendering volumes using two passes.  The first renders the texture coordinates of the front faces into a texture.  Then in the second pass a fragment shader runs for each fragment in the back faces.  It uses the difference between the texture coordinates of the back and front faces to form a ray.  The ray can then iterate through the dataset to render a volume. Accessing multiple textures from a shader using sampler2D uniform variables.  As long as the uniform has a link attribute that matches the name attribute of a texture, the uniform will automatically determine its value. First somewhat successful screenshot!
Early try at lighting with the skull volume by calculating normals using central differencing.  Here the skull is using simple accumulation, so it appears quite blocky.