A Practical Linear Workflow for Archviz
Why your renders look washed out — and how a correct linear color workflow fixes materials, lighting and post in one move.
Most “my render looks flat” problems are not lighting problems. They are color management problems that masquerade as lighting problems.
The short version
Your renderer computes light in linear space. Your monitor displays gamma-encoded images. Every texture, light value and post-production step has to respect that boundary — or you end up compensating with ever-stronger lights and crunchy contrast.
Fix the pipeline once, and stop fighting every image individually.
Where it goes wrong
- Albedo textures imported as linear when they are sRGB.
- HDRIs double-corrected on import.
- Post-production applied to already display-referred images.
A quick sanity check for albedo values:
| Surface | Realistic albedo | Common mistake |
|---|---|---|
| White paint | 0.75–0.85 | 1.0 |
| Concrete | 0.30–0.50 | 0.15 |
| Dark wood floor | 0.10–0.20 | 0.05 |
Nothing in the physical world is albedo 1.0 — not even fresh snow.
Checking a texture in practice
If you want to verify what a renderer actually sees, sample the texture in linear
space. A tiny Python check with imageio:
import imageio.v3 as iio
import numpy as np
img = iio.imread("albedo.png") / 255.0
linear = np.where(img <= 0.04045, img / 12.92, ((img + 0.055) / 1.055) ** 2.4)
print(f"mean albedo (linear): {linear.mean():.3f}")
If the mean of a “white wall” texture comes back at 0.92, your walls are emitting
more light than they receive — and no lighting rig will save the image.
Takeaways
- Treat color management as infrastructure, not per-image seasoning.
- Calibrate albedo first; only then judge lighting.
- Keep post-production scene-referred for as long as possible.
The next post will cover camera response and why “filmic” tone mapping earned its place in every archviz pipeline.