Volume rendering with 2D textures is more complex and does not provide
as good results as 3D textures, but can be used on any OpenGL implementation.

The problem with 2D textures is that the data slice polygons can't always
be perpendicular to the view direction. Three sets of 2D texture maps are
created, each set perpendicular to one of the major axes of the data
volume. These texture sets are created from adjacent 2D slices of the
original 3D volume data along a major axis.
The data slice polygons must be aligned with whichever set of 2D texture
maps is most parallel to it. In the worst case, the data slices are canted
45 degrees from the view direction.

The more edge-on the slices are to the eye, the worse the data sampling is.
In the extreme case of an edge-on slice, the textured values on the
slices aren't blended at all. At each edge pixel, only one sample is visible,
from the line of texel values crossing the polygon slice. All the other
values are obscured.

For the same reason, sampling the texel data as spherical shells to avoid
aliasing when doing close-ups of the volume data, isn't practical with
2D textures.

Here are the steps for rendering a volume using 2D textures:

Generate the three sets of 2D textures from the volume data. Each set of
2D textures is oriented perpendicular to one of volume's major axes. This
processing is done once for a particular data volume.

Choose the number of slices, based on the criteria in
Section 16.2.5. Usually this matches the texel
dimensions of the volume data cube.

Find the desired viewpoint and view direction.

Find the set of 2D textures most perpendicular to the direction of view.
Generate data slice polygons parallel to the 2D texture set chosen. Use
texture coordinate generation to texture each slice properly with respect
to its corresponding 2D texture in the texture set.

Use the texture transform matrix to set the desired orientation of
the textured images on the slices.

Render each slice as a textured polygon, from back to front. A blend
operation is performed at each slice; the type of blend depends on the
desired effect. See the blend equation descriptions in
Section 16.2.4 for details.

As the viewpoint and direction of view changes, recompute the data slice
positions and update the texture transformation matrix as necessary. Always
orient the data slices to the 2D texture set that is most closely aligned
with it.