М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 34
Текст из файла (страница 34)
° Режим индексации цвета очень удобен для различных хитростей, таких как анимация и рисование в слоях. (См. главу 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Т), ПРИМЕЧАНИЕ В Орепбь нет команд для загрузки значений цветов в цветовую таблицу.
Эти операции обычно выполняет оконная система. Осцт предоставляет функцию о)ц(бе<со<от(), которая вызывает специфичную для оконной системы команду. ' Текущий инлскс хранится как значение вещественного типа. Целые значения преобразуются к вещественным напрямую. Значения за пределами диапазона инаексов пветов не полнергаются ограничиванию. Однако перед размытием (ссли жлючепо) и записью в видеобуфер индекс преобразуется в вещественный форматес фиксированной точкой. Все биты в целой части результирующего значения <фиксированной точкой, которые не соответствуют битам в видеобуфере, игнорируются. 3Вдание модели закрашивания Линия или залитый многоугольник могут быть нарисованы одним цветом (за;:ивха) или множеством различных цветов (градиентная заливка, также называемая а)крагииеаггием ио Гуро), Нужный метод определяется функцией к15ладемоде1 О.
В15ладеноде! (ОЕепшп тоде); Устанавливает модель закрашивания. Аргумент тодге может иметь значение 6( 5МООТН (по умолчанию) илц ОС Р(АТ. При сплошной закраске цвет одной определенной вершины независимого привнтива дублируется в направлении всех вершин примитива. При градиентной зав<вке цвет каждой вершины рассматривается разпельно. Если зто линия, цвета внтерполируются между цветами вершин отрезка. Для многоугольника цвета в<у)ренней области вычисляются путем интерполяции цветов вершин.