Capture sharpening and noise reduction were written in parallel and both claimed `order: 110`; the codegen refuses that, which is the guard working — two nodes at one order is an ambiguous pipeline and operation order changes the result. Resolved in noise reduction's favour, for the reason its own `placement:` block already gives: denoising is a repair and everything else in this stage is an enhancement. Sharpening or adding clarity to a noisy frame amplifies the grain along with the detail, and no later pass can separate them again. So the detail stage now runs noise reduction, capture sharpening, clarity, texture, and the other three shift up a slot to keep the multiple-of-ten convention the rest of the chain uses. Noise reduction was also missing the required `attributes:` key. The order collision aborted the build before the attribute check could report it, so it arrived looking like one fault and was two.
34 lines
1.6 KiB
YAML
34 lines
1.6 KiB
YAML
# A hand-written node, and a neighbourhood one: it reads the pixels around the
|
|
# one it is writing, so it runs in the detail stage rather than as a fragment
|
|
# in the fused pass. See `../src/detail.rs` for why that stage exists and
|
|
# `README.md`'s "Nodes that read their neighbours" for the contract.
|
|
#
|
|
# As with every `rust:` node, its descriptor, parameters and behaviour come
|
|
# from the type; this file exists so that `ops/` remains the one place the
|
|
# pipeline's order is written down.
|
|
id: capture_sharpen
|
|
order: 120
|
|
|
|
attributes: [detail]
|
|
rust: CaptureSharpen
|
|
|
|
why_rust: |
|
|
A convolution, not a point function. The schema in `README.md` describes an
|
|
operation handed a colour with no way back to a coordinate, which is exactly
|
|
what a kernel cannot work with — and stretching it to cover taps, kernel
|
|
extents and a per-render conversion from source pixels to render pixels
|
|
would produce a worse language than Rust aimed at one caller.
|
|
|
|
placement: |
|
|
First among the detail nodes, because capture sharpening is a correction to
|
|
the capture: it recovers the acutance the anti-aliasing filter, the lens's
|
|
circle of confusion and the demosaic interpolation each took out, and it is
|
|
meaningful before any effect built on top of it. The compositional detail
|
|
controls — texture, clarity — reasonably follow it, since they are about the
|
|
picture rather than about the sensor.
|
|
|
|
Being in the detail group at all is what places it after every tonal and
|
|
chromatic operation: an amount tuned before a tone curve is amplified by
|
|
whatever slope that curve happens to have, so the amount that looked right
|
|
stops looking right the moment the curve moves.
|