To accurately simulate interference, incident light must be represented by a spectral energy distribution. However, in lrt colors are represented as red, green, blue triples. As a result, we modified the color representation WITHIN our iridescence BRDF. Our spectrum ranged from 360nm to 830nm, with values for the distribution defined at 95 wavelengths -- every 5nm. Given an intensity for particular wavelength of incident light, our code first calculates an intensity for outgoing light of that same wavelength. Therefore, for each point to be shaded, we generate a spectral distribution of the reflecting light. Then, using color matching curves, we find the three intensities of X,Y, and Z colors that produce the same color as the reflected spectral energy distribution. For the X color, this calculation is:

X = k * integral(spectral_distr * color_x * d_lambda)

where color_x is the value of the X color-matching curve and k is:

1/(integral(spectral_distr_W * color_y * d_lambda)

where spectral_dist_W is the spectral energy distribution of the brightest white.

After converting the spectral energy distribution of the reflected light into X,Y, and Z coordinates, we converted the (X,Y,Z) representation into an (R,G,B) representation. To do this we generated a 3x3 conversion matrix. We followed a procedure outlined in Meyer and Greenberg: Using the chromaticity coordinates of the white spot and phosphors of our monitor, and the luminance of our monitor's white point (we chose a relative value of 1), we derived a matrix that converts from (R,G,B) to (X,Y,Z). We did this and then derived the inverse of this matrix to obtain a matrix that converts from (X,Y,Z) to (R,G,B).

We created a surface type that has a shader (butterflyWingSurface) that not only simulates multiple-thin-film interference, but it also adds a slight glossy specular reflection and a perfect mirror reflection. Morpho butterfly wings have a slight metallic appearance. The highlight color we used was the color calculated by the iridescence code. One place we could improve our shading work would be to change the surface glossy specular color to the color of the lightsource. In pictures of these butterflies, the wing surfaces have a sheen that appears to be a combination of the iridescent color and the color of the light source. Finally, we bump mapped the wing veins -- the final color due to iridescence and a metallic reflection was multiplied by (1.,1.,1.) where there was no vein, and by (.35,.35,.35) where there was a vein.

Once the geometry was created in 3D Studio Max, we exported the geometry as a RIB using an evaluation version of MaxMan, a 3d Studio plugin from AnimalLogic. (thanks to Jeff Mancuso for that hookup...)

The actual butterfly wing surfaces themselves used bump mapping - we carefully drew the vein structure in Photoshop in grayscale, and used the color values in the resulting images to modulate the iridescence effect on the surface, resulting in decent veins that are integrated into the iriscence effect rather than just glued onto the surface as a decal.

(get tiff here)

(get tiff here)

This image shows the nice spectrum of colors that appear at grazing angles when the light is behind the surface position being viewed.

Here is a movie in which the camera pans over the butterfly from a grazing viewing angle to an overhead viewing angle to another grazing viewing angle. The light and scene remain stationary, only the camera moves. The color of any position on the surface of the butterfly's wings depends on the viewing angle.

Here is the source code for rendering these images.

Last modified: Sun Jun 10 20:19:48 PDT 2001