М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 14
Текст из файла (страница 14)
См. разделы «Сгаживание» и «Параметры точки» главы 6). Бс ли устранение ступенчатости отключено (по умолчанию), пробное значение ши рины округляется до целого и на экране рисуется квадратная область пикселов Таким образом, если ширина равна 1.0, квадрат получается размером 1 х 1 пик сел, если ширина равна 2.0 — 2 х 2 пиксела и т. д. При включении режима сглаж!ивания или множественной выборки рисуетс группа пикселов в виде круга, и пикселы на границе обычно рисуются бледне остальных, чтобы придать границе плавный вид. В этом режиме дробные значе ния ширины це округляются. Болыпинство реализаций Орепбй поддерживают очень большой размер точки Выяснить минималы!ый и максимальньш размеры точки можно с помощью ко манды к16е(Е1оатч() со значением 6ь А11А5ЕО Р01НТ 517Е КАНОЕ.
Точно та же можно узнать диапазон размеров точки в режиме устранения ступенчатостг с помощью команды сй16еГЕ1оатч() со значением 6Ь 5МООТН РО1ИТ 517Е НАНОЕ. Поддерживаемый размер подправленной точки лежит между минималь ным и максимальным значениями. Вызов функции к16етЕ1оат() со значение 6ь 5НООТН Р01НТ 517Е 6КАНОЕАЙ1ТУ позволяет узнать поддерживаемую точ ность отображения исправленной точки. Например, если выполняется команд к1Ро! пг5! хе (7. 37), а точность равна 0.1, размер точки округлптся до 226 Подробно о линиях В ОрепО1 можно определять линии с различной толщиной и прерывистые лп нии различных видов — пунктирные, штриховые, штрихпунктирные различны типов и т.
д. Толщина линии ! тоЫ к11! пей! Отв(О?.йоа( АЛЫЙ); Устанавливает тол!пину рисуемой линии (в пнкселах). Параметр гвЫЙ должен быть больше 0.0 и по ух«олчаии!о равен 1.0. Линии, рисуемые при включенном режиме устранения ступенчатости илп множественной выборки, выглядят более ровньпии. (См. разделы «Сглаживание точек или линий» главы 6 и «Сглаживание геометрических примитивов с помощью мультивыборки» главы 6.) Без сглаживания толщина 1, 2 и 3 соответствует линиям толщиной в 1, 2 и 3 пиксела.
При включенном режиме устранения ступенчатости возможно задание дробной толщины линии, а пикселы по границам рисуются более светлыми, чем сама линия. Так же, как и в случае с размером точки, некоторые реализации Орепб1 могут ограничивать толщину исправленной линии л!аксимальной толщиной сглаженной липин, округленной до ближайшего целого значения. Диапазон возможных значений толщины исправленных линий можно узнать с помон(ью команды 616етЕ1оатч() со значением 61 А11А5ЕО Е1НЕ И10ТН РАНОЕ.
Отображение точек, линий и многоугольников 63 Для определения максимальной и минимальной толщины неисправленной линии и поддерживаемой степени точности используется функция я16еср1оасч() созначениями61 5НООТН 11МЕ И10ТН НАМ6Е и6Ь 5НООТН Ь1МЕ у)10ТН 6НАМОЬАН1Ту. ПРИМЕЧАНИЕ Запомните, что по умолчанию толщина линии — 1 пиксел, но она может казаться больше на экранах низкого разрешения.
Для экрана компьютера это не проблема, но, если Ореп6с используется для рисования на плоттерах высокого разрешения, линия в один пиксел может быть почти невидима. Для устранения зависимости толщины линии от разрешения необходимо учитывать физические размеры пикселов. ПРИМЕЧАНИЕ Для несглаженной линии ее толщина не измеряется по перпендикуляру к линии. Если абсолютный угол наклона меньше 1.0, измерение производится по оси у, в противном случае — по оси х. Рисование сглаженной линии практически эквивалентно рисованию закрашенного прямоугольника заданной ширины, отцентрированного точно по линии. Прерывистые линии Для создания прерывистых линий (пунктирных или штрихованных) используется команда я1Ь1пе511рр1е(), определяющая тип штриховки, и а1ЕпаЬ)еб(), включающая соответствующий режим: Х! Шпе51)рр1е(1, ОхЗРВ7); Х11пзспе16Г 'ь1МЕ 571РРсЕ); уо1гз а)ьз пе5С1рр1е(С!пй уасГог, С1пз)гогс раГГегп); Устанавливает текущий тип образца штриховки для линии. Аргумент раггегл — 16-битная последовательность 0 и 1, которая повторяется необходимое для протяженности линии число раз.
Единица означает, что текущий пиксел подсвечивается, а 0 — нет, Образец может удлиняться с помощью аргумента)асгог, который умножает каждую последовательность 0 и 1. То есть, если в образце присутствует последовательность из трех единиц, она удлиняется до шести, когда гасГог равен 2. Параметр уасгог принимает значения от 1 до 256. Режим прерывистых линий должен быть уже включен с помощью значения 6Ь Ь1МЕ 5Т1РРЬЕ функции я1ЕпаЬ1е(). Для его отключения используется функция я101заЬ)е() с тем же значениезн аРгумснта. В приведенном выше примере образец имеет вид ОхЗЕ07 (0011111100000111 в двоичном виде), то есть сначала рисуготся 3 пиксела, затем следует промежуток в 5 пикселов, затем рисуются 6 пикселов и пропускаются 2 пиксела.
Отсчет идет с младшего бита. При значении /исгог = 2: подсвечиваются 6 пикселов, затем промежуток в 10 пикселов, опять подсвечиваются 12 пикселов и снова промежуток в 4 пиксела. Рисунок 2.8 демонстрирует рисование линий с различным шаблоном и значением повтора.
Отключенный режим рисования прерывистых линий равносилен образцу ОхЕГГЕ без повторов — то есть сплошной линии. Помните, что прерывистые липин также могут быть определены с различной шириной. Таким образом, алгоритм вывода прерывистых линий следующий: начинаем рисовать линию, и каждый раз при рисовании каждого пиксела образец сдвигается на 1 бит (нли на уасгог пикселов, если 7ассог не равен 1). Когда рисуется серия 64 Глава 2 ° Управление состоянием и рисование геометрических объектов соединенных отрезков между одиночнымн операторными скобками а18ек1п( и к1Епо (), при переходе от одного отрезка к другому возврата к младшему б ту не происходит, и образец продолжает сдвигаться. При выполнении функц к1Епб() образец сбрасывается в начало.
Если рисуются линии с использование 6С С1МЕ5, образец сбрасывается для каждой независимой линии. Рис. 2.8. Линии с различным фактором повтора Программа из листинга 2.5 рисует линии с различными комбинациями образ и толшины линии. Также листинг демонстрирует, что произойдет, если лини рисуются как серия сегментов, а не единым блоком. Результат работы программ показан на рис. 2хй Рис. 2.9. Прерывистые линии Листинг 2.8.
Шаблоны прерывистых линий: ()пез.с Веет!пе ОганОпеь!пе(х1,у1.х2.у2) В1вей!п(6С С!ИЕ5); О1Чег(ех21((х1), (у1) ); О1чегСех21((х2), (у2) ); О1Епб(); чо!О !и!1(чо1О) ( 8161еагсо1ог(0.0, О,О, 0.0, 0.0); В15лабенобе1(СЕ ГСАТ); чо!о о!зр)ау(чо!о) ( !пт 1: к161еаг(6С СО(ой ВОГГЕЯ В1т); /* устанавливаем белый цвет дпя всех линий */ а1со1огз!(1.0, 1.0, 1.0); /* в первой строке 3 линии разного вида */ В1Епао(е(6С 11ИЕ 511РРСЕ); О1(1пе51!рр1е(1, Охв101); /* пунктирная '/ Оганопеь!пе(50.еоц 125.0, 150.0, 125.0); О1(1пе511рр1е(1. ОхООГГ); /' штрихованная */ Код ОхООГГ ОхООГГ ОхОСОГ ОхОСОГ ОхАААА ОхАААА ОхАААА ОхАААА Множитель 1 2 1 3 1 2 3 4 Отображение точек, линий и многоугольников 65 бганопеь(пе(158.8, 125.9, 250,0, 125.9); 611(пе51(рр1е(1, Ох1С47); /' штрихпунктнрная '/ бгаиопе1!пе(259.9, 125.9, 350.0, 125.0); во второй строке 3 толстые пинии разного вида */ 611(пей(б(П(5.9); 816)пе51(рр1е(1, Ох0191); /' пунктирная */ бганОпеь(пе(59.9, 199.9, 150.9, 100.8); 611!пе51)рр1е(1, ОхООРР); /* штрихованная '/ бганОпес(пе(158.9, 199.0, 250.0, 109.9); 616(пе51(рр1е(1, Ох1С47); /' штрихпунктирная "/ бгаиопеС(пе(259.9, 100.0, 350.0, 100.8); 9(С(пей(бть(1.8): в третьей строке 6 штрихпунктирных пиний */ как часть одиночной пунктирной линии '/ 616тпе51(рр1е(1, Ох1С47); /* штрихпунктирная */ 918ей(п(6С С!МЕ 5ТЙ1Р); (ог (! = 0! '! < 7; з++) 61Чегтех2г(59.8 + ((61(1оат) ! ' 50.0), 75,0); 61Епб (); /» в четвертой строке 6 одинаковых штрихпунктирных независимых линий */ !ог (! = 9; ! < 6; (++) ( бганОпес(пе(59.9 + ((61(1оат) ! * 59.0), 50.0, 50.9 + ((61(1оа!)((+1) * 50.0), 59.0); ) В пятой строке одна штрихпунктирная линия, а числа повторов равно 5 '/ 611(пе51(рр1е(5, Ох1С47); /* штрихпунктирная '/ бганопеь(пе(59,9, 25.0.
350.0, 25.0); 610(зао(е(6С 11МЕ 571РРСЕ); $1Р1чзп(); чо(б гезларе((п! н, (пт П) ( 61Ч(енрогт(9, О, (6Сз(зе!) н, (61в(зе!) П); 91натг(хиобе(61 РВО)ЕСТ1ОМ); 8)соаб1бепт(ту(): 61чогтьо20(8.9, (6Сбочо)е) н, 8.9, (61бочо)е) П); ша!п((пт агйс, сваг'* агйч) зпт 61чс1п(с(йагйс, агйч); 61ч(1п(СО(зр1аунобе(6! ОТ 51МОСЕ ! ОСОТ 868); 61ч(1п(тй(пбои5(зе(489, 159): 61011п(тйзпбонровз!зоп(108, 108); 61чССгеатей(пбои(агйч(9)); !П(с(); 61ч(0)вр1ауячпс(б»зр1ау); 61чтйезьареЕчпс(гезларе); 91чтиа(п1оор(); ге!игл 0; бб Глава 2 ° Управление состоянием и рисование геометрических объектов Подробно о многоугольниках Обычно многоугольники рисуются со сплошной закраской, но их можно рисовать в виде контура или в виде точек в вершинах.
Закраска многоугольника может быть сплошной (заливка) или фактурной по некоторому заданному образцу. Если соседние многоугольники имеют общие границы или вершины, пикселы на границах или вершинах рисуются всего один раз — они принадлежат только одному многоугольнику — с той целью, чтобы у частично прозрачных многоугольников границы не рисовались дважды, что слелало бы их более темными (или светлыми, в зависимости от цвета рисования). Результатом зтого может быть отсутствие заливки в одном илн нескольких пиксельных столбцах или строках в узких многоугольниках.
Для сглаживания закрашенных многоугольников рекомендуется использовать режим мультивыборки, Для получения более детальной информации см. раздел «Сглаживание геометрических примитивов с помощью мультивыборкн» главы б. Многоугольники в виде точек, границ или заливки Многоугольники имеют две стороны — лицевую н оборотную, которые могут быть отрисованы различно, в зависимости от того, какая сторона сейчас видна. Это позволяет получать такой разрез сплошных объектов, где ясно различаются внутренние и внешние части. По умолчанию обе поверхности рисуются одинаково. Для изменения режима по умолчанию или рисования только контура или вершин используется функция к1Ро1укопног) е () . чоЫ к! Ро1уяопнаае(С! еппш (асе, СЕепшп тоНе); Управляет режимом рисования лицевой и оборотной сторон многоугольников.