OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 101
Текст из файла (страница 101)
Аргумент гей(сй представляет именованный идентификатор функции обратной связи. Если значение свойства (ргорег(у) 6(0 МОКВ5 МОВЕ установлено в 610 МОКВ5 ТЕ55ЕССАТОЙ, допустимы 12 таких функций (в дополнение к 6С0 ЕККОК). (Если свойство 600 МОКВ5 МОВЕ установлено в значение по умолчанию 610 м0ЙВ5 Йемрекек, допустим только режим 6с0 еккОЙ.) двенадцать функций обратной связи имеют следуюшие прототипы: Интерфейс МОРВВ библиотеки бс0 461 Чтобы изменить функцию обратной связи, вызовите 61инигЬВСа11Ьаск() с указанием другой процедуры.
Чтобы удалить функцию обратной связи, передайте в й1инигЬВСа11Ьаск() нулевой указатель для соответствующей функции. Шесть функций обратной связи позволяют передавать в себя некоторые другие данные. Для задания пользовательских данных вам нужно сделать вызов В1инигЬВСВ11ЬасКОВСа(), | чо(г( 61инигЬВСа11ЬВСКОаса(СШпигЪВОЪ) ьпоЬ) чосб 'изегРата)! Аргумент поЬ|' — это мозаично разбиваемый )ь)()ВВЯ-объект. Структура изет(а представляет данные, передаваемые в функцию обратной связи.
Во время процесса тесселяции процедуры обратного вызова вызываются аналогично командам ОрепС1. й1вей! и(), 61ТехСоогб*(), 61661ог*(), 61Могюа1ь (), й1Чегсехь() и й1Елб(). В режиме 660 МОРВ5 ТЕ55ЕССАТОР кривая нли поверхность не отображаются сразу, а их данные вершин перехватываются и передаются в аргументах функций обратной связи. Демонстрируют применение функций обратной связи листинги 12.б и 12.7, являющиеся кусками программы зигРро! пса, с, представляющей собой модифицированный вариант программы зо г тасе. с.
Листинг 12.6 включает в себя инициализацию )ь)(тссВЯ-объекта — процедуру !п!с(). Для подготовки нужного режима устанавливается также параметр 6СО МОРВ5 МООЕ, н регистрируются функции обратной связи. Листинг 12.6. Регистрация функций обратной связи МОРВ5-тесселятора: зиг(ро(пСВ.С чо!6 тптС(чотб) I* Это только часть процедуры тптс() с исключением нескольких строк "I СпеногЬ = В1оМенМогЬьйепбегег(); В1имигьзРгорегсу(сьемогь, 6си мийВ5 нове, 6(0 мийВ5 те55ессдтой); В1онигььРгорегту(тпенигЬ, 6СО 5АМРПМ6 ТОСЕРАМСЕ, 100.В); Всоиогоьргорегту(тленогь. 610 щзРСАу йоОЕ, В1иногозса11Ьаск(тпеиогь, 6СО Еййой, погЬьЕггог); В1омогььса11ьаск(сьемогь, 6СО мийВ5 Ве61м, ьейтпса11ьаск); продолжение иь 6(0 МОРВ5 ВЕ61М 6(0 МОРВ5 ВЕ61М ОАТА 6(0 МОРВ5 ТЕХТОРЕ СООРО 6(0 МОРВ5 ТЕХТОРЕ СООй0 ОАТА 610 МОРВ5 СОСОР 610 МОРВ5 СОСОР РАТА 610 МОРВ5 МОРМАС 6(0 МОРВ5 МОРМАС РАТА 6(0 МОРВ5 ЧЕРТЕХ 6(0 МОРВ5 ЧЕРТЕХ ОАТА 6(0 МОРВ5 ЕМО 6(0 МОРВ5 ЕМО ОАТА чо(6 Ьеб! п(6(енот гуре) чоЫ Ь ей ! п(6(ел от суре, чоЫ *итегРаса) чоьб СехСоогб(6ЯоаС*ССгб) чоЫ Се хСоп г6(6(йоаС 'ССгб, чо!6 *итегРага) чоЫ со1о г(ЯЯоас *со(ог) чо(6 со1ог(6(йоаС со(ог,чо(6*итегРаса) чоЫ погва1(6(Раас *лт!) чоЫ погва1(6ьйоаС*пт(, чоЫ *итегРага) чоЫ чег(ех(6(йоаС*чеггех) чоъ6 че г тех(6(йоаС * чеггех, чоЫ 'итегРаса) чоЫ елб(чоЫ) чоЫ епб(чоЫ 'итегРага) 462 Глава 12 ° Вычислители и 0[0йВБ Листинг 12.6 (продолжение) В!ийигЬвСа11ЬасК(СПейигЬ, 600 ИОИВ5 НЕИТЕХ, чегтехСа11ЬасК); В1ийигбвса11Ьаск(СПейигб, 6СО ИОИВ5 ИОИНАС, погша1Са11Ьаск); В1ийигбвса11Ьаск(СПейигб.
660 йОКВ5 Ей0, епбСа11Ьаск); В листинге [2.7 показано применение функций обратной связи. Здесь пре/сложения рг!пс1() используются для вывода диагностических сообщений соответственно процессу построения объекта н возвращаемым данным для вершин. Кроме того, возвращаемые данные мозаичного разбиения повторно пересылаются в конвейер с целью выполнения обычного отображения. Листинг 12.7. Применение функций обратной связи йй)йВВ-тесселятора: Вцг[росп(в.с чосб САССВАСК ЬейтпСа11Ьаск(6(епиш нптсПТуре) ( В1Вебтп(ип!сПТуре); /" директива повторной передачи на отображение '/ рг!пС1("61Вей!и("); внттсп (нП!сПТуре) ( /* вывод диагностических сообщений "/ саве 6( (1ИЕ5: рг!п(1("6С СХИЕ5) сп"); Ьгеак; саве 6С (1ИЕ СООР: ргтпС1("6( [1ИЕ СООР))п"); ЬгеаК: саве ВС СХМЕ 5ТЙ1Р: рг!пт1("6С С!йЕ 5ТИХР)1п"); Ьгеак; саве 6С ТР1Ай6СЕ5; ргт п(1("6[ ТИХАИОСЕ5) сп"); Ьгеа)с; саве 6[ ТИХАИ6[Е 5ТИХР: ргтпС1("6!.
ТИ1АИОСЕ 5ТИХР)хп"); Ьгеа)с; саве 6( ТИХАМ6(Е РАй: рг!ПС1("6[ Тй!АИОСЕ ЕАМ)сп"); ЬгеаК; саве 6С ООА05; рг!п(1("6( ООА05) )п"); Ьгеа(с; саве 6( ООАО 5тй1Р: рг! пС1("6( ООАО 5ТИХР) сп"); Ьгеак; саве 6( РОСУООИ: ргтп(1("6( РОСНООИ) сп"); Ьгеах; бе1аи11: Ьгеа)с; ) чо!б САССВАСК епОСа11Ьаск() ( В1Епб(); /' директива повторной передачи на отображение ргтпС1("В1Епб()сп"); ) чо!б САССВАСК чегтехСа11Ьаск(6(11ааС 'чегСех) ( ВХЧегсехзтч(чегсех); /" повторная передача вершин '/ ргспС1("В1Чег(ех31 (%5.31, %5.31, %5.31)сп", чегтех[О), чег(ех[1], чегтех[2]); Интерфейс МВКВ5 библиотеки 600 463 чоян САС(НАСК погва(са11оасн(6(Г(оат "погва1) ( Н1иогва13(ч(погва1); /' повторная передача нормалей рг1птт("Н(иогва(3( (Х5.3(, Х5.3(, Н5.3() ", погва1(э), погвя1(11, погва1(2]); ) Усечение КОРВО-поверхностей Для создания усеченных Х()КВо-поверхностей с помощью Орепвв начните с создания «сырой» поверхности.
Затем, после вызовов к1ннен1п5цгтасе() и 51нногЬз5цгТасе(), но перед В\оЕпа5нгтасео, выполните усечение н1нВек1птг1во. чоЫ н1овент птг3 в(ОЬБпнгЬзОЬ) *поЬ/) чоЫ к1цйпатг1в(б1 НпцгЬзОЬ)' *по(//); Отмечают начало и конец контура усечения. Он представляет собой набор ориентированных вырезанных из кривой отрезков (образующих замкнутую кривую), определяющих границы Ы()КВЯ-поверхности.
Вы можете создать усеченные кривые двух видов: кусочно-линейные с помощью н1нрм1Снгче () и Х()КВЗкривые с помощью к1нногвзСогче(). Кусочно линейная кривая не похожа на кривую в прямом смысле этого слова, поскольку это совокупность отрезков прямых линий. Х()КВБ-кривая для усечения должна лежать в пределах единичного квадрата параметрического (и, и) пространства. Тип (т(СКВЕР-кривой для усечения — обычно 600 МАР1 ТР1И2.
Тип 600 ИАР1 ТН1ИЗ применяется реже, здесь кривая описывается в двухмерном однородном пространстве (и', р', в/') при (и, о) - (и'/те', о',/м'). чоЫ н1црн1Сн гче(61Л)пцгЬзОЬ) «по(у, Ссш( соилй С) Йоаг «аггау, ОЬшг хетта/е, О1епшп и/ре); Описьгвает кусочно-линейную кривую усечения для )ч(()КВЯ-объекта поЬ~. Аргумент соиле — это число точек кривой, содержащихся в массиве аггау.
Аргумент Гуре равен либо 600 ИАР1 ТН1И 2 (обычно), либо 6С0 МАР1 ТН1М 3 (однородное параметрическое пространство (и, о, те) ). Значение типа хуре обусловливает значение аргумента эх/таге — 2 или 3. Шаг по индексу хгг(г(е представляет количество значений с плавающей запятой до следующей вершины массива аггау. Вы должны озаботиться ориентацией кривых усечения — то есть тем, как они обходятся: по часовой стрелке или наоборот, — чтобы быть уверенными, что вы включили в обработку нужную часть поверхности.
Вы уже должны знать, что при обводе все, что находится слева от кривой, включается в рассмотрение, а все, что находится справа, — отбрасывается. Например, если ваш объект состоит из единственного контура, обходимого против часовой стрелки, к учету принимаются нсе его «внутренности».
Если усечение выполняется для двух непересекающихся контуров, также ориентированных против часовой стрелки, к рассмотрению принимаются внутренние области обоих контуров. Если вы имеете один «цротив ча- 464 Глава 12 ° Вычислители и Р(Е)йВБ совой стрелки» контур и внутри него два контура «по часовой стрелке», в область усечения войдут два отверстия.
Наиболее внешняя кривая усечения должна обходиться против часовой стрелки. Часто кривая усечения окружает единичный квадрат, предполагая обработку его внутренней области. Это также случай по умолчанию, когда вы самостоятельно не указываете никаких кривых для усечения. Кривые усечения должны быть замкнутыми и непересекающимися. Вы можете комбинировать их, пока их конечные точки не сформируют замкнутую кривую. Вы можете вкладывать кривые, создавая «острова», «плавающие» в пространстве. Убедитесь, что ориентация кривых задана верно.
Так, вы получите противоречие и, следовательно, ошибку, если укажете в качестве области усечения две кривые, обходимые против часовой стрелки, где одна вложена в другую. Рисунок 12.5 иллюстрирует несколько допустимых вариантов. 91ивед1п5иггасе(): 91ийигЬ15иггасе(.. ); 91ЬВец~пТгнп(); 91ири)Сигче( ) /* А */ 91иЕпиТюв(); д)иВед~пгпв(): 91иР«1Сигче(...), /* В */ 91иЕпиТп'в(): 9)иВец1пТЫв(): 91ийигоасигче(...): */ С */ 91иЕпОТпв(): 91иВерпТг1в(); д)ийигаасигче(...). */ 0 */ 91ири1Сигче(...); /* 0 */ 91иЕпотг(в(), 91иВе91пТпв(); 91иги)сигче(...): /* Е */ д1иЕпиТюв(); 91иЕЬЕ5игтасе(); Рис.
12.5. Параметрические кривые усечения На рис. 12.6 показана та же небольшая возвышенность с рис. 12А, но с кривой усечения, скомбинированной из кусочно-линейной кривой и )ч)БКВБ-кривой. Программа, создающая эти фигуры, подобна представленной в листинге 12.5; разница заключается в процедурах, включенных в листинг 12.8. Рис 12.6. Усеченная Н()КВ5-поверхность Интерфейс 8[1)йВ5 библиотеки 6Ш 465 Листинг 12.8. Усечение Р[ОйВ5-поверхности: Спш.с чо! и О( твр1ау(чо10) ( 6С(1оат Хоп[в[В) = (8.9, 0.8, 0.0, 8.8, 1.9, 1.9, 1.9, 1.0); 6С(1оаС еийеРС[5)[2) = /* против часовой стрелки */ ((9.0, 0.0), (1.0, 0.0), (1.8, 1.9), (0.9, 1.8), (0,0, 0.0)): 6с(1оас согчеРс[4)[2) = /* па часовой стрелке */ ((В.г5, о.5), (В.г5, 9.75).