OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 84
Текст из файла (страница 84)
(См. цветной рис. 28 в качестве примера; и работу «Раз( ЯЬас!отнз апд ЫВЬ((пя Енес(з Пз(пйт Тех(!!ге Марри!8» Марка Сегала (Маг1с Вейа!), Карла Коробкина (Саг! КогоЫсщ), Рольфа ван Виденфельта (1(о!1нап %"Ыеп(е!1), Джима Форана ()(щ Рогап) и Пола Хэберлн (Рац1 НаеЬег11), труды конференции 81ССВАРН 1992 [Сотритег Сгар/ттск 26:2, )п1у, 1992, с 249-252] для получения более подробной информации.) Другой пример — карта текстуры образована на основе фотографии, в которую перспектива уже заложена.
Как и для прожектора, здесь конечное изображение ивисит от сочетания двух преобразований перспективы. Пссобие по текстурам от Нэйта Робинса Пособие по текстурам от Нэйта Робинса предоставляет всплывающее меню для цюсмотра 4 х 4 матриц текстур, внесения в них изменений и для наблюления за юзаиным эффектом. 382 Глава 9 ° Наложение текстур Глубина текстур Опробовав технику освещения поверхности (см, главу 5), вы быстро заметите, что источники света ОрспОЕ не приводят к отбрасыванию каких-либо теней. Цвет каждой вершины вычисляется независимо от других объектов сцены. Чтобы получить тени, вам следует выяснить н зафиксировать, какие поверхности (или части поверхности) становятся препятствием на пути прямого распространения света.
Многопроходная техника использует текстуры глубины (дергЬ гехгпгез), предоставляющие решение для воспроизведения теней. Если вы временно передвинете точку наблюдения в позицию источника света, вы обнаружите, что все освещенные им элементы сцены не дают теней в перспективу. Текстуры с учетом глубины обеспечивают механизм сохранения значений глубины для всех «неомраченных» фрагментов в теневой карте (зпаг)оч вар).
При воспроизведении своей сцены, если вы сравниваете каждый входягций фрагмент с соответствующим значением глубины в карте теней, вы можете выбрать, что рисовать, в зависимости от того, где должно быть затенение. Идея схожа с тестом на глубину, с той разницей, что делается это из точки наблюдения, в которой расположен источник света. Вот ее концентрированное изложение: 1.
Воспроизведите сцену с расположением источника света в точке наблюдения. Неважно, как вообще сцена выглядит; вас должны интересовать только значения глубины. Создайте карту теней, захватывая значения буфера глубины и сохраняя их в карте текстуры («теневой» карте). 2. Сгенерируйте координаты текстуры с координатами (з, г), привязываясь к позициям в пределах карты теней, с третьей координатой текстуры (г), как расстоянием от источника света.
Затем нарисуйте сцену еще раз, сравнивая значения г с соответствующими значениями глубины с целью определения, в каких местах фрагменты находятся под светом или в тени. Следуюгцие разделы содержат более подробное объяснение, а примеры кода иллюстрируют каждый из представленных шагов. Создание «теневой» карты Первый шаг — это создание карты текстуры со значениями глубины. Вы создаете ее посредством построения сцены с условием, что точка наблюдения совпадает с позицией источника света.
Код нз листинга 9.17 вызывает команды к16еГ- с)кпт1ч() для получения текущей позиции источника света, вычисляет нужный вектор, а затем использует его для видовых преобразований. Листинг 9.17 начинается с установки размеров окна просмотра, согласованного с картой текстуры. Затем устанавливаются соответствующая проекция и видовые матрицы. Объекты сцены отрисонываются, и результирующее изображение глубины копируется в память текстур для использования ее в качестве карты теней, Наконец, окно просмотра сбрасывается в его оригинальные размеры и позицию.
Глубина текпур 383 Отметьте для себя несколько моментов: е гт >й 1]ка(г!хиосе(6С РНО>ЕСТ]ОМ); 11горИа С г ! х (); 1]аа(г!хипае(61 НООЕСЧ]ЕН): го яе у >й. ° Матрица проекции управляет формой источников света, представляя как бы «абажур». перемен ныс [[[[]>тросу и [[л]>Его>есд передаваемые в к1и Ре г 5 рес с ! чсо, управляют размером «абажура». Маленькое значение [[я]сгрооу больше подходит для прожектора, а большое значение — для софита, прибора рассеянного света ((]пас[[[я]>с).
° Ближняя и дальняя плоскости отсечения для лампы ЯдЬЖеагр[апе и [[аЬТРагр[апе) отвечают за точность представления значений глубины. Попробуйте найти «золотую середину» для цих, с тем, чтобы точность была максимальной. ° После того как значения глубины попали в буфер глубины, вам нужно захватить их оттуда и поместить в карту текстуры в формате 6С ОЕРТН СОИРОМЕМТ.
В листинге 9.17 для получения текстуры из содержимого буфера глубины используется команда к1Сорутех1оаке20(). Как и для любой текстуры, обеспечьте равенство размеров изображения текстуры степени двойки. Листинг 9.17. Воспроизведение сцены с источником света в точке наблюдения: 5[>а([оччгпар.с смпС ч!еирпгС(4]: 5(г]п»С 1!ХПСРо»[«]; 115«с[!кьгтч(61 С]6нто, 61 РО5]Т]ОМ, 1!Хпсяп»); 111«11п(еаегч(6С Ч1ЕНРОИТ, ч!еирогС); 11меирогС(О, О, 5НАООН НАР И10ТН, 5НАООН ИАР НЕ16НТ); 11(1«аг(6С СОСОН ВОТРЕН В[Т ] 6С ОЕРТН ВОТРЕН В]т>; 11Н»Сг!хиоае(6С Рао]ЕСТХОМ); 11РмПМатг!х(); 11[»»а]пел С! Су(>; 11»Рег»ресС(че(1!Ил(Точу, 1!ВПСА»ресС, 1!ХПСМеагР1апе, 1!ХПСР»гР1апе); 11Н»Сг!хиосе(6С ИООЕСЧ1ЕН); 11Рч»П Ма! г ! х (); 11[»»ШаепС! СУ(); 1>чсп»ХА!(1! ХПСРп» [В], 1! ХПСРоз [1], 1! ВНСРо» [2], 1оокаС [О], 1ооааС [1], 1оп>саС [2], пР[В], пР[1], оп[2] >: !гаке а > ес С 5 (): 1>Р»РН»Сг!х(); 11(орутех1ааке20(6С ТЕХТОНЕ 20, О, 61 ОЕРТН СОИРОМЕМТ, О, О, 5НАООН ИАР Н10ТН, 5НАООН ИАР НЕ16НТ, В); 1>иеирпгС(ч!еирогС[В], чъеирогС[1], ч!еирогС[2], ч(еирогс[3]); 384 Глава 9 ° Наложение текстур Генерация координат текстур и их отображение Листинг 9.18.
Вычисление координат текстур: 5]1а([очгл)ар.с (продолжение) 61(1аат (врна1г]х [16]: 8]иагг1хиоае(6( НООЕСЧ]ЕИ); 81РЬ»ЬНа(г1х(); 81(оае]ееос](УО; 81тгап»1а(е((8.5. 8.5, 0.0): 815са1ет(8.5, 0.5, 1.8); 81ЬРег»рест!че(1!ВЬ(речу, 1[ВЬ(А»рес1. 118Ь(неагР1апе, 118Ь(рагР1апе); 8]О(ООКА((118Ь(РО»[о].
118Ь(РО»[ и, 1]ВЬ(РО»[2], 1оойат [В], !ооха( [ 1] . 1ооха1( 2], ар [0], ар[ 1] . ар [2] ); 8164(Р]оатч(ВС НООЕСЧ]ЕИ НАТй[Х, (арик(г]х); 81Рориатг[х(); 1гап»ро»ена(г1х(терла(г!х); 61 ТЕХТОМЕ 6ЕМ МОВЕ, 6( 08)ЕСТ ([МЕАМ); 6( ТЕХТОйЕ 6ЕМ МООЕ, 6( ОВ)ЕСТ ([МЕАМ); 6( ТЕХТОйЕ 6ЕМ МОВЕ, 6( ОВ)ЕСТ С]МЕАМ): 6( ТЕХТОйЕ 6ЕМ НООЕ, 6( ОВ!ЕСТ С]МЕАМ); 81Техсеп](61 5, 81Техбеп](6(. Т, 81Техбел[(6( й, 81Техбеп[(6( О, 6( ОВ) ЕСТ Р(АМЕ, а(арМэтг(х [В] ); 6( ОВ) ЕСТ Р(АМЕ, атврнатг! х [4] ) ] 6( ОВ)ЕСТ РЕАМЕ, атериагг1х[8]): 6( ОВ)ЕСТ Р(АМЕ, а(ирна(г]х[12]); 81техбеп(ч(6( 5.
81техбеп(ч(6( Т, 81техбептч(6( й, 81техсеп(ч(6( Я, 81ЕпаЬ]е(6( ТЕХТОМЕ 6ЕМ 5); 81ЕоаЬ]е(61 ТЕХТОВЕ 6ЕМ Т); 81Епаь]е(6( ТЕХТОМЕ 6ЕИ й): 81Епао]е(6( ТЕХТОМЕ 6ЕМ О); В листинге 9.19, перед воспроизведением сцены во второй и последний раз,мы посредством константы режима сравнения текстур 6Е СОМРАМЕ и ТО ТЕХТОЕЕ предписываем Орепо[. сравнивать г-координату фрагмента со значением тексела, Теперь используйте команду к1Техбеп*() для автоматической генерации координат текстур, чтобы вычислить расстояние от позиции источника света в координатах наблюдателя.
Значение координаты г должно соответствовать дистанции между источником света и примитивом. Вы можете сделать это, используя те же проекци1о и видовые преобразования, которые применялись при создании карты тени. В листинге 9.18 для всех матричных вычислений используется стек матриц 6Е ИООЕЕЧ1ЕИ. Заметьте, что генерируемые координаты текстуры (», д г, гт) и значения глубины в теневой карте масштабируются не совсем одинаково. Координаты текстуры ге. нерируются в системе наблюдателя, поэтому они попадают в диапазон [ — 1, 1[.
Значения глубины в тскселах находятся в прелелах [О, Ц. Отсюда, координаты текстур при начальных параллельном переносе и масштабировании карты будут в том же диапазоне значений, что и для теневой карты. Глубина текстур 385 Если расстояние г меньше значения тексела или равно ему (функция сравнения 61 СЕ()ОАС), значит, между этим фрагментом и источником света нет никакой преграды, и фрагмент обрабатывается с соответствующим значением яркости, При неуспехе сравнения считаем, что между фрагментом и источником света находится пругой примитив, поэтому этот фрагмент затеняется — его яркость равна нулю.
Листинг 9.19. Визуализация сцены со сравнением координаты г: зйа((овгтар.с 1)техРагаветег1(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ ИНАР 5, 6( ССАМР ТО ЕООЕ); 1)техРагаве!ег1(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ ИКАР Т, 6( ССАМР ТО ЕООЕ); 1)техРагаветег!(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ И1М Р1СТЕК, 6С С1МЕАК); 11техРагаветег!(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ МА6 Р1СТЕК. 6С С1МЕАК): 1!ТехРагаветег!(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ СОМРАКЕ РОМС, 6С СЕООАС); 11техРагаветег!(6С ТЕХТОКЕ 20, 6С ОЕРТН ТЕХТОКЕ МООЕ, 6С СОМ1МАМСЕ); 1!ТехРагаветег1( 6С ТЕХТОКЕ 20, 6( ТЕХТОКЕ СОИРАКЕ МООЕ, 6С СОИРАКЕ К ТО ТЕХТОКЕ); 1!Епаше(6С ТЕХТОКЕ 20); Эта техника может внести некоторые неумышленные визуальные дефекты: ° Самозатенение, когда объект некорректно попадает в тень самого себя, это наиболее общая проблема.
° Ступенчатость в спроецированной текстуре, особенно в областях, более всего удаленных от источника света. Чтобы избавиться от дефекта, увеличьте разрешение карты теней насколько можно. ° Если при текстурировании используется режим 6С ИОООСАТЕ, могут получиться слишком контрастные бзЬагр) переходы между затененной и незатененной областями. К сожалению, пег строгих правил для преололения этих проблем.
При некотором пхспериментировании все же можно получить более приятно выглядящее изображение. (Е а. и Л м Л п Р н н то зь ко ма че Буфер кадров После прочтения этой главы вы узнаете: ° Какие буферы входят в буфер экрана и как они используются ° Как очищать выбранные буферы и производить в них запись ° Как контролировать параметры применяемых к изображениям тестов на отсечение, трафарета, глубины и альфа-теста ° Как выполнять размытие и логические операции ° Как использовать буфер накопления, в частности, для сглаживания сцены Дав мац ляе иы, иве 86 Буфер кадров 387 Конечной целью практически любой графической программы является вывод изображения на экран.
Экран представляет собой прямоугольный массив пикселов, каждый из которых отображает очень маленький окрашенный квадрат, соответствующий точке изображения. После этапа растеризации (включающего в себя текстурирование и наложение тумана) данные еще не являются пикселами, пока они представляют собой фрагменты. Каждый фрагмент описывается коорлгнатной информацией, а также значениями цвета и глубины. Каждый такой фрагяевт подвергается серии тестов и операций, наподобие описанных ранее (см.
раздел «Смешивание» главы 6) и других, рассматриваемых в этой главе. Прошедшие тесты фрагменты готовы к тому, чтобы стать пикселами. Чтобы нарисовать эти пикселы, вы должны знать их цвет, то есть информацию, сохраненную в буфере цвета. Храггилище, в которое единообразно помещаются все пикселы, нюывается буфером. Различные буферы могут содержать разлпчное количество информации о пикселе, но внутри каждого буфера пиксел описывается одной и той же информацией. Буфер, сохранягощий один бит информации о пикселе, накивается битовой плоскостью (Ь)ср!апе).