OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 58
Текст из файла (страница 58)
Помните, что в зависимости от формата читается (нли записывается) от одного до четырех элементов. Например, если выбран формат 6с НОВА и вы читаете в 32- битовые целые числа (то есть если Гуре равен 6с ОИ516ИЕО 1йТ или 6с 1МТ), каждая операция чтения потребует 16 байт памяти (четыре компонента по четыре байта на компонент). Таблица 8.2 показывает, как каждый элемент хранится в памяти. Если значение представляет собой не дискретную величину, например компоненты цвета илн яркость, оно масштабируется с целью вписаться в отведенное количество битов. Так, допустим, что красный компонент изначально указывается числом с плавающей запятой в интервале между 0 и 1.
При необходимости упаковать его в байт без знака точность будет ограничена восемью разрядами, невзирая на то, сколько реально число занимает в буфере кадров. Величины 6( О И 516ИЕ 0 5 НОРТ и 6Е Ой516йЕО 1МТ дают 16 и 32 бита точности соответственно. Знаковые версии: 6с ВАХТЕ,6( 5НОйт и 6Е 1ИТ вЂ” имеют 7, 18 и 31 битточности, посколькуотрицательными значениями цвет обычно не представляется. Если элемент является индексом (цвета, трафарета и др.) н тнп не 6 Е Р ЕОАТ, значение просто маскируется по количеству доступных для типа битов. Маски для знаковых версий — 6Е ВУТЕ, 6Е 5НОРТ и 6Е 1МТ вЂ” на олин бит меньше. Например, если индекс цвета задается 8-битовым целым со знаком, значение сначала маскируется как Ох7Е. Если тип — 6Е РЕОАТ, индекс просто конвертируется в число с плавающей запятой одинарной точности (например, индекс 17 преобразуется в вещественное число 17,0).
Для «упакованных» типов данных (константы которых начинаются с 6( ОИ516ИЕО ВУТЕ ', 6Е ОМ516МЕО 5НОКТ ' или 6с ОМ516йЕО 1МТ ') все компоненты цвета каждого пиксела уплотнены в отдельный беззнаковый тнп данных: один байт, короткое целое или обычное целое число. Допустимые форматы для каждого типа представлены в табл. 8.3. Если используется недействительный формат, генерируется ошибка 6Е !М«А(10 ОРЕКАТ1ОИ.
Порядок значений цвета в битовых полях для упакованных данных определяется форматом пиксела и налпчием в константе суффикса ИЕт'. Без последнего компоненты цвета располагаются обычным образом, когда первый компонент находится в самых старших разрядах. Если задан суффикс КЕН, компоненты пакуются в обратной последовательности, начиная с младших разрядов.
Изображения 273 Табпина 8.3. Допустимые форматы пикселов для упакованных типов данных Действующие форматы 1пп упакованных данных Сказанное иллзострирует рис. 8.4, па примерах битовых полей 6Е 0й516йЕО ВУТЕ 3 3 2, бЕ Ой516МЕО ВУТЕ 2 3 3 йЕЧ, ичетырехдопустимыхсочетаний типа 61 Чй51бйЕО 5НОРТ 4 4 4 4 (и КЕЧ) с форматами РСВА/В(ЖА. Битовые попадаяя всех прочих 14 допустимых комбинаций выглядят аналогично. ОЕ ОМЗ1ОМЕО ВЧТЕ 3 3 2 с ОЕ РОВ 7 6 б 4 3 2 1 0 ОЕ,ВМЗ!ОМЕО РТЕ 2 3 3 мЕЧс Ос йОВ 7 б 5 4 3 2 1 0 ОЕ,ОМЗ1ОМЕО ЗНОЙТ 4 4 4 4 с И,ВОВА 15 14 13 12 11 10 9 8 7 б 5 4 3 2 1 0 И,ОМЗ!ОМЕО ЗНОНТ 4 4 4 4 с ОЕ ВОВА 15 14 13 12 11 10 9 8 7 б б 4 3 2 1 0 ОЕ ОМЗКЗМЕО ЗНОЯТ 4 4 4 4 МЕЧ с ОЕ НОВА 15 14 13 12 11 10 9 8 7 6 б 4 3 2 1 0 ОЕ ОМЗЙЗМЕО ЗНОНТ 4 4 4 4 ЯЕЧ с О~,ВОНА 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Рнс.
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СоруТехбоЫваде*()), применяются только операции при передаче. (См.