М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 79
Текст из файла (страница 79)
Для этого вам может потребоваться сделать текстурные координаты вершин (аргументы ВТТехсоо гс(2( () ) меньше 0 и/или болыпе 1. Автоматическая генерация координат текстур Вы можете использовать наложение текстур для образования контуров своих моделей или для имитации отражения от произвольного окружения для «зеркальаой» модели. Чтобы достигнуть этого эффекта, позпольте ОрепС[. генерировать вюрдинаты текстур за вас, вместо явного их задания командой В!Техсоогв'(). Я ТЕХТОРЕ ВОРОЕй СО!Ой 61„ТЕХТОРЕ Рй!ОЙПН 6! ТЕХТОРЕ М1И СОО 6! ТЕХТОРЕ МАХ ЕОО б! ТЕХТОРЕ ВА5Е СЕНЕ! 6! ТЕХТОРЕ МАХ СЕНЕ! б! ОЕРТН ТЕХТОРЕ МОВЕ 6! ТЕХТОРЕ СОМРАРЕ МОВЕ Б! ТЕХТОРЕ СОМРАРЕ„РОЙС 6! 6ЕИЕЙАТЕ М1РМАР Автоматическая генерация координат текстур 361 б! ИЕАРЕ5Т,О! С1ИЕАР,6! ИЕАРЕ5Т М!РМАР ИЕАРЕ5Т, б! ИЕАРЕ5Т М1РМАР С1ИЕАР, б! С)ИЕАР М1РМАР ИЕАРЕ5Т, б! С1ИЕАР М1РМАР !1ИЕАР Любые четыре числа из диапазона [0,0; 1,0) [0,0; 1,0[ для текущего объекта текстуры Любое значение с плавающей запятой Любое значение с плавающей запятой Любое неотрицательное целое Любое неотрицательное целое б! СОМ!ИАИСЕ,6! 1ИТЕИ51ТУ, б! АСРНА б! ИОНЕ,6! СОМРАРЕ Р ТО ТЕХТОРЕ 6! СЕООАС б! 6ЕООА! 6! ТРОЕ, 6! ЕА!5Е 362 Глава 9 ° Наложение текпур Чтобы сгенерировать координаты текстур автоматически, используйте команду к1Тех6еп().
чоЫ ВТТех6еп(1И)(С!.епцш соог«(, 01.еппш рпате, ТУРЕ рахат). чо1о яТТех6еп(1Щч(С1 епшп сооп1, С1епц|п рпате, ТУРЕ *рахат); Задает функции для автоматической генерации координат текстур. Первый аргумент, соог 1, должен быть задан как 6 С 5, 6 С Т, 6 С Н или 6 С О согласно типу генерируемой координаты — я 6 г или х). Значение аргумента рпате выбирается из констант 6С ТЕХТОНЕ 6Ей НООЕ, 6С ОВ)ЕСТ РСАМЕ или 6С ЕТЕ РСАМЕ. Если зто 6С ТЕХТОНЕ 6ЕМ НООЕ, аргумент рахат должен быть целым числом (или, для векторной версии команды, должен указывать на целое число), одним из следующих: 6С ОВЛЕСТ С1МЕАН, 6С ЕУЕ С1МЕАР, 6С 5РНЕНЕ НАР, 6С НЕРСЕСТ10М НАР или 6С МОННАС НАР. Эти символические имена определяют, какая функция будет использоваться для порождения координат текстур.
Для других допустимых значений рпате аргумент рахат является указателем на массив значений (векторная версия), задающих параметры генерирования. Для различных областей применения используются различные методы генерации координат текстур. Указание опорной плоскости (ге)егепсе р!апе) в координатах объекта предпочтительно тогда, когда изображение текстуры остается привязанным к движущемуся обьекту. Таким образом, константа 6С ОВ)ЕСТ С1МЕАх может быть использована для покрытия древесными прожилками площадки, Задание опорной плоскости в координатах наблюдателя (6С ЕТЕ С1МЕАН) — лучший способ для получения контуров линий подвижных объектов.
Параметр 6С ЕУЕ С1МЕАН находит применение у специалистов в области геологических наук, которые занимаются нефтедобычей или газодобычей. Так как бур проходит сквозь земную кору, могут понадобиться различные цвета для представления срезов по. роды с ростом глубины.
Параметры 6С 5РНЕНЕ НАР и 6С НЕРСЕСТ10М НАР главным образом используются для наложения сферообразного окружения, а 6С МОкНАС НАР— для «кубических» карт текстур. (См. разделы «„ Сферические" карты» и «„ Кубические" текстуры»). Создание контуров Когда заданы параметры 6С ТЕХТОРЕ 6ЕМ НООЕ и 6С ОВОЕСТ С1МЕАН, функция генерации является линейной комбинацией значений вершин в координатах объекта (х„у„, г„, ю„): сгенерированная координата = р, х„+ р,у„+ р,г„«р,т.. Значения рв..., р4 передаются в аргументе рахат команде кТТехбеп«ч (), с рпате, установленным в 6С ОВ)ЕСТ РСАМЕ. С корректно нормализованными рь..,, р, зта функция выдает расстояние от вершины до плоскости.
Например, если р,- .= р, = р4 = О и р, = 1, зто расстояние х = О. Оно положительно с одной стороны плоскости и отрицательно с другой, и равно нулю, когда вершина принадлежит плоскости. Автоматическая генерация координат текстур 363 В листинге 9.8 первым делом рисуются равно дистанцированные линии чайника; оня указывают расстояние от плоскости х - О. Коэффициенты для такой плоскости помещены в массив: ч!а!>с 6СЕ1оа! кечиа1гего(] = (1.9, 9.9, 0.9, 0.9); Поскольку здесь показывается только одна свойство (расстояиие от плоскости), достаточно одиомериой текстуры, Карта текстуры имеет сплошную зеленую окраску, за исключением красных меток для равноотстоящих интервалов.
Так как чайник находится в плоскости яз(, все контуры перпендикулярны их основанию, На цветном рис. 18 показана картинка, полученная этой программой. Здесь Нажатие клавиши 5 изменяет параметры плоскости отсчета иа ч!а!чс 6С(]оат я>аптоб(] = (1.0, 1.О, 1.О, О.Э>; Полосы контуров параллельны плоскости х + у + г - О, и пересекают чайник под углом, как показано иа цветном рисунке 18. Чтобы восстановить исходные зиачеввя, х = О, нажмите клавишу х. Листинг 9.8.
Автоматическое генерирование координат текстур: (ехдеп.с ябе(]пе ятг(ре!вааей>б(П 32 6(иЬу!е ясг(ре1ваэе(4'ясг(ре1ваэейчбть]; ч!а(чс 6(и!пт техкэве; чо>б вахе5Сг>ре1ваае(чочб) ( (п! 1; (ог (> = Э; > < я(г>ре1вааей(б!Ь; )++) ( ясг(ре]вазе(4*1] = (6сиьу!е) ((> =4> 2 255: О>; ятг>ре1ваае(4']ч1! = (6СиЬУ!е) ((]>4) ? 255: 0); я!г(ре1ваае(4'1+2] = (6(иЬусе) 9; ягг(ре1ваае(4']+3] = (6(иоуте) 255; р Ппоскосчи дпя генерации координат текстур чl иа((с 6С(!оас кечиа1тего(] = ( 1.0, 9,0, 9.0, 9.9); чш(>с 6С(1оа( 51ап!еб(] = (1.0, 1.0, 1.0, 0.9>; ч!а((с Ос(1оас *сиггеп(сбег(; Иа((с Эсепив сиггеп(Р1апе; ч(а!чс 6((пс сиггеп(6епМобе; чо(б >пчт(чо>Ч!) ( 91С1еагса1ог(9.9, 0.0, 0.9, 0.9); 91Епао]е(6( ОЕРТН ТЕ5Т); 515пабеиобе1(6С 5МООТН); вахе5(г! ре1ваае(); а]Р>ке)5(огеч(ОС ОНРДСК ДЩОММЕМТ.
И; 516ептектигея(1, $(екиаве); а>В(потек!иге(6( ТЕХТОМЕ 10, текиаве); продолжение бч Автоматическая генерация координат текстур Зеа5 саче 'Е'; соггеп(6епиобе = 6С ЕЧЕ С1МЕАК; соггепСР1апе = 6С ЕЧЕ РСАМЕ; В1ТЕХОЕПч<6( 5, 6С ТЕХТОРЕ 6ЕМ МООЕ, СОГГЕПСОЕПИОИЕ): В1техбепеч(6с 5, соггепсР1апе, сиггепссоеее); В1ЬСРоагкеб!ар!ау(); Ьгеаа; саче 'о': саае '0'; соггепгбепИобе = 6( ОВ)ЕСТ (1МЕАИ; сиггепСР1апе = 6С ОВ)ЕСТ РСАМЕ; В1Техбеп!(6С 5, 6С ТЕХТОРЕ 6ЕМ МООЕ, соггепС6епИобе); В!Техбеп(ч(6( 5, соггепСР1апе, сиггепгСоеЕЕ); В1иСРоьСРеб!ьР1аУ(); Ьгеак, саве 'ь': саае '5': соггепССоеЕЕ = 51ап(еб; В1Техбеп(ч(6С 5, сиггепСР)апе, сиггепССоеЕЕ); В!оСРоаСМебы ар!ау<); Ьгеах.
сдае 'х': саае 'Х'; сиггепССоеЕЕ = хеччассего; В1техбепеч(6с 5, соггепсР1апе, саггепссоеее); В(о!Рос(аеб!ар(ау(): Ьгеах; саве 27: ехЕС(е); Ьгеах; бе(аи1С: Ьгеах', <пс аа(п(зпс агас, спаг*' агвч) ( В1и(1п!С(аагвс, агвч); 51оС!п!'СОЕьР1ауМобе(6< ОТ 51МОСЕ [ 6(ОТ РОВ [ 6!ОТ ОЕРТН); 51о(1п!СН!пбои5зсе(256. 256); 51ос1п!СИ!пбоиРоь!с(оп(1ВВ, 100); В!оССгеаеекм пбои(агвч[0)); <п!1(); В!о!в!ьр1аууопс(б!ар!ау); В1иСРеаиарерипс(геьоаре); В1о(кеуЬоагбрипс(хеуЬоагб); В!о!на(п(оор(): гееогп О; ) Генерация текстур для координаты з включается передачей параметра 6 С ТЕХТ О РЕ ЕЕМ 5 в функцию к1Епаа!е(); для других координат это параметры 6С ТЕХТОРЕ ЕЕМ Т, 6С ТЕХТОРЕ 6ЕМ Р и 61 ТЕХТОРЕ 6ЕМ ([.
Для отключения этого режима Збб Глава 9 ° Наложение текстур используется команда 610)зао)е() с подходящей константой. Также обратите внимание на использование 61 ЯЕ Р ЕАТ с целью получения линий контура, повторенных поперек чайника. Функция текстуры 61 ОВ) ЕСТ 11МЕАЯ вычисляет координаты текстуры в системе координат модели.
В программе из листинга 9.8 сначала применяется эта функция, так что контуры линий перпендикулярны основанию чайника, без оглядки на то, что чайник может вращаться или измениться точка наблюдения. Однако, если вы нажмете клавишу е, вы переключитесь из режима 61 ОВ)ЕСТ 11МЕАЯ в режим 61 Е 1'Е 11МЕАЯ, и контуры будут вычисляться относительно системы координат наблюдателя. (Нажатие клавиши о снова возвращает режим 6! ОВ) ЕСТ 1 1М ЕАЯ) Если опорная плоскость х - О, на чайнике рисуются красные полосы, параллельные плоскости уг от точки наблюдения, как показано на цветном рис.
18. Математически зто описывается так: вы умножаете вектор (р, р, рз р,) на обратную модельно-видовую матрипу, чтобы получить значения, используемые в вычислении расстояния до плоскости. Координата текстуры генерируется следующей функцией: сгенерированная координата - р,'х, + р,.'у, + рз'г„-~ р,'тв„ где (р,' р,' р,' р,') = (р, р,, рз р4) и-'.
В этом случае (х„у„, г„, т,) — координаты вершины в системе наблюдателя, а значения рь..., р, передаются аргументом рахат в процедуру к1Техбел * (), при этом аргумент рпате установлен в значение 61 ЕТЕ РСАМЕ. Значения со штрихами вычисляются только во время их задания, поэтому данная операция не настолько затратна в вычислительном отношении. Во всех этих примерах для генерации контуров используется одна координата. Координаты к г и (если это нужно) г могут быть сгенерированы независимо для того, чтобы обозначить расстояния до двух или трех различных плоскостей.
Соответствующе сформированная двух- или трехмерная карта текстуры вырабатывает два или три набора контуров, которые можно наблюдать одновременно. Чтобы внести дополнительную сложность, вы можете смешать функции генерации координат. Например, можно вычислить координату з, используя режим 61 ОВ)ЕСТ СТМЕАЯ, а координату à — с помощью 61 ЕУЕ 11МЕАЯ. «Сферические» карты Задача наложения на рисуемый объект его окружения в таком изменении цветов поверхности объекта, как если бы он отражал свое ближайшее окружение. Другими словами, если вы смотрите на безупречно отполированный, абсолютно отражающий серебряный объект в комнате, вы видите на поверхности объекта отражение всех стен, пола и других элементов, присутствующих в комнате.