Pleochroma GitHub
Reference

Materials

The optical constants Pleochroma ships built in, and where each one comes from.

1Dispersion chart

Each line is one material's refractive index n(λ) across the visible spectrum, from violet (380 nm, left) to red (780 nm, right), drawn from the same coefficients as the table below, and colored by wavelength. The index always falls toward the red, and the steeper the line, the stronger the dispersion and the fire. The dot marks nD at 589 nm, the value usually quoted for a gem. All materials share one scale, so switching between them shows where each one sits.

Material
Diamond (C)
Crystal system
Cubic (Isotropic)
Optical character
Isotropic
n_D (589 nm)
2.4173
Dispersion (n_F − n_C)
0.0256
Abbe number (V_d)
55.3
Birefringence (Δn)
0.0000 (none)
Specific gravity
3.52

Exceptional brilliance and adamantine luster with intense fire. The reference isotropic gemstone.

2The 38 built-in materials

All figures below are read from crates/pleochroma/src/optics/materials/ (one file per group of species). n_D and dispersion (Δn, F−C) come from each material's own source comment: a primary Sellmeier/Cauchy fit where one exists in the optics literature, or a value derived from two or more corroborating gemological references where it does not — the source file documents which for every row. Birefringence is birefringence_delta as stored (n_e − n_o for uniaxial materials, the signed or unsigned total spread for biaxial ones, per the field's own doc comment).

MaterialCrystal systemOptical charactern_DDispersion (F−C)Birefringence
DiamondCubicIsotropic2.417260.02560.0000
SapphireTrigonalUniaxial −1.768080.0106−0.0081
RubyTrigonalUniaxial −1.768080.0106−0.0081
EmeraldHexagonalUniaxial −1.57910.0082−0.0060
Zircon (high)TetragonalUniaxial +1.92500.0226+0.0590
AlexandriteOrthorhombicBiaxial +1.742730.0101+0.0076
TopazOrthorhombicBiaxial +1.627180.0082+0.0080
SpinelCubicIsotropic1.716100.01180.0000
QuartzTrigonalUniaxial +1.544210.0078+0.0091
Tourmaline (elbaite)TrigonalUniaxial −1.639410.0099−0.0210
Tanzanite (heated)OrthorhombicBiaxial +1.700860.0174+0.0130
Synthetic moissaniteHexagonalUniaxial +2.647430.0635+0.0415
Cubic zirconiaCubicIsotropic2.158460.03460.0000
AquamarineHexagonalUniaxial −1.577000.0082−0.0060
MorganiteHexagonalUniaxial −1.577000.0082−0.0060
Chrysoberyl (yellow)OrthorhombicBiaxial +1.7460.0100+0.0076
AmethystTrigonalUniaxial +1.544210.0078+0.0091
CitrineTrigonalUniaxial +1.544210.0078+0.0091
Ametrine (color zoned)TrigonalUniaxial +1.544210.0078+0.0091
Pyrope garnetCubicIsotropic1.7140.01270.0000
Almandine garnetCubicIsotropic1.7900.01390.0000
Spessartine garnetCubicIsotropic1.8000.01560.0000
Color-change garnet (pyrope-spessartine)CubicIsotropic1.7600.01450.0000
Grossular garnet (tsavorite)CubicIsotropic1.7340.01620.0000
Andradite garnet (demantoid)CubicIsotropic1.8870.03300.0000
PeridotOrthorhombicBiaxial +1.6540.0116+0.0360
YAGCubicIsotropic1.832650.01580.0000
GGGCubicIsotropic1.9700.04500.0000
BenitoiteHexagonalUniaxial +1.7570.0261+0.0470
AndalusiteOrthorhombicBiaxial −1.6340.00930.0100
Opal (body color)Amorphous*Isotropic1.450.00100.0000
Glass (Schott N-BK7)—†Isotropic1.516720.00810.0000
Glass (Schott F2)—†Isotropic1.619890.01710.0000
RutileTetragonalUniaxial +2.613 (o) / 2.909 (e)0.164 (o) / 0.207 (e)+0.2957
Precious opal (white)Amorphous*Isotropic1.450.00100.0000
Precious opal (black)Amorphous*Isotropic1.450.00100.0000
LabradoriteTriclinicBiaxial +1.56250.0070‡+0.0080
MoonstoneMonoclinicBiaxial −1.5230.00700.0080

