М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 59
Текст из файла (страница 59)
8.4. Порядок размещения компонентов для некоторых типов данных и форматов пиксела 61 0М516ЙЕО ВУТЕ 3 3 2 61 0Й516МЕО ВЧТЕ 2 3 3 КЕЧ 61 0М516МЕО 5НОРТ 5 б 5 61 0М516ЙЕО 5НОКТ 5 б 5 КЕЧ 61 ОМ516МЕО 5НОРТ 4 4 4 4 61 0Й516МЕО 5НОКТ 4 4 4 4 йЕЧ 61 0М516МЕО 5НОКТ 5 5 5 1 61 0М516МЕО 5НОКТ 1 5 5 5 КЕЧ 61 0Й516МЕО 1МТ 8 8 8 8 61„0Й5!6ЙЕО 1МТ 8 8 8 8 КЕЧ 66 0М516МЕО 1МТ 10 10 10 2 61 0М516ЙЕО 1ЙТ 2 10 10 10 КЕЧ бг К68 61 Р68 И К68 61 К68 6Е РОВА,ОЕ ВОРА 61 РОВА,бг 86РА 66 К6ВА,61,86КА 6Е РОВА, 61 86КА 6Е РОВА,61 ВОРА 61 РОВА,6Е 86КА 61 РОВА,61 86КА 6Е РОВА,ОЕ 86КА 274 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений Самый старший бит каждого компонента цвета всегда пакуется в позицию самого старшего бита отведенного поля.
Размещение отдельного компонента не зависит от режима хранения пикселов, но подчиняется принятому порядку следования байтов в слове. (См. раздел «Режимы хранения пикселовэ.) Запись пикселов из оперативной памяти в буфер кадров чоЫ к10 г айР ! хе(5(С1л1ге[ жЫ(Ь, 01л1ге] Ье[8Ьс, 01 епшп/ос)пас, 01 епшп суре, сопят 0].чоЫ «рстей); Отображает прямоугольник из пикселов, с шириной в[!ссЬ и высотой Ье[8Ьс. Левый нижний угол прямоугольника соответствует текущей позиции растра. Аргументыуогпмгт и Суре несут ту же нагрузку, что и для функции г1Реа 0 Р(хе15 () (см. табл. 8.1 и 8.2.).
Массив рстей содержит данные для отрисовки. Если текущая растровая позиция некорректна, никакого вывода не производится. Листинг 8 3 представляет собой часть программы, использующей я(0 г айР ! хе] 5 () для отображения прямоугольника пикселов в левом нижнем углу окна. Процедура вакеслесК1ваке О создает КСВ-массив 64 х 64 черно-белого изображения шахматного поля.
Команда к1РавтегР052! (9, О) позиционирует изображение в левый нижний угол. И опять-таки пока не обращайте внимания на команду к1Р! хе15Соге! (). Листинг 8.3. Использование команды о[Огаи(Р!хе[во; [глаце.с №бес!пе спеск1вагей!бСЬ 64 №бес!пе слеск1вагеае16ПС 64 6саьуСе слеск1ваге [сьеск1вагеНе! 6ЬС] [олеся]вагей1бСП] [3]; чосб вакеслеск1ваге(чо!б) ( !пс(,),с; гаг (! = 0; 1 < спеск1вагене!ЗПС; 1++) ( гог (> = 9, > < слеск1вааей!бСП; ]++> ( с = ((((1авхз)==0)~((]веха))==9))'255; сье<Х1ваге[1][]][9] = (6СаьуСе) с; слеса1ваге [ 1] [ 1 1[ 1] = (6саЬуте) с; спеск1ваге[1][)][2] = (6саьусе) с: ) ) чо!б 1п!С(чо1б) ( 6]С]еагСо]ог(0.9.
9.0, 9.0, 0.0); 915лабеиобе((6С РСАТ); вакеслеск]вазе(); 6]Р!хе]5(оге!(6С НМРАСК АС]6МНЕМТ, 1); ) чо!б б!вр1ау(ча1б) ( 6]С]еаг(6С СОСОР ВНРРЕР В]т>; 6]аав(егРов2!(9, 9); 6\ЬганР(хе]в(слеск1вазей10СП, слеск1вагеие16ПС, 6С Р66, Конвейерная обработка изображений 275 6С ЦМ516МЕО ВЧТЕ, снесХ1ваце); ц1Р10»Н О ~ ) Когда вы используете В?бгаиР(хе?з() для записи ВОВА-данных или индексов цвета, вам может потребоваться выбрать текущий буфер для рисования команЦой В10 гаиВи т ге г (), которая, как и В1РеаО Вот те г (), описана в разделе «Выбор йуферов цвета для записи и чтения» главы 10.
Копирование пикселов в пределах буфера кадров чо1г? В?СоруР(хе1з(О??пт х, С1?пг у, 6?яке? вата, О1яхе? Ье(ВЬГ, С?еппш Пиууег); Копирует прямоугольную область внутри буфера кадров с позицией левого нижнего угла (х, у), шириной иЫтг) и высотой Ье(ВЬГ. Левый нижний угол целевого прямоугольника совпадает с текущей позицией растра.
Аргумент 6иууег это либо 6С СОСОР, либо 6С 5ТЕМС11, либо 61 ОЕРТН, он указывает тип используемого буфера. Функция В1СоруР(хе1з О ведет себя аналогично последовательности из В1РеааР(хе1з() и В10гаиР!хе1з(), с промежуточным «преобразованием» константы Визг в аргумент ?оплат; ° если ЬиДег — 61 ОЕРТН или 61 5ТЕМС11, используется 61 ОЕРТН СОНРОМЕМТ нли 61 5ТЕМС11 1МОЕХ соответственно; ° если указано значение 61 СОСОР, используется 6С Р6ВА или 61 СОСОР 1МОЕХ, в зависимости от режима — ВОВА или индекса цвета. Пчяетьте, что в аргументах уогглаг или г?ата при использовании 61СоруР(хе1з () игг необходимости, так как данные никогда не поступают через оперативную паюпь. Исходный и целевой буферы для В1С ору Р( хе1ц () указываются с помощью ?веаОВоутег() и В10гаиВоттег() соответственно.
Как 610гаиР1хе1з(), так ц11(оруР1хе1ь () используется в листинге 8А. Зля всех трех функций то, насколько верно преобразуются поступакпцие из бу- $«Ра кадров или передаваемые в него данные, зависит от текущего режима. Об вам мы поговорим в следующем разделе. (?онвейерная обработка изображений Пцтои разделе рассказъшается о конвейеризации обработки изображений (ппай(п8 ц1)ю?1не): режимах сохранения пикселов и операциях прн передаче пикселов, нлючающих в себя произвольные преобразования данных.
Вы можете растянуть ма сократить прямоугольную область перед ее отображением с помощью команцв11Р1хе11ооюо. Последовательность этих операций показана на рис. 8.5. Прн вызове В10ганР1хе1ь() данные сначала распаковываются из оперативной вкати согласно режимам хранения пикселов, а затем к ним применяются преоб?ноаання при передаче. Результат растеризуется. Во время растсризапии прямольннк пикселов может быть масштабирован в обе стороны, в завис имости от текущего состояния.
В заключение выполняются операции над фрагментами 276 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений и пикселы записываются в буфер кадров. (См. раздел «Тесты и операции над фрагментами» главы 10). При вызове 81йеаОР)хе1з () данные считываются из буфера кадров, аналогичным образом преобразуются и упаковываются в оперативную намять. Функция к1С ору Р1 х е1з ( ) выполняет промежуточные преобразования при передаче, подобно 81йеаОР1хе1з () . Результирующие данные записываются подобно а10 гав Р) хе1з (), но во второй раз преобразования не применяются. Рисунок 8 6 демонстрирует, как в1Сору Р)хе1з () передает пикселы от самого буфера кадров. Рис.
8.5. Конвейеризация обработки изображений Рис. 8.6. Маршруг пиксепов при выполнении р!Сорур~хе)зП Конвейерная обработка изображений 277 Из раздела «Вывод битового образа> и рис. 8.7 вы можете составить представлевие, что воспроизведение битового образа прогце воспроизведения изображений и счет отсутствия перечисленных выше промежуточных преобразований. Рис.
8.7. Путь пнкселов прн выполнении д18йварВ Обратите внимание, что режимы сохранения пикселов и операции при передаче применяются к текстурам, когда те читаются из памяти текстур или записываются инее. Рисунок 8 8 демонстрирует зффект от команд 81тех1ааде* (), 81Тех5ип1ваде*() и 816еттех1иаде(). Рвс. 8.8. Пути пнкселов прн выполнении д1Техвпаде*(), д1техдиЫгпадеь() н д1пегтехьпаде[] )(зх видно из рис. 8.9, когда пикселы копируются из буфера кадров в память текпур (81Сорутех1ааке" () или 81СоруТехбоЫваде*()), применяются только операции при передаче. (См. главу 9 для получения большей информации о текаурах.) 278 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений Рис.
8.9. Пути пихсепов при выполнении д)Сорутех1п~аде"() и д)СорутехдиЫтаде*в Упаковка и распаковка пикселов Упаковываются или распаковываются пикселы, определяется тем, в каком направлении следуют данные — на запись или чтение из оперативной памяти. Изображение сохраняется в памяти в нескольких элементах. Данные могут представляться просто индексом цвета или значением яркости (то есть средневзвешенным значением красного, зеленого и синего компонентов) или же быть выра.
жены красным, зеленым, синим и альфа-компонентом (РСВА) для каждого пиксела. Возможное размещение данных пикселов, то есть формат, определяется количеством элементов и их порядком. Некоторые элементы (такие как индексы цвета или трафарета) являются целочисленными, а другие (РСВА или глубины) — значениями с плавающей запятой (вещественными), обычно в диапазоне между О и 1. Вещественные компоненты обычно сохраняются в буфере кадров с более низкпм разрешением, чем позволяет число с плавающей запятой (например, компонентам цвета может отводиться по 8 бит). Точное количество битов, используемых для представления компонентов, зависит от особенностей аппаратной части.
Таким образом, сохранение каждого компонента в виде 32-разрядного вещественного числа часто теряет смысл, тем более что изображения могут содержать миллионы пикселов. Элементы могут сохраняться в памяти с различными типами данных, от 8-разрядного байта до 32-разрядного целого или числа с плавающей запятой. ОрепЯ. явно определяет преобразование каждого компонента в каждом формате для ка. жного допустимого типа данных. Имейте в виду, что вы можете потерять данные, если попытаетесь сохранить компонент высокого разрешения с типом, предста. вимым малым числом битов.
Конвейерная обработка изображений 279 га- зд- ве- раэго гся лотой «ты !ен- ясл, разаО1. ! каные, (ста- Режимы хранения пикселов Данные изображения обычно сохраняются в оперативной памяти в виде прямо- )гольных (двух- или трехмерных) массивов.