denoiser aux inputs

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.

What the network sees

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).

Break it and see

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.

Corruption

correct aux (baseline)

active corruption

Why this matters

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.