*Opal is a mineraloid with no true crystal structure; the source code stores Cubic as a placeholder for "isotropic," not a mineralogical claim — its own comment says so explicitly. †The two reference optical glasses are amorphous, included as isotropic calibration materials rather than gemstones. ‡No measured dispersion was found for labradorite; the entry borrows the size of moonstone’s (B−G 0.012) as a placeholder.

Stones whose look comes from the inside

The last four rows are the host optics of stones that owe their look to what is inside them: Precious opal (white), with a pale body and a milky veil, Precious opal (black), with a dark neutral body, Labradorite and Moonstone. The play-of-color of opal, the schiller of labradorite and the adularescence of moonstone are not part of the material but a choice of the design, made in the Stone tab, so the same material can be shown plain or with its effect. The older Opal row is the plain body-color opal and is unchanged. The effects, the silk presets of the other materials and the surface finish of a facet are described on the surface finish, silk and play-of-color page.

A refractive-index curve for each ray

Most birefringent materials give the ordinary ray (or the middle ray of a two-axis crystal) its own dispersion and add the birefringence as one constant. Where a published curve exists for the other rays, the renderer uses the curve:

The remaining birefringent built-ins (zircon, tourmaline, the beryls, topaz, tanzanite, peridot, andalusite, labradorite and moonstone) keep a constant offset, because no per-ray dispersion was found for them. Because the direction in which the extraordinary ray is displaced now follows the index at each wavelength, the doubled images of a stone separate a little by color.

Where each material’s color comes from

A built-in material’s color is a set of absorption bands, each with a position, a width and a strength, and a pleochroic material has one set per ray direction. The colors of nine built-ins are fitted to published measured absorption spectra, and their bands are Gaussian in energy (wavenumber). Amethyst, Citrine and Tourmaline keep their earlier data.

Tanzanite is the heated, violet-blue stone sold under that name. It has three polarized absorption sets (alpha, beta, gamma), fitted to a naturally blue zoisite crystal that lacks the band heating removes. Alpha is the darkest and most purplish ray, beta is blue and gamma is the lightest. Aquamarine has its c axis in the table plane, as Tourmaline does, so a stone seen face-up shows the blue ray and reads light blue; with the axis along the view it would show the nearly colorless ordinary ray.

Color variants and pleochroism

Each built-in material comes with named color variants: Pink and Yellow for a sapphire, Rubellite and Verdelite for a tourmaline, Cape Yellow and Blue for a diamond, and so on. A variant is a complete absorption spectrum for every direction through the crystal, not a single tint, so a pleochroic stone keeps its different colors in different directions when you pick one. Its refractive index, dispersion, birefringence and crystal axis stay as they are, and the choice belongs to that design alone: a variant never becomes the material’s default. A one-axis crystal (sapphire, tourmaline, quartz, beryl) has two colors, one along the crystal axis and one across it; a two-axis crystal (tanzanite, alexandrite, topaz, andalusite) has three, alpha, beta and gamma. That is why the color list of a pleochroic stone offers no generic one-color presets, and why the custom color editor has one row for each direction.

Many of the built-in variants are fitted to measured absorption spectra of the variety, mostly taken with polarized light (the Caltech Mineral Spectroscopy Server, the GIA studies of the causes of color in corundum, and papers on individual gems); the others are built from published band positions. A variant is marked Estimated (in the note on the entry and in the Color Variants section) when its spectrum is not a measured one of that variety or its strength was chosen for a typical face-up color, which is true of almost all of them. Each one keeps its sources. The same beryl color (Heliodor, Red Beryl, Goshenite) is offered for Aquamarine, Emerald and Morganite; it is defined relative to the crystal axis, and each material’s own default axis decides which direction you see face-up, so the same variant looks different on the three. You can save your own from the custom color editor (Save as Variant…); they are listed for that material only and are managed in the Material Editor’s Color Variants section (rename, duplicate, delete). A design keeps its own copy of the variant it uses, so it looks the same on another computer and does not change when the variant is edited later. A design saved before variants keeps its color as it was, and on a pleochroic material the program offers to convert it to a variant or a per-direction color. The same variants color the zones of a color pattern; the web app has the same list and editor, and the mobile app can pick a variant.

