diff --git a/core/dr-film/README.md b/core/dr-film/README.md index cc746bf..2949c48 100644 --- a/core/dr-film/README.md +++ b/core/dr-film/README.md @@ -41,18 +41,34 @@ matters — see [`src/bake.rs`](src/bake.rs) for the argument: 1. **A 3×3 matrix**, linear sRGB to the three layers' exposure. Exact, not an approximation: the reconstructed scene spectrum is linear in the sRGB triple, so the integral collapses into nine numbers. -2. **Three 1D curves**, log exposure to density, sampled at 256 points. -3. **One 32³ lookup**, density to linear sRGB — dye absorption, the print - through the negative, the paper, the viewing illuminant and the chromatic - adaptation, all of which take exactly three numbers in. +2. **Three 1D curves**, log exposure to density, sampled at 256 points — one + row per development time the datasheet measures. Push picks between the + rows, and interpolating them is exact, because density is linear in push + between two measured processes. +3. **One 32³ lookup**, density to linear sRGB — dye absorption, the viewing + illuminant and the chromatic adaptation, all of which take exactly three + numbers in. A printed negative is two: the film's cube ends at the paper's + log exposure through the negative, the enlarger's exposure is added there, + and the paper's own curve row and cube take it to linear sRGB. -Per pixel that is a matrix multiply, three curve taps and one texture fetch. -Splitting 2 from 3, rather than baking one LUT over exposure, is measured +Per pixel that is a matrix multiply, a handful of curve taps and one texture +fetch — two for a print. Splitting 2 from 3, rather than baking one LUT over exposure, is measured rather than assumed: the curve carries all the sharp shape and the dye mixing is smooth, so folding the curve into the 3D lookup would need it three times larger for the same error. At 32³ the worst interpolation error is about 0.003 in linear sRGB, below one 8-bit code value, and there is a test that says so. +**No slider is baked.** Camera exposure is a gain before the matrix, push +chooses between curve rows, print exposure is the addition between the two +cubes, and format sets the grain; each reaches the shader as a uniform that is +linear in what it does. That is what lets a mask layer hold its own film +settings, and a pixel under several layers take the weighted average of them. +Only the enlarger's filtration is solved at bake time, against the +photograph's exposure — an enlarger has one filtration for the whole print — +so the film's Exposure, set on the whole photograph, is the one slider that +rebakes. The stock and its +paper are the photograph's; a layer has no picker. + ## Adding a stock If spektrafilm has it, add its name to `STOCKS` in