abrash-black-book/55-01.md
2013-12-30 20:26:41 +11:00

124 lines
6.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.
![](images/55-01.jpg)\
**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.