Ametrine, a color-zoned built-in

Ametrine is the one built-in material whose color changes across the stone. It models the bicolor quartz of the Anahí type, where amethyst and citrine grow side by side and a cut stone usually shows one straight boundary between a purple half and a yellow-orange half. The built-in material has exactly that: amethyst on one side of the plane through the stone’s centre that contains the table normal, citrine on the other, with a sharp boundary. Its optics (index, dispersion, birefringence) are those of quartz and citrine, in the table above. Pick it as the design’s Material on the Stone tab, or in the Live Render. The boundary is fixed in the design’s frame, so seen face-up the line runs through the centre along the design’s Z axis, and the facets decide what the two halves do.

The Color Pattern section of the Material Editor for Ametrine: two color swatches and notes on built-in zones and on Path-Traced and Ray-Traced views
Fig. 1 — The Color Pattern section in the Material Editor for a zoned material such as Ametrine: one swatch for the base zone (the amethyst half, everywhere no zone covers) and one for the half space with offset 0 (the citrine half), the note that built-in color zones change only in a saved copy under a new name, and the note that patterns show in Path-Traced views while Ray-Traced shows the base color.

In the Material Editor, the Color Pattern section shows both halves as swatches, and saving Ametrine under a new name makes a custom material that keeps both zones, which you can then edit as a color pattern. A zoned material’s color is its zones, so a design’s Body Color and the Live Render Color control are greyed out for it. The GPU renders Ametrine when the stone has no inclusions; with inclusions it is traced on the processor. A remote worker of an older version that does not know zones draws the stone on this computer instead. Not modelled are the six-sector pinwheel of a whole crystal section and the slightly diffuse boundary of natural material. Color zones in general, and how to fit them to a piece of rough from photos, are described in the rough color section of the studio page.

3Alexandrite's color change

Alexandrite's chromium chromophore creates two transmission windows — one blue-green near 500 nm, one deep red near 680 nm — separated by a strong absorption valley around 580 nm. Daylight, rich in blue-green photons, favours the 500 nm window; incandescent light, rich in red photons, favours the 680 nm window. Because this is a genuine two-window spectral effect rather than a color swap, it falls directly out of Pleochroma's per-wavelength transport rather than needing a special case. Alexandrite is also biaxial, so the effect is evaluated per direction: three independent absorption spectra along its α, β, γ axes.

Alexandrite rendered in daylight: the faceted stone reads green-yellow
Fig. 2 — Alexandrite in daylight, which favours the blue-green transmission window: the stone comes out green-yellow.
The same alexandrite rendered in a warmer light: the stone reads pink
Fig. 3 — The same stone under a warmer light, richer in red, which favours the red window: it comes out pink.

Both renders: 41.029B FVS-65 (Long Octagon), 1920 × 1080, 32 768 samples per pixel, grey backdrop card. The second uses a different, warmer light (the export file does not record which); the stone and the sample count are the same.

4Sapphire and ruby dichroism

