OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 90
Текст из файла (страница 90)
д. После 6( КЕТОкИ должен проверить, петли у пользователя женання прервать процесс. Этот интерфейс немного медленнее, поскольку рсзультируюьцее изображение лолжно быть скопировано в видимый буфер после кажюго прохода. Выбирая п, вам следует найти компромисс между скоростью (чем большее колин(ство раз рисуется сцена, тем длиннее становится весь процесс) и качеством (чем большее число раз рисуется сцена, тем более удовлетворительней она вы- 406 Глава 10 ° Буфер кадров глядит, пока пе выработана разрешаюшая способность буфера). Описанный процесс иллюстрируется также цветными рисунками 22 и 23.
В листинг 10.2 включены две процедуры для «дрожания» и сглаживания сцены, которые могут оказаться вам полезным: ассРегзресс!че() и ассегизсинО, Процедура асс РегзрЕСС уче() используется вместо команды 81ирегзресС! че(), первые четыре аргумента обеих процедур одинаковые. Чтобы заставить «дрожать» конус угла зрения, укажите х и у (меньше одного пиксела) в качестве значений пятого и шестого аргументов ассрегзрестуче(). Также присвойте значение 00 седьмому и восьмому аргументам асс регзрес11че() и ненулевое значение девятому (с целью упреждения деления на нуль в асс рег брест ! че () ).
эти последние три параметра используются для получения эффекта резко очерченного пространства (глубины резкости), описанного ниже в этой главе. Листинг 10.2. «Дрожание» объектов сцены: ассрегзр.с №бе1!пе Р1 3.14159265358979323846 чо!б ассгги»Сии(6(боиЫе 1е1С, 6(боиЫе г!8ЬС, 6(боиЫе Ьоггам, бьбоиЫе Сор, 6(боиЫе гйе»г, 6(боиЫе ггаг, 6(боиЫе р!хбх, бьбоиЫе р!хбу, 6(боиЫе еуебх, 6(боиЫе еуебу, 6(боиЫе 1оси») ( 6(боиЫе хи»!ге, ук»!ге; 6(боиЫе бх, бу; 6С!пС Ы еирогС[4); 816еС[пееаегч(бь Ч(ЕИРОКт, Ы е»РогС>; хи»~ге = г!8ПС - 1е1С; ун»1ге = Сор - ЬоССоеи бх = -(р1хбх'хмшгеl(6(боиЫе) ч!еирогС[2] + еуебх»гйеаг/1оси»); бу = -(р!хбу'ун»!ге)(6(боиЫе) ч!еирогг[3) + еуебу'сне»гуго«из); 81Магг!хМобе(6( РКО>ЕС110й); 81(оаб[бепС!Су(); 81еги»сип(1е11 » бх, г!Еьс + бх, ьоссоа + бу, сор + бу, гйеаг, геаг); 81М»Сг!хиабе(6( МООЕСН1ЕИ); 81(оаб[бепС!Су<>; 8(тгап»[агег(-еуебх, -еуебу, О.О); чо!б ассРегерессгче(6(боиые точу, бсбоиые азресс, бьбоиЫе гйеаг, 6(боиЫе гЕ»г, 6(боиЫе р!хбх, бьбоиЫе р!хбу, бьбоиЫе еуебх.
6(боиЫе еуебу, 6(боиЫе !оси») ( 6(боиЫе гоч2, [е(С, г! 8Ы, ЬоССом. Сор; 1оч2 = ((1очу'Р1 ) ! 180.8) / 2.8; Сор = гйеаг I (гса»(1оч2) I 1»1п(1оч2)) > Ьосгоп = -сор; г!8ЬС = Сор ' азресг; (е1С = -г!8Ы: ассггизги»(1е1С, г!8ЬС. ЬоССом, Сор, гйеаг, гЕ»г, р!хбх, р!хбу, еуебх, еуебу, 1оси»): Буфер накопления 407 В листинге 10.3 обе процедуры листинга 10.2 задействованы для сглаживания б(ены.
Ямстииг 10.3. Сглаживание сцены: ассрегвр.с ча!б !п(С(чо(б) ( 6[с]оаС ваС авь!епС[] = ( 1,0, 1.О, 1.0, 1,О ]; 6[с]оаС ва( аресисаг[] = ( 1.9, 1.0, 1.0, 1.0 ]; 6(ссоаС 1!Ей! рос(С!опЦ = ( 9.0, 0.0, 18,9, 1.9 ]; 61(1оаС 1в аво(епС[] = ( 0.2, 8.2, 0.2, 1.0 41мэсег(41(ч(6с Рйомт, 6с АМВ1емт, вас авь!епс); 11на(ег(а1(ч(61 РНОМТ, 6С 5РЕСОСАМ, ваС аРеси1аг); 41ка(ег(а1((6С РКОМТ, 61 5Н1М1МЕ55, 58.0); 111!Вне(ч(6С 116НТВ, 6С Р051Т10М, 1п ВПС роз! С! оп); 511(ЕЬСнобе1(ч(6С 116НТ НООЕС АНВ1ЕМТ, 1в аво(епС); 11Епао]е(61 С[6НТ1М6); 11Епао]е(61 116НТВ); 51(паосе(6С ОЕРти тЕ5т); 515иабенобе](61 РСАТ); 1161еэгсо1ог(9.8, 0.0, 0.0, 0.8); 5161еагАссив(9.
О, 0.0, 0.0, 0.0); ] чо(б б! ар1ауОЬ1ес С а (чо! б) ( 61(1оаС Согиа б!(Свае[] = ( 0.7. 0.7, 0.0, 1.0 ]; 61(соаС сиЬе б! (Свае [] = ( О. 8, О. 7, О. 7, 1. 9 ); 61(1оаС ариеге б!(свае[] = ( 0.7, 0,0, 0.7, 1.0 6[ыоаС ос(а б! (!чье[] = ( 8.7, 0.4. 0.4, 1.0 ): 51Риьииа(г]х(); 91тгапа1асег(8.8, 9.0. -5.0); 1)Ко(а(ег(39.8. 1.8, 0.0, 8.0); 11Риьпнагг(х(); 11тгапьсасе((-9.90, 0.35, 0.0); а[косасес(188.8, 1.0, 0.0, О.О); 51масег!а]сч(61 Ркомт, 6с 01РРО5е.
согиа б(стиве); 41иС5о1(отоспав(8.275, 0.95, 16, 16); 41Рориа(гзх(); а1Риапнаег(х(); 51тгапа1асес(-0.75, -0.59, 0.0): 5[ко(а(ес(45.9, 0.0, 0.8, 1,0); 5]Вега(е((45.9, 1.0, 0.9, 0.9); 11нэ(ег!а1(ч(61 РМОМТ, 6С 01РР05Е, сиЬе б(!свае); 51и15о1(бсиЬе(1.5): 11Рорна(г(х()'. 51Риьона(г(х()! 51тгапа1асег(8,75, 0.60, 9.0); продолжение .Р 408 Глава 10 ° Буфер кадров Листинг 10.3 (продолжение) 81йотате!(38.8, 1.0, 0.0, 0.8); 81Матег!а1(ч(СС ЕВОМТ, 6( 01РЕО5Е, ариеге б1!1изе),' 81иС5а1зб5РПеге(1,0, 16, 16); 81Рориатг(х(); 81РизПМатг1х(); 81Тгапз1ате1(0.70, -8.90, 0.25); 81Ма(ег1а1!ч(СС РВОМТ, СС 01ЕР05Е, оста б! [созе); 81иС5о1збостанебгоп(); 81РорМаСг(х(); 81рорМатг!х(); вбит(пе АС512Е В чотб б1зр1ау(чо!б) ( СЫпС чзенрогт[4]; [пС [1ССег; 816еС[п(евегч(СС у[ЕИРОйт, ч!еирогС>; В[С[еаг(СС АССОМ ВОРРЕй В[т>; тог Ц зССег = 8; >зССег < АС512Е; ] 1ССег++) ( 81С1еаг(6[ СОСОй ВОРРЕй 81Т [ 6С ОЕРТН ВОРРЕй В[Т); ассРегаресС(че(58.8, (ССбоиЫе) чзенрогС[2]/(6[боиЫе) чзеирогт[3], 1.8, 15.О.
>Вцзттег].х, >Вцзтеег].у, О.О, О.О, 1.8>; б(зр1ауоо)ес(в(); В)Ассов(СС АССОМ, 1.8/АС512Е>; ) В]ассии(61 йвтийи, 1.8>; 81Р1изп () > чо(б гезларе(1пС и, 1пС П) ( ВТЧ!еирогС(0, 8, (ССз!зе!) н, (ССз!ае!) П); ) /" Главный цикл ' Убедитесь в наличии запроса буфера накопления. '/ 1пС пазп(зпС агвс. слаг*" агвч) ( 81иС1п1С(вага<. агвч); 81иС1п(СО[ ар1аунобе(6СОТ 51М6СЕ [ ОСОТ й68 [ С! ОТ АССОМ [ ОСОТ ОЕРТН); 81иС1ю СИ>пбон51се(250, 250); 81иС1п1СИ!пбонРоз(1!оп(188, 100); 81иССгеа(еИ>пион(агвч[О]); !п1С(); 81итйеанареЕипс(гезларе); 81иС01зр1аурипс(б1зр1ау); В!и!на!п(оор(); ге!игл 8; Буфер накопления 409 ]]н не должны использовать перспективнусо проекцию для сглаживания сцены. 0/упенчатость сцены можно устранять с ортогональной проекцией, просто аызыия 81Тгал51ате«() для получения «дрожания».
Имейте в виду, что команда 11Тгапз\асе«() оперирует мировыми (счог]о) координатами, а вас интересуют нюрдинаты экранные. Таким образом, вы должны самостоятельно произвести а!Ответствующее преобразование, разделив вьюоту и ширину в мировых коордимтах на размеры области просмотра. Затем умножьте значение в мировых коорйнматах на интервал дрожания, чтобы «предсказать» максимальную величину 0(вмга — меньше 1 пиксела. Листинг 10.4 показывает, как выглядели бы процедуры 6[зр1ау() и ге 5 царе(), если бы ширина н высота в мировых координатах были равны 4.5. Лнстинг 10.4. «Дрожание» с помощью ортогональной проекции: ассапйзс нег(пе АС512Е 8 та[6 отзр1ау(чото) ( 61!пт чтеирогт[4]; !пт )тССег; 116ет!птенегч(6С Ч1ЕИРОМТ, ч(еирогС); 1161«аг(6С АССОМ ВОРРЕМ В!Т): (ог ()тССег = В; 1(ССег < АС512Е; )!Стет++) ( 81С1еаг(6С СОСОМ ВОРРЕМ 81Т ] 6С ОЕРТН ВОРРЕМ 81Т); 81РозПМатг!х(); /' Заметьте, что 4,5 — это расстояние в мировых координатах ' между левой и правой сторонами и между верхней и нижней.
' Зта формула преобразует движение пиксела от дробного значения ' к мировым координатам. 81ггапз1атет(18[1!ССег].х*4.5/чтеирогС[2], )8[)тССег).у'4.5/чтеирогС[3], В.В); 6!ар1ауоо1есСз(); 81РориаСгтх(); 81Ассом(6С АССОМ, 1.0/АС512Е); ) 81Ассом(6С МЕТОКМ, 1.0); 1[ыози(); и[6 геяьаре(!пт и, !пт П) ( 11чтеирогС(0, О, (6С5(2«!) и, (6С5!7«!) Л); 11Матг(хМоое(6( РРО)ЕСТ10М); 11(оа616«пт(ту(); (! (и <= и) 810гСПо(-2.25, 2.25, -2.25'П/и, 2.25'П/и, -10.0, 10.0); е1зе 810гтьо(-2,25'и/и, 2.25'и/П, -2,25, 2.25, -10.8, 10,0); 1[наегтхиоое(68 МООЕСЧ]ЕИ); 81(оа616епттту(): 410 Глава 10 ° Буфер кадров Размытие при движении Схожие методы могут использоваться для имитации размытия при движении, как показано на цветном рисунке 7 и на рис.
10.2. Пусть на вашей сцене присутствуют статические и несколько движущихся объектов, и вы хотите получить изображение с размытыми краями, как бы снятое за некоторый период времени. Настройте буфер накопления так же, как в предыдущем примере, но вл(есто «дрожания» изображения в пространстве заставьте его флуктуировать во времени.
Полная сцена может быть получена последовательным «затуханием» при вызове З)Асснж(бс НЭЬТ, десаугас1ог); Здесь сцена рисуется в буфер накопления, а г(есауГасгог — число в интервале от 0.0 до 1.0. Небольшие числа «периода полураспада» ьг(есауГасгог) заставляют обьект «двигаться» быстрее. Вы можете передать полную сцену, имитируя «испарение» с предшествующей позиции в буфере накопления, в стандартный буфер цвета с помощью вызова к)Асснж(6( абтсян, 1.0); Изображение выглядит приемлемо, даже если его элементы «движутся» с различными скоростями или если некоторые из них ускоряются.
Как и раньше, чем больше точек «дрожания» (в этом случае во времени) задано, тем лучше заклю. чительное изображение, по крайней мере, до места, где начинается потеря разре. щения по причине ограниченной точности буфера накопления. Вы можете обьединить размытие при движении со сглаживанием посредством «дрожания» в обоих составляющих пространственно-временного континуума, но платой за более высокое качество будет увеличение времени воспроизведения сцены. Направление движения Рис.