М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 99
Текст из файла (страница 99)
В эту программу также добавлены освещение и затенение, а результат их действия продемонстрирован на рис. 12.3, Листинг 12.3. Освещенные и затененные поверхности Безье с использованием сетки: ЬехщезЬ.с чо)О )и(!1(ВПтя(ча(О) ( 6СТ(оа! амь!еп!() = (8.2, 0.2, 0,2, 1,0); 6(Т1оа! Роя(т)оп() = (0.0, 8.0, 2.0, 1.0); 6(!1оа! ма! О(!гике(] = (О.б, 8.6, 0.6, 1.8): Вычислители 449 6[Г]оат иат зресо[аг[) = [1.8, 1.8, 1,8, 1.8]; 6[(1оат иат 5П]п]пе55 [] = (58. 0] (" 81Епап]е(6[ С16НТ196); 81Епап]е(бс (16НТВ); 81[]ВП(тч(бс [16НТВ, 6[ АНВ]ЕНТ, аио(опт); 91[(ВП(тч(бс [16НТВ, 6[ Р051Т10Н, роззт~оп); В]натег]а[тч(6[ ГНОНт, бс 0]ГГ05Е, иат О((тозе); В]натег!а1(ч(б[ ГКОНТ, бс 5РЕСОСАВ, иат зресо1аг); 81насег]а1(ч(6[ ГКОНТ, бс 5Н1М1НЕ55, иат зи]п]пезз); ) чо)О О(зр1ау(чо!8) ( 9161еаг(6[ СОСОК ВОГГЕН В]Т ] 6[ ОЕРТН ВОГГЕК 81Т); 91Розинатг(х(); В]Носата((85.8, 1.0, 1.0, 1.0); В[Еча(нези2(6[ Г[С[, О, 20, 9, 20); 81РарМатг3х(); 91Г1изи(); ) чсно (и] С(чо(О) [ 81С1еагСо1ог(0.0, 0,8, 9.8, 0.0); 91ЕпаВ[е(6[ ОЕРТН ТЕ5Т); 91нар2( (61 МАР2 НЕКТЕХ 3, 8, 1, 3, 4, 8, 1, 12, 4, йстг1ра] пса[0] [0] [9] ); В\Епап]е(6[ НАР2 ЧЕНТЕХ 3); 81Епап[е(6[ АОТО НОМНАС); 81нарбгг82((29, 9,9, 1.0, 20, 0.0, 1.0); зп( 11(ВП(5(): ] рис.
22.3. Освещенная и тонированная поверхности Безье, построенные по сетке 450 Глава 12 ° Вычислители и П([)КВ5 Применение вычислителей для текстур Программа из листинга 12А включает в себя два вычислителя, работаюшие одновременно: первый генерирует трехмерные точки поверхности Безье аналогично листингу 12.3, а второй вырабатывает координаты текстуры.
Здесь координаты текстуры те же, что и и- и о-координаты поверхности, но это требует создания специального плоского лоскута. Плоский фрагмент определяется на квадратной области с углами (О, 0), (О, 1), (1, 0) и (1, 1); значения (О, 0) генерируются в углу (О, 0), (О, 1) — в углу (О, 1) и т. д. Поскольку его порядок равен 2 (<линейная» степень плюс 1), при вычислении текстуры в точке (и, р) генерируются коорлинаты (э, Г). Зто делается одновременно с вычислением вершин, поэтому их можно наблюдать в процессе рисования поверхности (см. цветной рисунок 19), Если вы хотите размножить текстуру по три раза в каждом направлении, измените значение 1.0 в массиве техртэ [] 1) [) на З.О.
В этом примере поверхность строится из девяти копий карты текстуры. Листинг 12.4. Применение вычислителей для текстур: [ех(цгеэог(.с 6сг)оат с1г1ро(пгэ[4) [4) [3) = ( (( -1,5, -1.5, 4.9), ( -9,5, -1.5, 2.9), (8.5. -1.5. -1.0), (1.5, -1.5, 2.9)), (( -1.5, -0.5, 1.0), ( -0.5, -0.5, З.О), (0.5, -9.5, 0.0), (1,5, -0.5. -1.9)), (( -1.5, 0.5. 4.0), ( -0,5. 0.5, 0.0), (0.5, 0.5, 3.8), (1.5, 0.5, 4.0)), (( -1.5.
1,5, -2.0), ( -0,5. 1.5, -2.9), (0.5, 1.5, 0.8), (1.5, 1,5, -1.9)) ); 6111оаг гехр14(2) (2) [2) = (((0.0, 0.0). (8.9, 1.0]), ((1.0, О.О), (1.0, 1.0))); чо!б б!эр1ау(чо!б) ( В\С1еаг(6С СОСОВ ВОРЕЕЯ В!Т [ 6С ОЕРТН ВВЕРЕН В!Т); В\Со1огЗГ(1.9, 1.8, 1.0); В[Ечэ[неэпг(6С Е)СС, 9, 20, 8, 28); 81Р1оэп(); ) Фее!!пе )вэаен!б1П 64 Эбег!пе !вааеНе!ВП! 64 61ооуте !ваае[3"!вэаен)б1П'!вааене!ВПГ); чо!б вахе1ваае(чо!б) ( !Пг Г)оэт 11, 11; гог (! = 8: ! < !вааеИ!бгп; !»+) ( 1! = 2. 9*3, 14159265*! /! вааен! бтп; Гог () = 0; ) < !вааеме!ВП(; 1+<-) ( !1 = 2.9»3.14159265»1/!вааене(ВП1; Вычислители 451 !ва8е(З'(!ва8еНе[КПС*(ч))1 (6гиьуге) 127*(1.0+а)п(г!)); (ва8е(З'(!ва8еНе(КПС"г+1)+1] (6СЧЬуге) 127'(1,60асоа<2 С))); )ва8е[3"(]ва8еНе(КЫ'!+])+21 (6гоьуге) 127'<1.0+гоп(!<+С])); чо!б )п(г(чо(б) ( 81Мар2Г(6С МАР2 ЧЕКТЕХ 3, О, 1, 3, 4, О, 1, 12, 4, йсгг!ро~ пса [0] [01(01); 8!Мар)!<ОС МЯР2 тЕХТОЙЕ СООЙО 2, О, 1, 2, 2, О, 1, 4, 2, Агехрга[81(О][О]); 81Епаые(6С МАР2 ТЕХТОЙЕ СООК0 2); 8!ЕпаЫе(6С МАР2 ЧЕКТЕХ 3); 8!Нарос]02!(20, 0.0, 1.0, 20, 0.0, 1.0); ваХе!ва8е().
8!ТехЕпчг(6! ТЕХТОКЕ ЕНЧ, 6С ТЕХТОКЕ ЕМЧ МООЕ. 6С ОЕСАЫ; 8!ТехРагавегег((6С ТЕХТОЙЕ 20, ог ТЕХТОЙЕ ИКАР 5, 6С КЕРЕАТ); 8!ТехРагавегег<(6С ТЕХТОКЕ 20, 6! ТЕХТОКЕ ИКАР Т, 6С ЙЕРЕАТ); 8!ТехРагавегег~(6С ТЕХТОКЕ 20, 6! ТЕХТОКЕ МА6 Р!!ТЕК, 6С МЕАКЕ5Т); 81ТехРагавегег)(6С ТЕХТОЙЕ 20, 6! ТЕХТОЙЕ М1М Р1[ТЕЙ, 6С МЕАКЕ5Т); 8!тех[ва8е20<6С тЕХтОЙЕ 20, 8, 3. (ва8еи!бгь, (ва8еие(8ьг, 8, 6С Й68, 6С ОЙ516МЕО ОЧТЕ, (ва8е); 8!Епаые(ог ТЕХТОКЕ 20); 8!Епаые<6! ЬЕРтН ТЕЗТ); 815ьабеиобе1(6С РСАТ); ) го!б ге!Паре(]пг и, !пг П) ( 81Чгеирогг(0. 8, (6га<ге!) и, (6га(ге!) П); 81нагг(хМобе(6С РЙО)ЕСТ10М); 8!гоаб!бепг)гу<); (! (и ч= П) 810ггьо(-4.0, 4.0, -4.8'(6[г!оаг)пг(6(г!оаг)и, 4.0*(6[!!оаг)Ь)(6с(1оаг)и, -4.9, 4.9); е\ае 8!Оггьо(-4.8'(6СГ!оаг)и/(6[г!оаг)П.
4.0*(6гг!оаг)и)(6сг!оаг)П, -4.0, 4.0, -4.0, 4.0),' 8!Магггхнобе(ог МООЕ[Ч1ЕИ); 81(оаб1бепС(гу()') 8!Когагег(85.8, 1.0, 1.0, 1.0); !пг ва<п((пг агКс, снйаг" аг8ч) ( 8!ЧС1п<г(тчаг8с, аг8ч); 8!Чг[п!Со]ар!аунобе(осот 5[Н6СЕ ( 6!ОТ Й68 ( 6!ОТ ОЕРТН); 8!чг1п)ги(пбои5(ге(508. 580): 81ЧС1п!ги)пбоиРоа!С(оп(108, 100); 81ЧССгеагеи(обои(аг8ч(81); продолхгение ах 452 Глава 12 ° Вычислители и МВМВВ Листинг 12.4 (продолжение) )п11(); в1и(01вр1аурипс(и1«р1ау); х1итаев Паре гипс (ге«Паре) 1 а1игиа!п(оор(): гегигп 6: Интерфейс ХОРВАТ библиотеки 6~0 Несмотря на то что вычислители — зто единственные доступные для непосредственного рисования кривых и поверхностей примитивы ОрепС1., это не недоста.
ток, так как они очень эффективно реализованы на аппаратном уровне, а приложения чаще всего обращаются к ним с помощью библиотек более высокого уровня, Одна из них, СШ, предоставляет интерфейс ХБКВБ, являющийся надстройкой над командами вычислителей ОрепС1.. Пример простого КОРВО-обьекта Если вам не нужно расшифровывать, что такое Х()ВВЯ, написать для вас код Орепо)., манипулирующий Х()ВВЯ-кривыми и поверхностями, не составит труда, даже с учетом освещения и наложения текстур. Во время рисования Х()КВБ-кривых или неусеченных (ипгг1шшег() Х()ВВБ-поверхностей (сл1.
раздел «Усечение Х()КВЗ-поверхностейэ) следуйте описанному ниже порядку действий. 1. Если вы намереваетесь осветить Х()ВВЯ-поверхность, вызовите к1ЕпаЬ)е() с параметром 61 АВТО МОРИА( для автоматического генерирования нормалей к поверхности. (Или вычисляйте их самостоятельно.) 2. Когда создаете Х(ЗЕВА-кривую илн поверхность, используйте команду я1иМеииигивкепиегег() для создания указателя на ХБВВБ-объект. 3. При необходимости вызовите к1имигивргореггу О для задания параметров построения, таких как максимальный размер линий многоугольников, которыми воспроизводится ваш Х(ЖВЯ-объект.
Для команды В1ииигввргореггуо можно также включить режим, в котором геометрические данные тесселяцив могут быть получены с помощью интерфейса обратной связи. 4. Вызовите я1имигивСа11Ьасх(), если хотите быть уведомлены о случаях возникновения ошибок. (Проверка ошибок способна отрицательно повлиять на производительность, но она настоятельно рекомендуется.) Команда а1иМиговСа11Ьаск() может также использоваться для регистрации функций, возвращающих геометрические данные тесселяции. 5. Начните построение кривой или поверхности с вызова я1иВек! пСигче() иля В1иВеВ(п5иг(асео.
6. Сгенерируйте и воспроизведите свою кривую или поверхность. Хотя бы рю вызовите к1илигЬвСигчео или В1ииигЬв5иг(асе() с контрольными точками Интерфейс Ь[()кВ5 библиотеки ВШ <е53 (рациональными или нерациональными), последовательностью узлов (йпо(в) и порядком базисного полинома для своего Л!(]ВВ5-объекта. Вы можете делать зти вызовы как дополнительные для задания нормалей к поверхности игили координат текстур.
7. Вызовите к]ОЕООСпгче() или к]иЕпо5ог1асе(), чтобы закончить обработку кривой или поверхности. В программе из листинга! 2.5 строится ]»П)ВВ5-поверхность в форме симметричной возвышенности, контрольные точки которой принадлежат диапазону от — 3.0 ло 3.0. В качестве базовой функции взят кубический В-сплайн, но последовательность узлов неоднородна, со значением кратности, равным 4, в конечных точках. Соответственно, базовая функция ведет себя как кривая Безье в каждом направлении.
Поверхность освещена, ей приданы темпо-серое диффузное (<[1((цзе) отражение и белые зеркальные блики. На рис. ! 2 4 результирующая поверхность показана также в виде освещенного каркаса. Рис. 12.4. Мцав5-поверхность Листинг 12.5. [<]ОРВ5-поверхносты вцг[асе.с И1пее1 САССВАСК аее1(пе САССВАСК аепе!1 6(1[па( сг[ро!пса[41[41[31: !М 5понРО!пев = 0; 6шпогЬвОЬ] <ЕПеиого; »О!О !и!с ьогтасе(чо!О) ( !п! и.
ч; 1ог (о = 0; и < 4; о»<-) ( 1ог (ч = 0; ч < 4; ч+а) ( с(]ро!пса[о][ч][Е] = 2.0'((СС1(оат)о - !.5); ст]розпгв[о][ч][1] = 2.0'((0(1[пас)ч - 1.5); ! 1 ( (и -"= 1 ][ о == 2) аа (» == 1 [[ ч == 2)) ст]ро! псе (о] [ч] [21 = 3 . О; продолжение *Р 454 Глава 12 ° Вычислители и В][]КВВ Листинг 12.5 (продолжение) е1ае с(1ро[п(5[и][ч)[2) = -3.0; чо[б САССВАСК пигьаЕггог(6(епиш еггогСобе) ( сола( 6(иЬу(е 'еа(г!пВ; еасг!пВ = 81иеггог5сг!пВ(еггогсобе); грг!п(1(а(бегг, "Ошибка МОМВ5: Масп", еагг!пВ); ех!с(9); чо!б зпзС(чо[б) ( 6111оас шас б!11иае[) = ( 9,?, 0.7, 8.7, 1.8 ]; 6111аас шаС ареси1аг[) = ( 1.0, 1.0, 1.0, 1.0 611[пас шас ап!о[песа[] = ( 100.0 ]; 81С!еагсо1ог(9.9, 9.8, 8.9, 8.8); 81ма(ег! а11Ч(6( РМОМТ, 61 011105Е, шаС б(11иае); 81ма(ег!а11Ч(6С РМОМТ, 6( 5РЕСОСАР, шаС ареси1аг); 81маСег!а11Ч(6С РЙОМТ.