Corundum (sapphire, ruby) is trigonal, uniaxial negative. Its ordinary and extraordinary rays carry distinct absorption bands — a real, measured shift (roughly 580 nm vs. 700 nm for the Fe²⁺–Ti⁴⁺ charge-transfer band behind blue sapphire's color; see the source comment on the Sapphire entry in materials/diamond_through_emerald.rs for the citation). Cutters orient the table facet perpendicular to the c-axis specifically to show the more saturated ordinary-ray color face-up.

5High dispersion and extreme birefringence

Rutile and synthetic moissanite sit at the edges of what the renderer's Fresnel and dispersion code has been verified against. Rutile's birefringence (+0.296) is the largest of any built-in material, and its dispersion (Δn of 0.164 for the ordinary ray and 0.207 for the extraordinary ray, after DeVore 1951) is the largest too. Every uniaxial material, not only rutile, goes through the exact closed-form uniaxial Fresnel solve (optics/raytracer/uniaxial_fresnel/) at its entry and internal interfaces, except where the wave normal lies within a small angle of the optic axis and the general scalar Fresnel path takes over. What sets rutile apart is how far that solve is stressed: it is the Tier 3 image-comparison material used to catch CPU/GPU divergence in it. Most uniaxial materials derive the extraordinary ray from the ordinary curve plus a constant birefringence offset; quartz, amethyst, citrine, ametrine, rutile, sapphire, ruby, synthetic moissanite and benitoite carry a separate extraordinary-ray curve, and alexandrite and chrysoberyl carry alpha and gamma curves. Moissanite's dispersion (Δn ≈ 0.064) is more than double diamond's.

6Custom materials

The desktop studio's Material Editor dialog (the pencil button next to the live viewport's Render Material dropdown) builds a custom material at runtime via GemMaterial::new_custom (crates/pleochroma/src/optics/materials/custom.rs), which takes a name, mean refractive index, an F−C dispersion delta, a birefringence delta, and an RGB absorption tint, and fits a 2-parameter Cauchy curve to the requested dispersion at the sodium D and Fraunhofer F/C lines. Saved custom materials are persisted to a custom_gem_materials table in the same facet_diagrams.sqlite database the app already uses for designs, via pleochroma-vault's CustomMaterialRow and Database::save_custom_material — and, when a design uses the material, a snapshot of its numbers is also written into that design's .psdd file, so the design still opens with its real optics on a machine whose library has no such material. This is a separate feature from Retarget, which proposes new facet angles for an existing design in a different material rather than authoring a new material (see the studio page).

The editor offers two ways to describe the refractive-index curve. In Simple mode two sliders set the index at the sodium D line (1.30 to 3.20) and the F−C dispersion (0.000 to 0.210), and the editor builds the 2-parameter Cauchy curve described above. In Coefficients mode you type a published fit instead: a 3-term Sellmeier, a 1-term Sellmeier, or a Cauchy fit with A, B and C (GemMaterial::new_custom_with_dispersion). A Copy from list fills the fields of the 3-term Sellmeier and Cauchy models from a built-in material as a starting point. The stone is then traced with exactly that curve, on the GPU and the CPU alike, and a remote worker receives the whole material, coefficients included.

A live readout shows nD, nF, nC, the F−C dispersion and the Abbe number, with a plot of the index against wavelength from 380 to 780 nm. The curve is validated before it can be saved: finite coefficients, no Sellmeier resonance between 300 and 800 nm, and an index above 1 across the visible band (the checks are listed in section 2 of the physics page). Amber warnings, which leave Save available, mark an index that rises with wavelength, an Abbe number outside 5–120, or no dispersion at all. The coefficients are stored with the material in the library and, when a design uses it, in the design file. An RI override on a design replaces the whole curve with a single-index curve at the typed number, for that design only. The browser app and older versions of the desktop studio do not know the coefficients: they show the material with a Cauchy curve built from nD and the F−C figure, which is close but not identical.

A material that is not isotropic also has a Per-Axis Curves row in the editor: Curves types a Sellmeier or Cauchy fit for the extraordinary ray of a one-axis material, or the alpha and gamma rays of a two-axis one, with the same fields and checks as the main curve. Up to four inclusion families (needles, plates or random needles along the crystal axis, in the basal plane, along the alpha axis or tilted) give the material its own silk, and a Play-of-Color section lets it imitate an opal or a labradorite. All of these are stored with the material and written into a design only when used.

