М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 51
Текст из файла (страница 51)
Значение глубины вычисляется в оконных координатах и ограничивается диапазоном 10, 11. Оценка максимального углового коэффициента (т в уравнении смещения) выполняется по формуле т= п1ах —,— Полнгон с оленью наклона» О Рис. 6.5. Многоугольники н нк угловые коэффнцненты глубины Для многоугольников, параллельных ближней и дальней плоскостям отсечения, угловой коэффициент равен нулю.
Для многоугольников с наклоном, близким Отклонение многоугольников по глубине 237 к нулю, требуется небольшое константное значение смещения. Чтобы его полу'цпъ, вызовите функцию к1РО1у копОГ тает () со значениями уас(ог = 0 0 и ил(уз - 1 О. Для многоугольников, образуюших болъший угол с плоскостями отсечения, угвовой коэффициент значительно больше нуля и, соответственно, требуется большее смещение.
Небольшого, ненулевого, значения параметра 7астог, такого как 0,75 или 1,0, достаточно для получения значений глубины и устранения нежелаильных артефактов. В листинге 6.11 представлена часть кода, который с помошью списка отображекня (предположим, рисующего закрашенный объект) рисует объект с освещением, в режиме 6 С Е1 С С. Для смещения многоугольника параметры (астог и итуз заАаются равными 1.0 н 1.0. Эти значения гарантируют, что смещение будет цостаточным для всех многоугольников в сцене независимо от наклона. Затем, с целью выделения пветом границ первого объекта, объект рисуется как каркас с отключенным смещением.
Листинг 6.11. Отклонение многоугольника для устранения артефактов: ро(уоРЕ.С 1цпаша(61 116НТ>М6>; 11(паь>е(6С С16НТВ); 11Епаше(6( РОСУООМ ОЕЕ5ЕТ Е1СС); 11Ро(укопоугае((1.0, 1.0); 11(аис(а((11»1>; 110(пап(е(6С РОСТООМ ОЕЕ5ЕТ ЕХСС); 1пиааюе(61 С16НТ>М6>; 1Ш(ааые(61 116НТЕ>; 11(о>огЗГ(1 Е, 1.0, 1.0); 11Р»1укопиоее(61 ЕКОМТ АМО 8АСК, ОС С1МЕ); 1>С»11С1»1(11»1); 1!Р»1уаопионе(61 ЕМОМТ АмО 8АСК, 61 Е(сс); В некоторых случаях «легкие в расчете» значения параметров (асуог и итсу (1.0 к 1.0) — не выход. Например, если толщина линий, выделяющих границы, больше 1, может потребоваться увеличить значение(ас(ог.
Также, если значения глубнны неравномерно преобразованы в оконные координаты в процессе перспекгнвного проецирования (см, раздел «Измененная координата глубины» главы 3), меньшее смещение нужно для многоугольников, близких к ближней плоскости отсечения, а большее — для удаленных многоугольников. Опять же, эксперименты со значением параметра могут быть оправданы. Списки отображения Из этой главы вы узнаете: ° Что такое списки отображения и как использовать их в сочетании с командами непосредственного режима с целью наиболее эффективной организации и данных и улучшенной производительности ° Как извлечь максимальную эффективность из списков отображения, применяя их в нужное время и в надлежащих местах Для чего нужны списки отображения 239 Слисок отображения (Сйзр1ау 11зг) — иначе список команд или список вывода— зто группа команд ОрепОГ., сохраненных для последующего выполнения.
Когда список отображения вызывается на выполнение, команды обрабатываются в по(илке их появления в списке. Большинство команд ОрепС(. может сохраняться в списке или обрабатываться в режиме непосредственного выполнения, для краткости палее именуемом непоСредствеяяым (1птшео1ате) режимом, то есть незамедлительно. Вы можете свободно смешивать непосредственный режим и списки мобрзжения в рамках одной программы. В примерах, приводимых ранее, до сих пор использовался непосредственный режим. В атой главе обсуждается, что таксе списки отображения и каким образом их лучше использовать.
Соответственно, ее разделы посвящены следующим темам: ° Для чего нужны списки отображения. Объясняет, где используются списки отображения. ° Пример списка отображения. Содержит небольшой пример, демонстрирующий использование основных команд применительно к спискам отображения. ° Философия проектирования списков отображения.
Говорит о возможностях (таких как присвоение им статуса нередактируемых), позволяющих добиться максимальной эффективности списков отображения. ° Создание и выполнение списка отображения. Содержит подробные описания команд для создания, обработки и удаления списков отображения. ° Выполнение составных списков отображения. Показывает, как обработать последовательность из нескольких списков, здесь используется небольшой набор символов в качестве примера. ° Управление параметрами состояния с помощью списков отображения. Иллюстрирует использование списков отображения для сохранения состояния и его восстановления с помощью команд Ореп61.. Для чего нужны списки отображения Списки отображения позволяют улучшить производительность за счет использомния запомненных для последующего выполнения команд Орепб)., Максимум отдачи дает кэширование команд в списке, если вы планируете перерисовывать один и тот же объект несколько раз или вы имеете набор изменяемых состояний, которые нужно воспроизводить многократно.
С помощью списков отображения вы можете определить геометрию и/или изменяемое состояние однажды и повторить их столько раз, сколько нужно. Случай, когда вы используете список отображения для единичного запоминания, проиллюстрируем примером рисования трехколесного велосипеда. Его два задних колеса имеют одинаковый размер, но требуют отдельной прорисовки, так как смещены друг относительно друга.
Переднее колесо больше по диаметру и также находится в индивидуальной позиции. Эффективный способ передать вращение колес заключается в запоминании геометрии одного колеса в спискс отображе- 240 Глава 7 ° Списки отображения ния и последующем трехкратном вызове этого списка. Вам нужно построить соответствуюшую модельно-видовую матрицу перед каждым вызовом списка для вычисления корректных размеров и положения каждого колеса.
Когда программы Орепб?. запускаются удаленно с другого компьютера или по сети, особенно важно кэшировать команды в списке отображения. В этом случае сервер является компьютером, отличным от хост-машины. (Информацию о клиент-серверной модели ОрепО1. см. в разделе «Что такое Орепб1» главы 1.) Поскольку списки отображения являются частью состояния сервера и, следовательно, постоянно разме1цены на сервере, вы можете сократить расходы на передачу по сети повторно используемых данных, если сохраните повторно используемые команды в списке отображения. В варианте локального запуска вы также можете добиться повышения производительности за счет помещения наиболее часто используемых команд в список отображения.
Некоторые аппаратные графические средства способны сохранять списки отображения в специально выделенной области памяти или запоминать данные в форме, обеспечивающей максимум совместимости с программным обеспечением. (Более подробно вопросы оптимизации обсуждаются в разделе «Философия проектирования списков отображения».) Пример списка отображения Список отображения — это удобный и эффективный способ именования и организации набора команд Орепб(.. Например, лопустим, что вы хотите нарисовать тор и просмотреть его с различных углов зрения. Лучший способ сделать это— сохранить тор в списке отображения.
Тогда всякий раз при изменении представления вам нужно будет изменить модельно-видовую матрицу и выполнить список отображения, рисующий тор. Листинг 7.1 иллюстрирует сказанное. Листинг 7.1. Создание списка отображения: (огиз.с Г<(и1пс спеТогив; /' Рисование тора */ в(вС1с чо1О сотов(тпС пиес, !пС пиеС) ( 1пС1, ), Ооиь1е и, С, х, у, с, Снор1; сноп! (! = О; 1 < пиес; !++) ( В)аез1п(6( ()иА0 "»Та1Р); сог () = о; ) <= пиес; )++) ( Гог (К = 1; К = Е; К--) ( — (1 + К) % пиес + 0.5; с = 1 % пиес; х = (1+. 1'сов(в'(нор!/пиес))<сов(С'(норт/пиаС); у = (1». 1'сов(в'(норт/пиес))'втп((*сноп!/пиес); с = .1 5!П(5<(норт/пиес); Пример списка отображения 241 91Чег(ех3((х, у, з); 81Епб(); ) ) /' Создание списка отображения с тором и инициализация */ 5!атчс чотб !от((чо!ч!) ( (яетогцз = 916«п(!зсз(1); 31ИЕНС!Зт(СПЕТОГОЗ.
6( СОМР1СЕ); тогоз(В, 25): 31Епб3.!«С(); 813пабенобе1(6( РСАТ); 3161еагсо1ог(0.9, 6.0, 0.9, 8.0); ) ча!б б!зр1ду(чо!б) ( 3161еаг(61 СО(08 ВЧРРЕК В1Т); 31601огзт(1.6, 1.0. 1.9): 31Са11(!зт(слетогоз); 31Р1цзп(); ) ча(б ге»паре(!пт н, !пс Ь) ( 81Ч!енрогт(8, 9, (6сз!зе!) н, (6сз!зе!) Ь); 3)Масс!якобе(61 РПО)ЕСТХОИ); 31(оаб1бепт!Су(); 31ЬРегярест!«е(38, (6с(1оат) н/(61(1оас) и, 1.0, 100.9); В)Магг!хиобе(6( ИООЕСЧХЕИ); 31соаб1бепс!ту(); П)осоохяс(9, О.