OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 55
Текст из файла (страница 55)
Теперь мы рассмотрим визуализацию данных двух других важных классов ОрепО1г ° битовых (двоичных) образов, которыми обычно представляются символы шрифта; ° изображений, как просто отсканированных, так и сгенерированных программно. Оба этих типа являются прямоугольниками — двумерными массивами пикселов. Единственная разница между ними состоит в том, что для битового образи (Ыгшар) каждый пиксел представлен одиночным битом, а изображения (1п1айе) обычно подразумевают соответствие каждому пикселу нескольких элементов данных (например, информацию о компонентах: красном, зеленом и синем). То есть битовые образы подобны маскам, накладываемым на другие изображения, а изображения перезаписываются на месте других данных в буфере кадров илн смешиваются с ними.
В этой главе рассказывается, как передать на отрисовку пикселы из оперативной памяти в буфер кадров и как считать их в обратном направлении. Здесь также описывается, как копировать пикселы из одной позиции в другую, между буферами или в пределах одного буфера. ПРИМЕЧАНИЕ Орелбс не поддерживает чтение пнкселов в файл н чтение нх нз файла. Эта глава состоит из следующих основных разделов; ° Битовые образы и шрифты. Здесь описываются команды для позиционирования и рисования данных, представленных битовыми образами. Битовые образы обычно используются для представления шрифтов. ° Изображения. Предоставляет базовую информацию о рисовании, чтении и копировании пикселов.
° Конвейерная обработка изображений. Описывает операции, производимые над изображениями и битовыми образами во время чтения их из буфера кадров и записи их в буфер. ч Чтение и риСование прямоугольных областей. Здесь вы найдете подробные сведения о том, как пикселы хранятся в оперативной памяти н что с ними происходит при извлечении пх из памяти и сохранении в ней. ° Советы по увеличению быстродействия вывода пикселов.
Список советов, направленных на лучшую производительность операций рисования пикселоа. ° Расширение !шайшй ЯцЬзег. Информация о расширении ОрепСБ для дополнительной обработки пикселов. В большинстве случаев действия над пикселами сводятся к простейшим операциям, поэтому для понимания того, как создать соответствующее приложение, вам достаточно ознакомиться с первыми тремя разделами этой главы. Но манипулирование пикселами может быть и более сложным делом — пикселы можно Битовые образы и шрифты 261 нв-разному хранить в памяти и выполнять их передачу в буфер и обратно также разными способами.
Этим тонкостям посвящен четвертый раздел главы. Скорее всего, информация этого раздела вам понадобится не ранее того момента, когда вы перейдете к практическим действиям. Здесь вам окажутся полезными рекомендации разлела «Советы гю увеличению быстродействия вывода пикселовм В реализации ОрепОЕ версии 1.2 гюявилась упаковка данных (таких как 6Е 'эй516ИЕО ВУТЕ 3 3 2 и 6Е ОИ516ИЕО ТИТ 10 10 1В 2) в форматы ВСКИ ВСКА. В этой же версии появился набор операций над изображениями, включающий в себя преобразование цветовых матриц, подстановку цвета по таблице, гистограммы н дополнительные операции смешивания (81В1епо ециагцоп О, 6101еппсо1ог () и еще несколько констант режимов).
Это расширение получило название!тай!пд Уибхег. В версии 1.4 эти новые операции смешивания были переведены на урояень ялра Орепб) . Версия 1А также позволила испольэовать функции смешивания источника 61 5ЦС СОЕОИ и 6Е ОИЕ И1И05 5ИС СОЕОИ так же, как 61 05Т СОЕОИ и 6Е ОИЕ Н)И05 05Т СОЕОИ вЂ” целевые функции смешивания. Еще в ней появилась функция 51И! пвоиРоэ* О для указания растровой позиции в системе оконных координат. Битовые образы и шрифты Битовый образ (Ьйшар) — это прямоугольный массив, состоящий из нулей и единнн, который служит маской для прямоугольной области окна.
Допустим, что вы рисуете битовый обршэ и при этом текущий растровый цвет — красный. Тогда во всех позициях массива, в которых находятся елиницы, соответствующие пикселы будут замещены на красный (нли скомбинированы с красными пикселами, что эависит от характера операции). (См. раздел «Тесты и операции над фрагментамнь главы 10.) Там же, где окажутся нули, пикселы остаются без каких либо изменений, Чаще всего битовые образы находят применение лля отображения символов на экране. ОренС1 обеспечивает только самый низкий уровень поддержки отображения строк символов и управления шрифтами.
команды В1иаэгегроэ«() (или альтернативная ей 61И1пооиРоя* О) и 81В)алваро позиционируют и отображают на экране только одни битовый образ. В дополнение к этому имеется механизм списков этображения, позволяющий обработать последовательность из кодов символов, связанных по индексу с соответствующими битовыми образами. (Подробную информацию о списках отображения см. в глане 7.) При необходимости произвоцнть более сложные действия нал битовыми образами, шрифтами и строками символов вам потребуется подготовить собственные процедуры. В листинге 8.1 приведен пример программы, три раза отображающей на экране символ Г. Рисунок 8.1 демонстрирует этот символ как битовый образ, вместе сего двоичными (нулями и единицами) данными.
Обратите внимание, что ца рис. 8.1 максимальная ширина видимой части символа Е составляет 10 бит. Хотя горизонтальный размер массива битов всегда 262 Глава В ° Вывод пикселов, битовых образов, шрифтов и изображений кратен 8, фактическая ширина битового образа не обязательно должна быть кратной 8. Отсчет и отображение битов ведутся от левого нижнего угла: первым отображается нижний ряд, затем — расположенный над ним и т. д, Как можно увидеть из кода, битовый образ хранится в памяти в этом порядке — сначала следугот числа ОхСО, ОхОО, ОхСО, ОхОО, соответствующие двум нижним строкам, и заканчивается он значениями Охрр, ОхСО, Охрр, ОхСО, то есть верхними двумя рядами.
Листинг 8.1. Рисование битового образа символа: бгаччГ.С Осивусе гавгегв(24] = ( Охсв, ВхОО, Охс8, Ох80, Охсо. Вх00, Охс8, ОхОО, ОхсО, Ох08, Вх(Г, Охов, Вх((, Ох00, Вхс0. Ох00, ОхсО, Ох00, Охов, Вх09, Вх(Г, ВхсО, Вх((, Вхсв); чо]о 1п11(чо16) ( 91Р]хе15(оге](ОС ЬМРАСК АС1ОМНЕМТ, 1): 91С1еагСо1аг(0.0, 0.0, 0.0, 0.0); ) чо1Е Епвр1ау(чатв) ( 91С1еаг(ОС СОСОа ВОЕЕЕа 81Т); 91СЬ1огз((1,9, 1.0, 1.8); 9]ааз(еггов21(28, 20); 9181(вар(10, 12, 0.0, 0.0, 11.0, 8,0, гавтегв); 918(свар(10, 12, 9.0, 0.0, 11,0, 0.0, гав(егв); 919((ваР(19, 12, О.О, О.О, Ы.О, О.О, гак(егз), 91Р1овп(); Ох(С ОхсО Ох((, Охсс Охсз, ОхОО ОхсО, ОхОО Охс0.
ОхОО Охт(, Ох00 Охг(, Ох00 ОхсО, Ох00 ОхсО. ОхОО ОхсО. ОхОО ОхсО. Ох00 Охсс. ОхОО Рис. Влц Битовый образ буквы Р и кодировка его данных Здесь для нас также интересны команды 91аав(ег Р0521 () и 91В(свар (); онн обсуждаются в подробностях в следующем разделе. С]то касается функции а1 Р ( хе 1510 г е1 ( ) — пока не обращайте на нее внимания; она относится к способу хранения данных битового образа в памяти компьютера (см. раздел «Режимы хранения пикселов» для получения подробной информации). Текущая позиция растра Текущая позиция растра — это координаты того места экрана, куда будет выведен следующий битовый образ (или изображение).
В примере с буквой Г растровзя Битовые образы и шрифты 263 позиция устанавливается вызовом я1цаэтегРоэ' (), присвоением значений (20, 20), с этого места начинается вывод нижнего ряда битового образа: тсяглсегеоэ21(го, 2О); чо!с! я1цаэтегРоэ(234)(э!Я)(ТУРЕ х, ТУРЕ у, ТУРЕ г, ТУРЕ се); чоЫ е1пазсегРоэ(234)(э!И)ч(ТУРЕ "сооггсл); Устанавливает текущую позицию растра.
Лргументы х, у, г и ш указывают координаты растрового объекта. Если используется векторная форма функции, аргумент соогбэ определяет все необходилсые координаты. В варианте В1ааэ Се г Роэ2* () аргумент г неявно приравнивается нулю, и значение аргумента ш также неявно задается равным 1; аналогично, для команды я1яаэтегРоэЗ'() значение и — 1, Координаты позиции растра преобразуются в координаты экрана так же, как коюрдннаты, принимаемые функцией а1негсех'() (то есть с использованием молельно-видовых матриц (щос(е!ч!ечч) и перспективы).
После преобразования эти координаты проверяются па принадлежность окну просмотра (ч!елчрогт) и отсекаются, если выходят за границы видимой области. В последнем случае текущая позиция растра считается некорректной (!Оча(!с(). До версии 1 4, если вы хотели указать растровую позицию в оконных координатах, это требовало указания макетной (особе!ч!елч) и проекционной матриц для Обычной отрисовки в стиле 2Р, примерно так, как в следующей последовательностн команд, где свЫ()с и Ье(й)сг — размеры области просмотра в пикселах: 11патг!хМобе(ОС Рао)ЕСТ1ОМ); т!(оаб1бепт)су(); 11бпгтьогэ(В.В, (О(тссат) итбть, О.В, (щтсбаС) Пе)ППС); 11патгсхМобе(СС МООЕСН1ЕИ); тстбгбтбепт! СУ(): В версии 1.4 в ваше распоряжение предоставлена команда я1И)пбоиРоэ" () как иьтернатива для я1РаэтегРоэ*().
Команда п1И(пбоиРоэ*() принимает оконные координаты позиции растра, не требуя их матричного преобразования, но не отсекая их по размерам области просмотра. Функция а1И)пбоиРоэ*() облегчает свешнвание 21)- и ЗП-графики, выполняя за вас скучную задачу переключения между состояниями. чо!б а1И1пбоиРоэ(23)(э(Я(ТУРЕ х, ТУРЕ у, ТУРЕ г); чо!б п1И)пбоиРоэ(23)(э!Ы)ч(ТУРЕ "сооггЬ); Устанавливает текущую позицию растра, принимая аргументы х и у, указанные в оконных координатах, без выполнения матричных преобразований, отсечения, подсветки или генерирования координат текстуры. Значение г преобразуется согласно текущим значениям (ими ограничивается— с!аптрес(), задаваемым функцией я1Оерспмаппе ().