The Material Editor is not the only way to change a stone's color. A Color control in the Live Render toolbar, next to Render Material, shows the stone in another color without making a custom material. It offers the same list as the Stone tab’s Body Color: the material’s own color, its color variants and the ones you saved, the nine ready-made colors for a material that has one color in every direction, and Custom Color…, which opens the per-direction editor described below. For the design open in the editor, with the render linked to it, a pick becomes that design’s own color (one undo step) and the control shows the variant’s own name and swatch; for anything else it changes the view only, and the app remembers it. The stone keeps its refractive index and dispersion, and a variant or a Custom Color keeps its different colors in different directions, so a pleochroic stone stays pleochroic. A pleochroic material lists no one-color presets; a stone with an old single color on such a material shows a Legacy row that leaves the picture as it was.

Any color can also be described as a Custom Color with three sliders: tone (how light or dark), saturation (how rich) and hue (the basic color, in degrees around the color wheel), the L*C*h description of a color. The same editor opens from three places: Custom… in the Body Color box of Design settings, Pick… in the Material Editor (the color is saved with the material, and a custom material keeps it), and Custom Color… in the Live Render Color list. Because the same absorption looks deeper in a larger stone, the editor shows the color as four swatches, at 3, 5 and 10 mm and This stone (the design’s own size), and the design keeps it as an absorption spectrum per millimetre, so a larger stone renders deeper and a smaller one lighter. A badge says Reachable with the color difference, or, in amber, that the color is not fully reachable at this size and how far the closest reachable color is; very rich or very light-and-rich colors are not all reachable. For a stone whose crystal shows different colors in different directions the editor has one such color for each direction (Along the Axis and Across the Axis, or Alpha, Beta and Gamma), with a face-up swatch and one swatch per direction, and Save as Variant… keeps the result. Older versions show a close single-color version of it; the web app has the same editor.

The app's material pickers are built in two places, both from GemMaterial::all_materials(). The studio's Design Settings Material combo and the New Design dialog's Starting Material combo start from the MaterialCatalogue (crates/pleochroma-cut-core/src/material/catalogue.rs): “(none)”, then all 38 built-in materials above in all_materials()'s own order; Design Settings then appends the custom materials you have saved, and a “Custom RI…” entry. The Live Render viewport's Render Material dropdown does not use the catalogue: it is built in apps/pleochroma-cut/src/gui/startup_settings.rs as the same 38 built-ins sorted alphabetically (case-insensitive), with your saved custom materials appended after them. A built-in species offered by one picker is therefore offered by the others, though the order differs.

An imported .asc file carries only a bare refractive index, never a species name. When a design's material is otherwise unset, the studio looks for the nearest built-in preset within 0.02 of the design's effective RI and shows it as a labelled guess — e.g. "Sapphire? (from RI 1.76)" — never as a recorded fact, with a Set material button next to it that writes the name in as an ordinary, undoable edit. If nothing built in is within tolerance, no guess is shown at all.

Color patterns

A custom material can have zones of different colors, such as a pink core inside a green rim (a watermelon tourmaline), two halves, bands or sectors. The Material Editor has a Color Pattern section with Add Pattern…, Edit Pattern… and Remove Pattern; it opens the Color Pattern Editor, a window of its own. There you start from a template (Uniform, Bicolor, Tricolor, Banded, Watermelon, Reverse Watermelon, Core and Rim, Split or Sectors) or a saved preset, pick the color of each zone in the usual color editor, and set the pattern’s axis, whether its sizes scale with the stone width or stay fixed in millimeters, and how sharp the boundaries are. A pattern has a base zone and at most four more. A zone’s Colors menu offers One Color, Along and Across (an Along color seen looking along the crystal axis and an Across color that is blended in looking across it) and Alpha, Beta and Gamma, and puts first the form of the stone’s own crystal; more than one color needs a birefringent material (a crystal system other than Cubic and a birefringence other than 0). A zone can also take a color variant of the stone’s material as its color. A pattern shows in the Path-Traced views, in render jobs and on remote workers that support zoning; the Ray-Traced view shows the base color. A design on a custom material with a pattern carries the pattern in its .psdd file, so it opens with the zones on another computer.