WLab and Wpt

Color without the fine print: a material's color for every light and every viewer

Every CIELAB value comes with fine print: it holds for one light and one standard viewer. Wpt (pronounced "Waypoint") describes the color of a material instead, and WLab (Waypoint Lab) reshapes Wpt so that distances read like familiar ΔE color differences. Try the demo below, then read the guide.

The short version

Demo: two materials that match, until the light or viewer changes

The two materials below have different spectra but match exactly under one light (D65), for one viewer (the CIE 1931 standard observer). Change the light or the viewer and watch them part, and compare how far each one moves from itself in CIELAB and in WLab.

Chips show each material under the chosen light as an adapted viewer would roughly see it (CIE 1931 observer, Bradford adaptation to sRGB). Screen colors are approximate. PMCC Smurf and PMCC Unitary Blue are patches of the Preferred Memory Colour Chart (M. R. Luo, "The new preferred memory color (PMC) chart", Color Research & Application 49(6), 2024), measured by Maxim W. Derhak; each twin was made from its patch to match it exactly under D65.

Waypoint Labs

Work with the ideas on your own data, in this browser (nothing you enter is sent anywhere). Each lab takes up one question:

Open Waypoint Labs From the onramp to using material color in practice

The robustness report

Paste the spectral reflectance of a standard and its samples, choose the lights that matter (including your own measured lights), and read ΔEWLab for each sample under each light, plus ΔE00 in the booth. One page that runs in your browser; nothing is sent anywhere.

Open the robustness report

For developers

Everything on this page runs on wlab, a small TypeScript implementation of Wpt, WLab and MATs with no dependencies, tested against the reference implementation. It takes spectra for any light and observer, and display colors in sRGB, Display P3, Adobe RGB or Rec. 2020.

import { wptNormalization, deltaEWlab, rgbToWlab } from 'wlab';

const store = wptNormalization('cie1931', 'F11');      // one normalization per light and observer
const d = deltaEWlab(store.wlabOf(standard), store.wlabOf(sample));   // spectra: 380–780 nm, 5 nm

rgbToWlab([0.2, 0.6, 0.3], 'display-p3');              // a display color, through D65

A display color is not a material: in WLab it stands for the material that would give the same numbers under D65. The guide's Technical annex (A.8) maps every equation to its function.