OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 20
Текст из файла (страница 20)
Она ничего не рисует. Вы должны завершить выполнение, как описано в разделе «Шаг 3: раэыменование и рисование», и вызвать функцию д(АггауЕ$евепгО, д$РгаггЕ!ввела, д$РгаугаапдеЕ)евептэ() или 9$0гашАггауэ() для раэыменования элементов массивов и рисования графики. Группы атрибутов Из раздела «Управление основными состояниями» вы узнали, как установить или запросить отдельные состояния или параметры состояния. Это неплохо, но вы можете сохранять и восстанавливать значения набора связанных параметров состояния с помощью всего одной команды. ОрепС(.
объединяет связанные параметры состояния в группы. Например, параметр 6( (1йЕ В1Т сочетает в себе пять параметров состояний: толщины ли- Я. У2Г Г Я. ЧЗГ Г 6( С408 Ч2Е Г 6$. С408 ЧЗГ Г 6$. СЗЕ ЧЗГ Г 6( йЗГ УЗГ 6( С4Г йЗГ ЧЗГ Г 6( Т2Г ЧЗГ Т Я. Т4Е Ч4Г Т 61 Т2Г С408 ЧЗЕ Т 6( Т2Е СЗГ УЗГ Т 6( Т2Е йЗЕ УЗЕ Т 6( Т2Е С4Г йЗГ ЧЗЕ Т 6$. Т4Г С4Г йЗГ Ч4Г Т Г 2 Г Г 3 Т Е 4 2 Т Г 4 3 Т Г 3 3 Г Т 3 Т Т 4 3 Г Е 2 3 Е Г 4 4 Т Г 2 4 3 Т Г 2 3 3 Г Т 2 3 Т Т 2 4 3 Т Т 4 4 4 0 2$ 0 ЗГ с с+21 с с+31 ЗГ 61 ЗГ 61 ТГ 101 21 5Г 41 ВГ с+ 21 с+ 56 51 ВГ 51 ВГ 91 12$ 11Г 151 Группы атрибутов 87 нии, состояния 6( С?МЕ 5Т?РРСЕ, шаблона прерывистой линии, фактора повтора и состояния 6С С?МЕ 5НООТН (см. раздел вСглаживаниеь главы 6).
Команды к1РизПА(тг! Ь() и к\РорАттг! Ь() позволяют сохранять и восстанавливать одновременно все пять параметров состояния. Некоторые параметры состояния включены в несколько групп. Например, 6С СО(С РАСЕ одновременно входит в наборы атрибутов многоугольников и активаций. Начиная с версии 1.1, ОрепО?. поддерживает два различных стека атрибутов.
Дополнительно к основному стеку (который хранит значения серверных параметров состояния), су)цествует клиентский стек атрибутов, доступ к которому осуществляется командами к1РизЬС1!еп(Я(тг!ЬО и к1РорС1!еп(А(тг!ЬО. В целом, использовать эти команлы быстрее, чем получать, сохранять и восстанавливать значения самостоятельно. Некоторые значения могут поддерживаться на аппаратном уровне, и получить их не всегда просто.
Также, если работа идет на удаленном клиенте, все данные перемещаются по сети для их получения, записи или восстановления. Тем не менее ваша реализация ОрспСБ может разместить стек атрибутов на сервере, устранив тем самым ненужную сетевую задержку. Существует около 20 различных наборов атрибутов, которые могут быть сохранены и восстановлены посредством функций к1РозПАГ(г(ЬО и к1РорА(тг! ЬО. Также есть два клиентских набора атрибутов, которые могут быть сохранены и восстановлены функциями В1РоэПС1! ептАтт г ! Ь() и к1РорС1! еп(А(гг ! Ь (). Как для сервера, так и для клиента атрибуты сохраняются в стеке с минимальной глубиной 16 групп. (Чтобы узнать реальную глубину стека для вашей реализации, выполните команду я16ет?птекегчО со значениями аргументов 6( НАХ АТТР1В 5ТАСК ОЕРТН и 6С НАХ С(?ЕМТ АТТР1В 5ТАСК РЕРТН.) Помещение информации в переполненный стек или ее получение из пустого вызывает ошибку.
(См. приложение Б для получения информации о том, какие атрибуты записываются для определенных значений маски, то есть какие атрибуты принадлежат определенным группам). чоЫ к1РивЬАГСг!Ь(О?.Ьй((е!Й тай); чо!о к1РорА(т г! Ь(чоЫ); Функция 61РизЬАттг1Ь() сохраняет все атрибуты, определяемые битами значения аргумента тай, в стек атрибутов, Функция к1РорПА(с г ! Ь () восстанавливает значения параметров состояния, сохраненных последним вызовом функции к1 Ро в ПА( г г ! Ь О.
В табл. 2 6 приведен список возможных битов маски; они могут быть объединены логическим ИЛИ (ОК), что позволяет сохранять практически любую комбинацию атрибутов. Каждый бит соответствует набору отдельных параметров состояния. Например, 6С С?6НТ?М6 В? Т объединяет все параметры состояния, связанные с освещением, что включает в себя цвет текущего материала, фоновый, рассеянный и отраженный свет, самосвечение, список активных источников света и направление распространения света. При вызове функции В1РорА(тг! Ь() все эти параметры восстанавливаются. Специальная маска 6С АСС АТТР?В В1Т5 предназначена для сохранения и вос- становления всех параметров состояния во всех наборах атрибутов. 88 Глава 2 ° Управление состоянием и рисование геометрических обьектов Таблица 2.6.
Группы атрибутов Группа Маска Буфер накопления уоЫ Б1РизпС11епгдттгтЬ(С)?ЫйеЫ тай); тоЫ В1РорС11епСАСтг(Ь(ноЫ); Функция Б1РцзПС1(епсдтгг(Ь() сохраняет все атрибуты, определяемые пара- метром таз)г, в клиентском стеке атрибутов. Функция В1РорС1)ептдттг)Ь() восстанавливает значения параметров состояний, ранее сохраненных послед- ним вызовом В1РцзПС1)епгдгсг)Ь().
В табл. 2 7 приведен список символиче- ских имен для битов маски; они могут быть объединены логическим ИЛИ, что позволяет сохранять любую комбинацию клиентских атрибутов. Две клиентские группы атрибутов, обратной связи и выбора, не могут быть сохранены или восстановлены с помощью стека. Таблица 2.7. Клиентские группы атрибутов Маска Группы БС СС1ЕМТ Р1ХЕС 5ТОРЕ В1Т БС СС1ЕМТ ЧЕРТЕХ АРКАУ В1Т 6С АСС ССЕЕМТ АТТР1В В1Т5 Не могут быть сохранены или восстановлены Не могут быть сохранены или восстановлены Хранение пикселов Массив вершин Обратная связь Выбор бг АССОМ ВОЕЕЕР В)Т БС АСС АТТй1В В1Т5 бг СОСОК ВОЕЕЕР В1Т БС СОййЕМТ В1Т 6( ОЕРТН ВОЕЕЕР В1Т 6( ЕМАВСЕ В1Т БС ЕЧАС В!Т БС Е06 В1Т БС Н1МТ В1Т БС (16НТ1МБ В!Т БС С!МЕ В1Т бб (151 В1Т 6( МОСТ15АМРСЕ В!Т БС Р1ХЕС МОВЕ В1Т 6( Р01МТ В1Т 61 РОГУБОМ В1Т 6( РО!УБОМ 5Т1РРСЕ В1Т 6( 5П550й ВГТ БС 5ТЕМС11 ВОЕЕЕР В1Т 61 ТЕХТОРЕ В1Т БС ТРАМ5ЕОРМ ВЕТ БС Ч1ЕЧ)РОРТ В1Т Буфер цвета Текущий Буфер глубины Антивация Оценка Туман Подсказки Освещение Линия Список Множественная выборка Пиксел Точка Многоугольник Фактурный многоугольник Отсечение Буфер трафарета Текстура Деформация Точна наблюдения Несколько советов по построению полигональных моделей поверхностей 89 Несколько советов по построению полигональных моделей поверхностей Ниже рассмотрены несколько методов, применяемых при полигональной аппроксимации поверхностей.
Возможно, когда вы более подробно познакомитесь с освещением и списками отображения (главы 5 и 7), вам захочется еще раз вернуться к этой главе, поскольку это связанные темы. Условия освещения определяют внешний вид рисуемой модели, а некоторые из приведенных ниже приемов более эффективны в связке со списками отображения. Помните, что при вычислении освещенности для получения хорошего результата должны быть определены векторы нормалей.
Полигональная аппроксимация поверхностей — это целое искусство, и ничто пе заменит опыта. Но мы постарались наполнить этот раздел несколькими «указателями», которые будут способствовать вам в легком старте. ° Соблюдайте непротиворечивую ориентацию многоугольников. Делайте так, чтобы при просмотре снаружи все многоугольники поверхности были ориентированы в одном направлении (все или по часовой стрелке, или против нее). Поддержка целостной ориентации многоугольников очень важна для отбраковки и при двухстороннем освещении. Попытайтесь следовать этому правилу с самого начала, это поможет избавиться от проблем в будущем. (Если используется функция а15са1е» () с целью отражения геометрических объектов симметрично относительно каких-то осей, следует сменить ориентацию с помощью функции ~1ГгопГГасе() для поддержания непротиворечивости.) ° При разбиении поверхностей следите за всеми нетрсугольными многоугольниками.
Три вершины треугольника гарантированно лежат в одной плоскости, а уже для вершин четырехугольника такой гарантии цет. Неплоские многоугольники с некоторых точек могут выглядеть пересекающими сами себя, и ОрепСЕ не сумеет правильно их отобразить. ° Всегда существует обратная зависимость между скоростью рисования и качеством изображения. Если разбить поверхность на небольшое число многоугольников, то отрисовка будет быстрая, но может появляться зубчатостгн если же сгенерировать миллионы многоугольников, надо думать, выглядеть это будет хорошо, но потребуется много времени на отрисовку. Идеально — вволить специальный параметр в процедуры разбиения, определяющий, насколько хорошо требуется выполнять разбиение, и, если объект рисуется на глазах, можно будет огрубить разбиение.