Sunday, January 04, 2009

Who Is This Al Bedo Guy Anyway?

That's Mr. Bedo to you!

Sometimes I end up learning the name for a computer graphics idea or technique long after I use it. So I was amused the other day to find out that the fancy computer-graphics name for the "daytime" textures in X-Plane (you know, the normal ones for OBJs and airplanes) are called albedo textures in technical terms - or rather they define the albedo component of the lighting equation.

This is handy because I had a nice big fancy word for _LIT textures: emissive. So now, armed with both technical terms, we can accurately describe the two parts of lighting that X-Plane usually specifies by texture: albedo and emissive.

Basically the albedo texture tells what color you see when light shines on it (or rather, how much of that light is reflected back to the viewer diffusely) - it represents color information that does not generate its own light. The emissive texture describes light created by the object, and thus visible under any circumstances.

X-Plane's lighting equation is thus typically:
albedo * brightness at that point + emissive
Where "brightness at that point" is the sum of all of the lighting effects from any number of lights, the sun, ambient light, etc.

Now there is something interesting about this lighting equation: the emissive component is added to the "modulated" albedo component. So what happens if:
  • Albedo is 100% (that is, white)
  • The brightness of the sun is 100% bright (really bright day) and
  • Emissive is non-zero?
Answer: the total lighting is more than 100%!

100% of what? These lighting values are described in terms of the range of color your monitor can output, from black (0%) to white (100%). So if we have a lighting value of 120%, basically it shows up as white (100%) and the "extra" white is lost. The result is a loss of color accuracy and detail.

For 930 I have a to-do item to scale down all emissive light by a constant factor when the day time overall brightness is high.

The idea is this: in the real world, your eyes have non-linear, adjustable sensitivity to light (and the sun is really, really bright). So when the sun is out, the amount of light added by a neon sign is trivial compared to the light already on the sign from the sun. At night the sign's light is much more significant because it is relatively dark (thus the sign is in a more sensitive part of your vision and your eyes are adjusted).

In X-Plane, scaling down the emissive texture during the day will simulate its lesser effect during the day.

One more note on emissive vs. albedo texturing: ATTR_emission_rgb basically sends a certain portion of the day time (albedo) texture to the emissive part of X-Plane's lighting. But the emissive (LIT) texture is still used. So if you use ATTR_emission_rgb, don't set the emission level to full (1.0 1.0 1.0) and use a very bright _LIT texture; the result will be more than 100% brightness.


krz said...

why not add some kind of tonemapping-node before the camera/drawing the pixels. that way you have great flexibility (if your internal calculations use 32bit)

Benjamin Supnik said...

We may do tone-mapping eventually, either on the regular renderer or when running in some kind of HDR mode.

But we also still run in fixed-function. Globally scaling down emissive levels is the _simplest_ (crudest) approximation of an HDR environment, but it can be doe on any hw from a GeForce 3 or Radeon 8500 onward.

There is always room to be more clever on newer hardware. :-)