OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 34
Текст из файла (страница 34)
Это напоминает смешивание красок на палитре художника; аналогично цветовая палитра в компьютере ограничивает множество ВСВ-значений избранными, соответствуюшими заданным индексам, как показано на рис. 4.4. Художник рисует сцену, выбирая цвета из палитры и закрашивая требуемгяе области нужным цветом. Компьютер хранит цветовые индексы в битовых плоскостях для каждого пиксела. Затем данное значение битовой плоскости сопоставля- йбВА в сравнении с индексированным цветом 153 ется с цветовой таблицей, и на экране рисуется пнксел требуемого цвета, как показано на рис.
4.5. Красный Синий Номер о 1 2 3 4 б 296 Рис. 4.4. Карта цветов Рис. 4.5. Использование цветовой карты для рисования изображения В режиме индексации цвета число доступных цветов ограничено размером цветоюй карты и числом доступных битовых плоскостей. Размер цветовой картпя оппепеляется возможностями оборудования. Он всегда кратен двум и обычно лепит в пределах от 256 (2") до 4096 (2 о), где показатель степени — число битовых ппоскостеьь Если в цветовой карте солержится 2" индексов и доступно т битовых плоскостей, количество доступных записей равно меньшему значению из 2" и 2". В режиме йОВА цвет каждого пиксела не зависит от цвета других пикселов. Азот в режиме индексов цвета каждый пиксел связан с соответствующим значеппем индекса в цветовой таблице. Если содержимое элемента цветовой таблицы вменяется, все пикселы с таким значением индекса меняют цвет.
выбор между режимами КбВА и индексации цвета Выбор между этими двумя режимами должен производиться на основе возможностей вашего оборудования и ваших требований. Для подавляющего количества спстем большее число цветов доступно в режиме йОВА, чем в режиме индекса- 154 Глава 4 ° Цвет ции цвета. Также для некоторых эффектов, таких как затенение, освещение, текстурирование и туман, КСВА предоставляет более гибкие возможности, в сравнении с индексацией. Использование индексации цвета оправдано в следующих случаях: ° Если приложение, оперирующее индексированными цветами, переносится на другую платформу. ° Если число битовых плоскостей невелико, режим КСВА дает достаточно жалкий набор цветов.
Например, при наличии всего 8 битовых плоскостей в режиме КСВА доступны только 3 бита на красный, 3 бита на зеленый и 2 бита на синий. То есть возможны только 8 (2') градаций красного и зеленого, и только 4 градации синего. Переход между различными цветами чрезвычайно груб. Тогда, при ограниченных требованиях к передаче полутонов, предпочтительней использовать цветовую таблицу для загрузки большего числа набора цветов. Например, если нужна только синяя гамма, цветовая таблица позволяет хранить 256 (2") синих полутонов, что гораздо лучше, чем 4 градации в режиме КСВА. Конечно, таким образом вы заполните всю таблицу оттенками синего цвета, и у вас не будет ни красного, ни зеленого, ни каких других комбинаций.
° Режим индексации цвета очень удобен для различных хитростей, таких как анимация и рисование в слоях. (См. главу 14 для получения дополнительной информации.) Вооб|це говоря, используйте режим КСВА везде, где это возможно. Он работает с текстурами и хорошо сочетается с освещением, затенением, туманом, размытн.
ем и смешиванием, Переключение между режимами Допустим, вы не можете выбрать между режимом КСВА и индексации цвета. Например, вам нужны н анимация с индексированными цветами, и текстурирование, то есть режим КСВА. Илн же вам потребовалось переключиться между режимами одиночной и двойной буферизации. Например, у вас очень мало битовых плоскостей, скажем, восемь. В режиме одиночной буферизации в вашем распоряжении 256 (2') цветов, а режим двойной буферизации, нужный для устранения мерцания при анимации, дает только 16 (2") цветов. Предположим, что требуется нарисовать движущийся обьект без мерцания и вы готовы пожертвовать цветностью ради двойной буферизации (может быть, объект движется слишком быстро, и точная детализация не нужна — кто различит детали на такой скорости). Но когла объект останавливается, надо нарисовать его в режиме одиночной буферизации, уже полноцветным.
К сожалению, большинство оконных систем не позволяют так легко переключаться между режимами. Так, в системе Х %1пбозч режим отображения цвета— атрибут объекта Х т'1зпа1. А объект Х Ъ'1зпа! должен быть определен до создания Задание цветовой и полутоновой моделей 155 Задание цветовой и полутоновой моделей ОрепС1 поддерживает текущий цвет (в режиме ВСВА) и текущий индекс пвета (а режиме индексации цвета). Пока не используется более сложная цветовая мопель, такая как освещение или текстурирование, каждый объект рисуется этим теку>>)им цветом (или индексом цвета).
Посмотрите на следуюпгий псевдокод: ает со1ог(ЯЕ0); бган ! теябя); бган )ген(В): >ет со1ог(цяЕЕИ); ает со1ог(ВГ ця); бгач >ген(С); Элементы А и В рисуются красным, а элемент С вЂ” синим. Четвертая строка, устанавливающая цвет в зеленый, не имеет смысла (кроме того, что дает задержку ао времени). Без освещения илн текстурирования, если текущий цвет установлен, впоследствии все элементы рисуются этим цветом, пока он не будет сменен. 3Вдание цвета в режиме И ВА режиме ВСВА текущий цвет устанавливает команда я1Со!ог* ().
чоЫ ~1Со1о г 3(Ь я 1 1 г( пЬ пя ш)(ТУРЕ г, ТУРЕ д, ТУРЕ (>); чоЫ ~1Со1ог4(Ь з 1 1 г1 пЬ пз ш)(ТУРЕ г, ТУРЕц, ТУРЕ 6, ТУРЕ а)г чоЫ д1Со1огЗ(Ь з 1(г( пЬ вя ш)ч(сопяс ТУРЕ»п); чоЫ я1Со1ог4(Ь я 1 Е г( пЬ ця ш)ч(сопят ТУРЕ "и); Определяет текущие значения для красной, зеленой, синей и альфа-составляюгцпх.
Эта команда может иметь три суффикса, обозначающих различные параметры. Первый суффикс — 3 или 4, признак задания альфа-значения. Если альфа-значение не задается, оно принимается равным 1.О. Второй суффикс определяет тип данных аргументов: байт (Ьуте), короткое целое (зЬогг), пелое (гпгейег), вещественное (Пояс), двойной точности (г(опЫе), беззнаковый байт (нпа)япег( Ьусе), беззнаковое короткое целое (ппз(дпег( зЬогс) или беззнаковое целое (ппзгяпег( 1пседег). Третий суффикс — ч, отвечает за то, является ли аргумент указателем на массив значений заданного типа данных.
о г- о >й Для версий я1Со1о г" (), принимающих в аргументах вещественные данные, значения должны быть в диапазоне от 0.0 до 1.0, минимального и максимального аначеннй, которые могут быть сохранены в видеобуфере. Компоненты типа целое ия еяна, то есть не может меняться при жизни окна.
Фактически вы «ггриклеивае- тесь» либо к двойной буферизации, либо к режиму РСВА. Хитроумное решение этой проблемы — создание более одного окна, работающего а собственном режиме. Вам остается только управлять видимостью окон (отобра- жать или не отображать в системе Х 1)(г(пг(о>ч, управлять или не управлять видже- тами Мот>(и Асйепа) и рисовать об'ьект в подобаюгцсм, видимом окне. 156 Глава 4» Цвет Значения и вещественного типа, и знакового целого преобразуются к диапазону (О, 1] перед обновлением текущего цвета или параметров освещенности текущего материала.
После вычисления освещенности результирующий цвет, попадающий вне диапазона (О, 1), приводится в рамки данного диапазона перед интерполяцией или записью в видеобуфер. Если освещенность отключена, ограничивание компонентов цвета делается перед растеризацией. Таблица 4.1. Приведение значений цвета х вещественному типу Суффикс Тип данных Минимальное Минимальное Максимальное Максимальное значение значение значение значение приводится к приводится к 1-ЬуСе(пгедег 2-Ьуте спгедег 4-Ьуте сптедег ипзгдпеб 1-Ьуге (птедег ппядпеб 2-Ьуге гпгедег опйдпеб 4-Ьуге гпгедег †1 -1.0 — 32 768 -1.0 — 2147483648 -1.0 0 0.0 127 32 767 2 147 483 647 255 1.0 1.0 1.0 1.0 иЬ 0.0 65 535 1.0 4 294967 295 1.0 Оз ц( 0.0 Аналогичная команда 815есопбагуСо1ог*() предусмотрена для определения цвета, применяемого после текстурирования (если отключено освещение).
(Для получения более подробной информации см. раздел «Применение вторичного цвета после текстурирования» главы 9.) Задание цвета в режиме индексации цвета В режиме индексации цвета для выбора индекса цвета в качестве текущего ис- пользуется функция 611п бе х ' () . то(б 811пбех(яИ иЪ)(ТУРЕ с); тоЫ 811пбех(я(б цЪ)т(сопзС ТУРЕ "с) Устанавливает текущий индекс цвета н с. Первый суффикс команды опреде- ляет тип значений аргументов: короткое целое (зЪогс), целое ((псеяег), вещест- венное (Попс), двойной точности (допЫе) или беззнаковый байт (цпяяпеб Ъусе). Второй, опциональный, суффикс определяет, является ли аргумент мас- сивом значений заданного типа данных (массив содержит только одно значе- ние).
число без знака (ппяяпеб шсеясг) линейно преобразуются (с!атреб) к вещественному типу, максимальное значение приравнивается к 1.0, а 0 приравнивается к 0.0. Компоненты типа целое число со знаком (яягсеб (пседег) линейно преобразуются к вещественному типу, причем ограничиваготся сверху значением 1.0, а снизу — значением — 1.0 (табл.
4.1). Задание цветовой и полутоновой моделей 157 В разделе «Очистка окна> главы 2 было приведено описание функции В1С(еагсо1ог(). Для режима индексации цвета прелусмотрена аналогичная функция В1С1еа г1пдех О. уоЫ В1С1еаг1пдех(СЕ()оа( сгис(ех); Устанавливает текущий цвет очистки в режиме индексации цвета. Значение индекса очистки по умолчанию равно 0,0.
При включенной индексации цвета тот же эффект даст команда В1С1еаг(ОС СОСОК ВОРРЕП В1Т), ПРИМЕЧАНИЕ В Орепбь нет команд для загрузки значений цветов в цветовую таблицу. Эти операции обычно выполняет оконная система. Осцт предоставляет функцию о)ц(бе<со<от(), которая вызывает специфичную для оконной системы команду.