OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 61
Текст из файла (страница 61)
Если исходный инжпс больше 255, он сначала маскируется числом 255, то есть сбрасываются все 6нты старше гюсьмого, а результирующее значение замещается числом из таблипы. Если исходный индекс представлен числом с плавающей запятой (скансн, 88,14585), он будет округлен до ближайшего целого значения (давая в итога 88), и тогда уже этот номер ищется в таблице (получаем О). Используя пиксельные карты, вы можете также отображать инлексы трафарета нпп преобразовывать индексы цвета в модель ВСВ. (См. раздел «Чтение и рисомнпе прямоугольных областей» для получения информации о преобразовании ннпексов.) Гистяжение, сжатие и зеркальное отражение изображений Песне применения режимов сохранения пнкселов и операций при перелаче пиксыон изображения и битовые образы растеризуются.
В простом варианте каждоау пнкселу изображения соответствует один пиксел экрана. Вместе с тем вы нправе произвольно увеличивать н уменьшать изображение и даже зеркально отрскать (Йцн ге(!ес() его с помощью команды В1Рпхе17ооа(). 286 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений чоЫ я1Р1хе1Еоо«с(СЕ[)оаС гоотх, СЕ([оаС гооту); Задает коаффициенты растяжения (шайи[(у) и сжатия (тес[псе) для операций записи пикселов (к10гаиР]хе1з () и к! СоруР]хе1з () ) по горизонтали и вертикали. По умолчанию значения гоот„н аоот„устанавливаются в 1.
Так, если оба значения равны 2,0, каждый пиксел изображения рисуется четырьмя пнкселами экрана. Заметьте, что допускаются дробные значения факторов масштабирования, а также отрицательные. Г[оследние служат для зеркального отражения изображения относительно текущей позиции растра. Во время растеризации каждый пиксел изображения интерпретируется как прямоугольник с размералси гоот„х гоот„сс фрагменты генерируются для всех пикселов, центры которых находятся в пределах этого прямоугольника. Если говорить более точно, (х; у ) является текущей позицией растра.
Если определенная группа элементов (индексов или компонентов) строки п принадлежит столбцу т, рассматриваемая нами область в оконных координатах ограничена прямоугольником с углами (х е зоот» х л, у, + гоотх х т) н (х„+ аоот„(л + 1), у + зоот„(т + 1)). Все фрагменты с центрами внутри прямоугольника (или на нижней или левой границе) ставятся в соответствие означенной группе элементов.
Отрицательные значения гоот используются при зеркальном отражении изображений. ОрепСЕ описывает изображения в направлении от нижнего ряда пиксе. лов к верхнему (и слева направо). Если вы имеете изображение вида «сверху вниз», такое как видеокадр, вы можете захотеть воспользоваться операцией к1Р]хе1200«с (1.0, 1.0), чтобы получить из изображения правильное с точки зрения ОрепС[.. Убедитесь, что вы задали верную текущую позицию растра, если это требуется.
Листинг 8А демонстрирует использование к1Р]хе1Еоое О. Изображение шахматной лоски изначально находится в левом нижнем углу окна. При нажатии кнопки мыши или при передвижении мыши вы можете использовать к16оруР(хе1б() для копирования изображения пз исходного положения в окне в точку, соответ. ствующую положению указателя мыши. (Разумеется, копировать изображение само в себя не имеет смысла!) Копируемое изображение масштабируется; пе умолчанию с коэффициентом 1.0, но вы вправе задать другое значение.
Клавиша х и 2 связаны с увеличением и уменьшением коэффициента лсасштабирования вз значение 0.5. Любое «повреждение» содержимого окна влечет за собой перервсовку последнего. Нажатие клавиши г сбрасывает коэффициенты в первоначаль. нос состояние. Листинг 8.4. Рисование, копирование и масштабирование пикселов; кпайе.с №Ье11пе свесь]еакеисЕСЬ 64 №Ее11ле сьесх[яэзеНе!кЬС 64 6(ььу(е сьесх1ваае[сьесх]еааеНе1№ЬС] (свеев]еабен!ЕСЬ] [3]; зСаС]с 6[ооише соовбасСог = 1,0: 5СаС]с 6Ь(ЬС Ье1ХЬС: 288 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений Листинг Вгф (продолжение) чотб Кеуооагб(цпз)Хлеб сьаг Кеу, !п1 х, 1пс у) ( зи!ссп (!сеу) ( сазе 'г': сазе 'й': зоовуас1ог = 1.0; ХсцСРозтаеб!зр!ау(); рг1п11("масштабный козффициент сброшен в 1.01п"); Ьгеан; сазе хоовгасСОГ е= 0.5; 1! (соовгассог >= 3.0) хоовйасгог = 3.8; ргтпС!("текущее значение масштабного коэффициента Х4.
11'тп", зоовйас(ог); ьгеах; сазе 'Х': хооврас1ог -= 0.5; ! 1 (хоовйастог <= 0.5) хоовуасСог = 0.5; рг1птт("текущее значение масштабного коэффициента %4. 1('тп", хоовуасгог); Ьгеах; сазе 27: ех1С(0); Ьгеах; бе!ам(С: Ьгеах; ) ) Чтение и рисование прямоугольных областей Этот раздел подробно описывает процесс чтения и отображения прямоугольных областей пикселов.
Преобразование при чтении из буфера кадров в память похо. же на преобразование в обратном направлении — рисование, но не идентично ему. Материал этого раздела не обязателен при первом чтении, особенно если вн не планируете сразу начать выполнять подобные преобразования. Процесс вывода пиксельного прямоугольника Следующий список и рпс.
8.12 описывают операции отображения пикселов в буфер кадров. 1. Если пикселы представлены не индексами (то есть их формат отличен от 61 СОСОК 1ИОЕХ или 6с 5ТЕИС1С 1ИОЕХ), на первом шаге компоненты преобразуются в числа с плавающей запятой. (Подробности преобразования представлены в табл. 4.1.) 2, Если задан формат 6С СОМ!МАИСЕ нли 6с 'сОМ1ИАИСЕ АЕРНА, элемент яркости преобразуется в компоненты К, О и Б с назначением равной доли каждому Чтение и рисование прямоугольных областей 289 компоненту. Если формат — 6С СОН1МАМСЕ АСРНА, величина альфа-компонента равна значению А, которое, если указан параметр 6С СОН1НАИСЕ, устанавливается в 1.0. Рис.
8.12. Рисование пиксепов с помощью фогааР!хек() 3. Каждый компонент (К, С, В, А или глубина) умножается на соответствующий размерный козффициент, с добавлением смешения (Ь(аз). Например, компонент К умножается на величину 6С РЕО 5САСЕ и после к нему добавляется значение 6 С Р Е Р В 1 А 5. Е Если параметр 6с НАР сосок установлен в таце, каждый из К-, О-, В- и А- компонентов, ограниченный диапазоном [0.0, 1.0), умножается на целое число, меньшее на единицу размера таблицы, обрезается и ищется в таблице подставовки. (См. раздел «Советы по увеличению быстродействия вывода пикселов».) 5.
Затем К-, С-, В- и А-компоненты ограничиваются диапазоном [0.0, 1.0[, если зто еще не сделано, и преобразуются в число с десятичной точкой с таким количеством битов левее точки, сколько нужно для помещения в буфер кадров. 5. Если вы работаете с индексами (цвета или трафарета), сначала значения пре- образуются в числа с десятичной точкой (если они исходно представлены 290 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений в формате с плавающей запятой), с некоторым количеством неопределенных битов справа от точки. Для индексов, изначально представленных десятичными числами, любые биты справа от десятичной точки сбрасываются в нуль. Результирующее значение индекса сдвигается вправо пли влево в соответствии с абсолютным значением параметра 6С 1МОЕХ 5Н1ГТ; значение сдвигается влево, когда 6С 1МОЕХ 5Н1РТ > О, и вправо — в противном случае.
В заключение к индексу добавляется смешение 6ь 1мрех ОРР5ет. 7. Слелующий шаг зависит от используемой модели цвета — КСВА или инлексной. В первом случае индекс цвета преобразуется в КСВА с использованием параметров 6С Р1ХЕС МАР 1 ТО Р, 61 РХХЕС МАР 1 ТО 6, 6С РХХЕС МАР ! ТО В и 6С РХХЕС МАР 1 ТО А(см. раздел «Табличные преобразования пикселов»). Во втором варианте, если 6С МАР СОСОР определен как 6С ТРОЕ, индекс цвета замещается по таблице подстановки 6С РХХЕС МАР 1 ТО 1. (Если 6С МАР СОСОР— 6С РАС5Е, индекс не изменяется.) Когда изображение представлено индексами трафарета и если 6С МАР 5ТЕМС1 С определен как 6С ТРОЕ, используется таблица подстановки 6С РХХЕС МАР 5 ТО 5. Если 6С МАР 5ТЕМСХС вЂ” РАС5Е, индекс трафарета ие изменяется.
8. Наконец, если индексы еще не конвертированы в КСВА, они маскируются к количеству битов, нужному для буфера индекса цвета нли трафарета. Процесс считывания пиксельного прямоугольника Многие из преобразований, имеюших место во время отображения пиксельного прямоугольника, применяются и в процессе чтения данных из буфера кадров. Порядок чтения пикселов представлен следующим списком и на рис. 8.13. 1. Если читаемые пикселы не индексированы (то есть их формат отличен от 6Х СОСОР 1МОЕХ или 6С 5ТЕМСХС 1МОЕХ), они попалают в диапазон 10.0, 1.0~ — то есть имеет место противоположная процессу рисования ситуация.
2. Затем каждый компонент масштабируется со смегцением. Если параметр 6О МАР СОСОР равен 6С ТРОЕ, зги компоненты таблично преобразуются и снова сводятся к диапазону ХО.О; 1,0], При преобразовании от КСВ к яркости компоненты К, С и В суммируются (1 = К + С + В). 3. Если пикселы представлены индексами (цвета или трафарета), они сдвигают. ся (зП11теп), смещаются (оЪет) и, если параметр 6С МАР СОСОР установлен в 6С ТРОЕ, таблично преобразуются. 4. Если формат хРанения пикселов — 6С СОСОР 1МОЕХ или 6ь 5ТЕМСХС 1МОЕХ, индексы маскируются к количеству битов, поддерживаемому устройствои хранения (1, 8, 16 или 32), и упаковываются в память, как описано ранее.