What the network actually sees, and what breaks when the aux buffers don't follow OIDN's conventions. Every corruption below is a real mistake this project made and fixed.
The exact bytes passed to denoiser.denoise() for one scene — color at
4 samples/pixel plus the albedo and normal auxiliary buffers.
color · 4 spp (noisy)
sRGB-encoded bytes (default srgb: true decodes internally). This is the only buffer that is display-encoded.
albedo
[0,1] linear bytes — never sRGB-decoded, per DenoiseImageOptions.albedo.
normal · as-encoded
n·0.5+0.5 maps [-1,1] → [0,1]. Env/miss pixels are exactly 0 → flat 0.5 gray (visible at the top).
normal · decoded length
Debug view: decodes back to [-1,1] and colors by vector length — blue = 0 (correct env), green = 1 (valid unit normal), red > 1 (broken encoding).
Three toggles reproduce real aux-generation bugs this project debugged (see
docs/status/STATUS.md). Each is applied client-side to the correct assets
above, then denoised with the same model — compare against the correct-aux baseline.
correct aux (baseline)
active corruption
OIDN's aux inputs are a contract, not a suggestion: albedo must stay linear because the network was trained on linear statistics, and normals must be exactly zero off-surface because that's the signal the network uses to recognize "nothing hit here — trust color alone." Violate either one and the network doesn't error — it just denoises worse, confidently, which is what makes these bugs easy to ship and hard to notice. See the generating aux inputs guide for the G-buffer recipes that avoid all three, and the gallery demo for aux inputs used correctly at scale.