М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 84
Текст из файла (страница 84)
Создание «теневой» карты Первый шаг — это создание карты текстуры со значениями глубины. Вы создаете ее посредством построения сцены с условием, что точка наблюдения совпадает с позицией источника света. Код нз листинга 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) и других, рассматриваемых в этой главе. Прошедшие тесты фрагменты готовы к тому, чтобы стать пикселами. Чтобы нарисовать эти пикселы, вы должны знать их цвет, то есть информацию, сохраненную в буфере цвета.
Храггилище, в которое единообразно помещаются все пикселы, нюывается буфером. Различные буферы могут содержать разлпчное количество информации о пикселе, но внутри каждого буфера пиксел описывается одной и той же информацией. Буфер, сохранягощий один бит информации о пикселе, накивается битовой плоскостью (Ь)ср!апе). Как показано на рис. 10.1, левый нижний пиксел окна ОрепОЕ, (О, О), в оконных координатах соответствует левому нижнему углу области размерами 1 х 1, заниякемой пикселом.
В общем случае пиксел (х, у) заполняет собой область, огранитенвую значением ж слева, значением х ь 1 справа, у — снизу и у + 1 — сверху. Координаты У окна 3,0 г,о г,о о,о О,О 1,0 2,0 3,0 Координаты Х окна Левый нижний угол окна Рис. 10.1. Область, занимаемая ликселом йте более пристально посмотрим на буфер, который хранит цветовую инфор- ию о данных, отображаемых на экране.
Положим, что ширина экрана составет 1280 пикселов, а высота — 1024 пиксела, и что мы имеем дело с 24-разрядзкраном — таким, который может воспроизвести 2т" (16 777 216) различных ов, Поскольку 24 бита это то же, что 3 байта (стандартный байт состоит из бгп), буфер цвета должен быть разбит на порции из 3 байтов для каждого из 388 Глава 10 ° Буфер кадров 1 310 720 (произведение 1280 и 1024) пикселов экрана. Число пикселов на физическом экране зависит от возможностей аппаратного обеспечения, но количество информации о пикселе, сохраняемой в буфере цвета, — величина одинаковая во всех случаях. Буфер цвета — это только олин из нескольких буферов, хранящих информацию о пикселах.