М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 56
Текст из файла (страница 56)
(Подробную информацию о списках отображения см. в глане 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Оерспмаппе ().
Если используется векторная форма команды, все координаты помещаются в массив соогг(а В варианте я1И(пбоиРоэ2'() аргумент г неявно равен О. Для получения текущих координат растра (ранее установленных а1маэсегРоэ*() ялв я1И)пбоиРоэ*()) вы можете использовать запрос я1беСЕ1оатч() с первым 264 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений аргументом, равным БС СОКРЕМТ РА5ТЕК Р051Т10М. Второй аргумент должен быль указателем на массив значений (х, у, г, т) в формате с плавающей запятой. Из результата вызова к16еСВ001еапу() с первым аргументом БС СОРРЕМТ КА5ТЕК Р051Т10М НАС10 можно узнать, действительна (уа)Ы) ли текущая позиция растра. Вывод битового образа Установив необходимую позицию растра, вы можете использовать команду 818! Свар() для вывода данных.
тЬ к18! сваР(С(Яге( т(с(гЬ, СЕз(ге( Ье(8ЬД С1()оаС х,ы СЕйоаС Ум, С(.боаС хы СЕЛоас уы, сопзс С) иЬусе "Ь(стар); Рисует битовый образ, указанный аргументом Ьйтар, значение которого представляет собой указатель на данные изображения. Битовый образ располагается в соответствии с текущей позицией растра. Если она недействительна, ничего це происходит. Аргументы ЫгЬЬ и Ье!8ЬГ залают ширину и высоту битового образа в пикселах.
Ширина не обязана быть кратной 8, хотя при сохранении данные будут выровнены по значению 8. (В примере с буквой Р избыток «мусорных» битов правее левых (О нс принципиален: все равно 818! с!вар () отрисует столько битов, сколько нужно, в нашем случае — 10 у каждого ряда.) Используйте аргументы хы, и у,„для описания начальных координат битового образа относительно текущей позиции растра (положительные значения поднимают рисунок вверх и смешают вправо; отрицательные— сдвигают вниз и влево); аргументы х», и у„отвечают за приращения текущей позиции растра — ее координаты х и у изменятся на эти значения после завершения операции (рис, 8,2).
и= (О (х»„ у ) = (0,0) (х,, у;) = (М,о) ь=(2 00 11,0 Рмс. 8.2. Битовый образ и связанные с ним параметры Такое разграничение «обязанностей» удобно тем, что позволяет размещать произвольным образом символы, опущенные ниже базовой линии (обычно с подстрочными элементами, такие как «8», «)» и «у»), буквы с орнаментом или перекошенные влево символы (в шрифтах с левым наклоном). По окончании рисования образа текущая позиция растра смещается на значения х„и у»«(Если вашей целью является лишь перемещение текущей позиции, лучше вызвать 818! Свар() с аргументом ЬЫтар, установленным в МВСС, и нулевыми значениями ширины и высоты (гвЫ(Ь и Ье(РЬг).) Для стандартной латиницы у„ обычно задается как 0.0, а х», положительно (в соответствии с направлением Битовые образы и шрифты 265 письма слева направо).
Для иврита (шрифт НеЬге»ч), где направление письма противоположное, значение хи, соответственно, отрицательное. Для шрифтов, предполагающих вывод знаков в столбец вертикально, хи равно О, а уи — ненулевое, На рис. 8.2 для каждого экземпляра буквы Г текущая позиция передвигается вправо на 11 пикселов, тем самым образуется межсимвольный интервал шириной в пиксел. Поскольку х»„, у»„, х„и уи — числа вещественные, то и размер символов не ограничивается только целыми значениями. Хотя при отображении символов от расположения их по пикселам на растровых экранах никуда не уйти, все равно текушая позиция вычисляется в формате с плаваюшей ваня~ой, с целью избежать накопления погрешности при выводе последующих символов. Например, если код примера с буквой г модифицировать таким образом, чтобы хи стало равным 11.5 вместо 12, и продолжить рисование дальше, интервал между буквами будет либо 1, вибо 2 пиксела, что максимально приближено к требуемой дистанции в 1,5 пиксела.
ПРИМЕЧАНИЕ Предлагаемые средства не позволяют поворачивать символы растровых шрифтов, поскольку предполагают выравнивание битового образа относительно осей х и у буфера кадров. Также не поддерживается масштабирование битовых образов. Выбор цвета для битового образа Вы уже знакомы с командами я1601ог'() и я11лпех*() для установки текущего шгета или его индекса на примере геометрических примитивов.