blob: e6eca2390eea7d73fc7a27e9ca8dd2e45a44130a [file] [log] [blame]
/* FFB fog support:
*
* There are two levels of support for FOG in the Creator3D series.
* Both involve a depth cue unit and 1 or 4 slope factors and scales
* for varying the pixel intensity.
*
* Chips prior to FFB2 only have a single set of such settings, FFB2
* and later have 4 settings.
*
* The basic depth cueing equation is:
*
* C_final = dcsf(z) * C_orig + (1 - dcsf(z)) * C_fog
*
* C_final -- The final color passed to blend unit or frame
* buffer (if blending is disabled).
*
* C_orig -- The color we start with, which comes either from
* the raster processor or cpu writes to the smart
* framebuffer aperture.
*
* C_fog -- This is the "fog" color, ie. the desired color
* at the deepest Z.
*
* dcsf(z) -- The depth cue scale as a function of Z.
*
* With pre-FFB2 chips there are four parameters to control the depth
* cue scaling. Here is a diagram:
*
* 1.0 -------------
* | | | |
* | | | |
* Sfront XXXXX---+---+
* | |X | |
* dcsf(z) | | X | |
* | | X| |
* Sback +---+---XXXXX
* | | | |
* 0.0 -------------
* 0.0 Zf Zb 1.0
*
* z
* Therefore:
*
* for Zf < z < Zb
*
* dcsf(z) = Sback + ((Sfront - Sback) / (Zf - Zb)) * (Zb - z)
*
* for z <= Zf
*
* dcsf(z) = Sfront
*
* for z >= Zb
*
* dcsf(z) = Sback
*
* With FFB2 and later, 3 more slope regions are provided, the first of
* them starts at the end of the region defined above and ends at a
* specified depth value, the next slop region starts there and ends
* at the next specified depth value, and so on. Each of the 3 slope
* regions also have scale and slope settings of their own.
*
* The C_fog color is programmed into the alpha blending unit color1
* and color2 registers as follows:
*
* color1: -(C_fog)
* color2: C_fog - bg
*
* If alpha blending is disabled, the bg factor is zero. Note that
* the alpha blending color registers specify each of the RGB values
* as 9 bit 1:8 signed numbers in the range -1.00 to 0.ff inclusive.
* (ie. 0x100 == -1.00 and 0x0ff == +0.ff)
*/