124 lines
6.1 KiB
Markdown
124 lines
6.1 KiB
Markdown
Chapter 55\
|
||
Color Modeling in 256-Color Mode {#Heading1}
|
||
---------------------------------
|
||
|
||
### Pondering X-Sharp's Color Model in an RGB State of Mind {#Heading2}
|
||
|
||
Once she turned six, my daughter wanted some fairly sophisticated books
|
||
read to her*. Wind in the Willows.* *Little House on the Prairie.*
|
||
Pretty heady stuff for one so young, and sometimes I wondered how much
|
||
of it she really understood. As an experiment, during one reading I
|
||
stopped whenever I came to a word I thought she might not know, and
|
||
asked her what it meant. One such word was "mulling."
|
||
|
||
"Do you know what ‘mulling' means?" I asked.
|
||
|
||
She thought about it for a while, then said, "Pondering."
|
||
|
||
"Very good!" I said, more than a little surprised.
|
||
|
||
She smiled and said, "But, Dad, how do you know that I know what
|
||
‘pondering' means?"
|
||
|
||
"Okay," I said, "What does ‘pondering' mean?"
|
||
|
||
"Mulling," she said.
|
||
|
||
What does this anecdote tell us about the universe in which we live?
|
||
Well, it certainly indicates that this universe is inhabited by at least
|
||
one comedian and one good straight man. Beyond that, though, it can be
|
||
construed as a parable about the difficulty of defining things properly;
|
||
for example, consider the complications inherent in the definition of
|
||
color on a 256-color display adapter such as the VGA. Coincidentally,
|
||
VGA color modeling just happens to be this chapter's topic, and the
|
||
place to start is with color modeling in general.
|
||
|
||
#### A Color Model {#Heading3}
|
||
|
||
We've been developing X-Sharp for several chapters now. In the previous
|
||
chapter, we added illumination sources and shading; that addition makes
|
||
it necessary for us to have a general-purpose color model, so that we
|
||
can display the gradations of color intensity necessary to render
|
||
illuminated surfaces properly. In other words, when a bright light is
|
||
shining straight at a green surface, we need to be able to display
|
||
bright green, and as that light dims or tilts to strike the surface at a
|
||
shallower angle, we need to be able to display progressively dimmer
|
||
shades of green.
|
||
|
||
The first thing to do is to select a color model in which to perform our
|
||
shading calculations. I'll use the dot product-based stuff I discussed
|
||
in the previous chapter. The approach we'll take is to select an ideal
|
||
representation of the full color space and do our calculations there, as
|
||
if we really could display every possible color; only as a final step
|
||
will we map each desired color into the limited 256-color set of the
|
||
VGA, or the color range of whatever adapter we happen to be working
|
||
with. There are a number of color models that we might choose to work
|
||
with, but I'm going to go with the one that's both most familiar and, in
|
||
my opinion, simplest: RGB (red, green, blue).
|
||
|
||
In the RGB model, a given color is modeled as the mix of specific
|
||
fractions of full intensities of each of the three color primaries. For
|
||
example, the brightest possible pure blue is 0.0\*R, 0.0\*G, 1.0\*B.
|
||
Half-bright cyan is 0.0\*R, 0.5\*G, 0.5\*B. Quarter-bright gray is
|
||
0.25\*R, 0.25\*G, 0.25\*B. You can think of RGB color space as being a
|
||
cube, as shown in Figure 55.1, with any particular color lying somewhere
|
||
inside or on the cube.
|
||
|
||
\
|
||
**Figure 55.1** *The RGB color cube.*
|
||
|
||
RGB is good for modeling colors generated by light sources, because red,
|
||
green, and blue are the additive primaries; that is, all other colors
|
||
can be generated by mixing red, green, and blue light sources. They're
|
||
also the primaries for color computer displays, and the RGB model maps
|
||
beautifully onto the display capabilities of 15- and 24-bpp display
|
||
adapters, which tend to represent pixels as RGB combinations in display
|
||
memory.
|
||
|
||
How, then, are RGB colors represented in X-Sharp? Each color is
|
||
represented as an RGB triplet, with eight bits each of red, green, and
|
||
blue resolution, using the structure shown in Listing 55.1.
|
||
|
||
**LISTING 55.1 L55-1.C**
|
||
|
||
typedef struct -ModelColor {
|
||
unsigned char Red; /* 255 = max red, 0 = no red */
|
||
unsigned char Green; /* 255 = max green, 0 = no green */
|
||
unsigned char Blue; /* 255 = max blue, 0 = no blue */
|
||
} ModelColor;
|
||
|
||
Here, each color is described by three color components—one each for
|
||
red, green, and blue—and each primary color component is represented by
|
||
eight bits. Zero intensity of a color component is represented by the
|
||
value 0, and full intensity is represented by the value 255. This gives
|
||
us 256 levels of each primary color component, and a total of 16,772,216
|
||
possible colors.
|
||
|
||
Holy cow! Isn't 16,000,000-plus colors a bit of overkill?
|
||
|
||
Actually, no, it isn't. At the eighth Annual Computer Graphics Show in
|
||
New York, Sheldon Linker, of Linker Systems, related an interesting tale
|
||
about color perception research at the Jet Propulsion Lab back in the
|
||
'70s. The JPL color research folks had the capability to print more than
|
||
50,000,000 distinct and very precise colors on paper. As a test, they
|
||
tried printing out words in various colors, with each word printed on a
|
||
background that differed by only one color index from the word's color.
|
||
No one expected the human eye to be able to differentiate between two
|
||
colors, out of 50,000,000-plus, that were so similar. It turned out,
|
||
though, that everyone could read the words with no trouble at all; the
|
||
human eye is surprisingly sensitive to color gradations, and also
|
||
happens to be wonderful at detecting edges.
|
||
|
||
When the JPL team went to test the eye's sensitivity to color on the
|
||
screen, they found that only about 16,000,000 colors could be
|
||
distinguished, because the color-sensing mechanism of the human eye is
|
||
more compatible with reflective sources such as paper and ink than with
|
||
emissive sources such as CRTs. Still, the human eye can distinguish
|
||
about 16,000,000 colors on the screen. That's not so hard to believe, if
|
||
you think about it; the eye senses each primary color separately, so
|
||
we're really only talking about detecting 256 levels of intensity per
|
||
primary here. It's the brain that does the amazing part; the
|
||
16,000,000-plus color capability actually comes not from extraordinary
|
||
sensitivity in the eye, but rather from the brain's ability to
|
||
distinguish between all the mixes of 256 levels of each of three
|
||
primaries.
|