М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 78
Текст из файла (страница 78)
Теперь усложним. Пусть отношение высоты стены к ее ширине — два к трем, но текстура все еше квадратная. Чтобы избежать искажения текстуры, вам следует спроецировать на стену часть карты текстуры так, чтобы сохранились пропорции. Допустим, что вы решили использовать нижние лве трети карты для текстурирования стены, В таком случае используйте координаты текстуры (О, 0), (1, 0), (1, 223) и (О, 223), раз вершины стенка обходятся против часовой стрелки.
Внесем еще немного сложности. Будем считать, что вас почему-то интересует отображение на экран консервной жестяной банки с наклеенной на нее этикеткой. Чтобы получить текстуру, вы сходили за банкой в магазин, отодрали этикетку и отсканировали ее. Предположим, что этикетка имеет 4 условные единицы длины поперек и 12 единиц вдоль, то есть соотношение сторон — 3 к 1.
Поскольку текстуры должны удовлетворять соотношению 2" к 1, вы можете просто не ис. Присвоение координат текстур 357 пользовать верхнюю треть этикетки или вырезать из нее кусок с необходимыми пропорциями. Допустим, вы отказались от использования верхней трети. Далее заедем допущение, что цилиндр банки аппроксимируется 30 прямоугольниками сдлиной 4 единицы (высота банки) и шириной 12/30 (1/ЗО периметра крышки).
Вы можете использовать следующие координаты текстур для 30 аппроксимирующих прямоугольников; 1:(О, 0),(1/30, 0),(1/30, 2/3),(0, 2 '3) 2:(1/ЗО, 0),(2/30, 0),(2/30, 2/3),(1/30, 2/3) 3:(2/ЗО, О),(З/ЗО, О), (3/ЗО, 2/З),(г/ЗО, 2/3) 30: (29/30, 0), (1, 0), (1, 2/3), (29/30, 2/3) Только несколько кривых поверхностей, таких как конусы и цилиндры, могут быть спроецированы на плоску|о поверхность без геодезических искажений. Люеые другие фигуры претерпят деформацию. В целом, чем выше скругленность (сап аспге) поверхности, тем больше искажается текстура. Всли вас не тревожит искажение текстуры, найти простое рациональное решение етображения несложно. Так, рассмотрим сферу с координатами поверхности (сот 0 соз у, соз 0 гйп д, гйп О), где 0 < 0 ь 2к и 0 < у < к. Карта текстуры может быть хапрямую спроецирована в прямоугольник 0<а, но по мере приближения к полюсзм все сильнее будут проявляться аномалии.
Весь верхний край карты текстуры попадет на «северный» полюс, и весь нижний край — на «южный» полюс. Для хругих поверхностей, таких как тор («бублик») с большим отверстием, координаш поверхности преобразуются к координатам текстуры способом, который вносат лишь чуть-чуть искажений, поэтому он годится для многих приложений. На рис. 9.9 показаны два тора, один с небольшим отверстием (и, следовательно, со значительной деформацией вблизи центра) и один с дырой чуть ли не до краев (х потому с незначительными искажениями). Рис.
9.9. Искажение карты текстуры Вели вы текстурируете сплайновые поверхности, сгенерированные вычислителяка (см. главу 12), параметры и и и поверхности могут в отдельных случаях исюльзоваться как координаты текстуры. Тем не менее в целом успешное наложезхе текстур на полигональные приближения кривых поверхностей требует от вас тысокого мастерства. 358 Глава 9 ° Наложение текаур Повторяемые и обрезанные текстуры Вы вправе задать координаты текстур, выходящие за диапазон [О, 1], и затем «выпилить» этот диапазон или же тиражировать карту текстуры. Второй вариант подходит тогда, когда вы имеете, например, изображение большого самолета с координатами текстуры от 0.0 до 10.0 в двух направлениях.
Тогда вы получаете 100 копий текстуры, сопряженных на экране в плиточную поверхность. При размножении текстур целые части координат текстур игнорируются, благодаря чему копии укладываются рядом, не перекрываясь. Для болыпинства приложений, использующих повторение текстур, текселы наверху текстуры должны соответствовать пикселам снизу, и то же верно для правого и левого краев.
Допускается «зеркальное» расположение, где плитки чередуются в порядке «туда-сюда» (([[р-йор), другими словами — наподобие триггерного переключения. Например, в пределах диапазона координат текстур [О, 1] текстура может выглядеть ориентированной слева направо (или сверху вниз или от ближнего конца к дальнему), но здесь слово «зеркальное» обозначает смену ориентации текстуры в направлении «справа налево» для диапазона [1, 2], снова «слева направо» для координат [2, 3] и т.
д. Другая возможность состоит в ограничивании (с1ашр) координат текстур: любые значения большие 1.0 устанавливаются а 1.0, и любые значения меньше 0,0 устанавливаются в 0.0. Такое вырезание полезно для приложения, где вам нужна одна копия текстуры на большую поверхность. Если диапазон координат текстуры для поверхности охватывает значения от 0.0 до 10.0 в обоих направлениях, в левом нижнем углу поверхности появится только один экземпляр текстуры. Если вы используете текстуры с границами или задали для границы определен. ный цвет, на интерпретацию информации границ будут влиять как режим обработки границ (ч гарр1пя), так и метод фильтрации (см.
раздел «Фильтрация»). Если фильтрация выполняется по принципу 61 МЕАкЕ5Т, используется ближайший тексел текстуры. Для большинства режимов наложения граница (или ее цвет) игнорируется. Тем не менее, если координаты текстур выходят за рамки [О, 1] в задан режим наложения 61 С САЯР ТО ВОМОЕЙ, выбирается ближайший тексел ва границе. (При отсутствии границы используется некоторый константный цвет.) При фильтрации по методу 6С 11МЕАР используется взвешенное значение по массиву 2 х 2 (для двухмерных текстур) данных цвета. При задании границы и/или ее цвета оба свойства применя1отся совместно, по следующим правилам; ° в режиме обработки границ 6С МЕР ЕАТ граница игнорируется во всех ситуациях. К вычислениям привлекается массив 2 х 2 тексела с противоположного края текстуры.
Таким образом, текселы с правого края усредняются с пиксе- лами левого края, и то же верно для левого и правого краев; ° в режиме 6С ССАИР для тексела на границе (или в режиме 61 ТЕХТОЯЕ ВОМОЕМ СОСОМ) используется средневзвешенное по массиву 2 х 2 тексела; ° в режиме 6С ССАИР ТО ЕО6Е граница игнорируется всегда. Для вычислений привлекаются текселы вблизи краев текстуры; Присвоение координат текстур 359 ° в режиме 6С ССАМР ТО ВОКОЕК, если координаты текстуры выходят за диапазон [О, 1~, в расчет принимаются только текселы границы (при отсутствии границы основываются на константном цвете границы).
Для близких к краевым координатам текстуры в массив 2 х 2 тексела могут быть выбраны текселы как с границы, так и из внутренней области текстуры. Если вы используете ограничивание, вам следует избегать краевых эффектов при юаимодействии текстуры и поверхности. Для этого используйте значения альфа- компонента 0 для краев (или границ, если они заданы) текстуры. Функция деколи непосредственно использует значения альфа-компонента текстуры в своих вычислениях. Если вы используете несколько функций текстур, может потребоваться также включить смешивание с подобающими факторами влияния для источника и приемника.
(См. раздел «Смешивание» главы 6.) Чтобы увидеть эффект от обработки границ, вам следует рискнуть и задать координаты вне диапазона 10.0, 1.01. Для начала возьмите пример из листинга 9.1 и измените координаты текстуры для квадратов с 0.0 на 4.0, как это сделано ниже: 11зеВ(п(6С ООА05); В1ТехСоогб2Е(8.8, 0.0); В1Неггех3Е(-2.8, -1.8, 0.0); В1ТехСоогб2Е(0.0. 4.0): В1ЧеггехЗЕ(-2.0, 1.8, 0.0); В1ТехСоогб2Е(4.0, 4.0); В1уегсех)Е(8.8, 1.9, 0.0); В1ТехСоогб2Е(4.0, 9.9); В1НегсехЗЕ(8.8, -1.8, 0.8); В)техсоогб2Е(8.8, О,О>; В(уеггех3Е(1.0.
-1.О, 8.9>; В1ТехСоогб2Е(0.0. 4.0); В1Чегсех)Е(1.9, 1.0, 9.9); В1ТехСоогб2Е(4.0, 4.0); В1ЧегсехЗЕ(2.41421, 1.0, -1.41421); В1ТЕХСООГб2Е(4.0, 9,0); В1ЧЕГТЕХЗЕ(2.41421, -1.0, -1.41421); 11Епб(>; Для режима 6С КЕРЕАТ результат продемонстрирован на рис. 9.10.
Здесь текстура дублируется сразу в двух направлениях, 3 и 6 это делают вызовы В1Тех Ра г а не Се г'(): 11техРагавегег1(6с техтОКЕ 20, 6с тЕХтцкЕ ИААР 5, 6( кЕРЕАТ); 11ТехРагаиегег((6С ТЕХТОКЕ 20, 61 ТЕХТОКЕ ИКАР Т, 61 КЕРЕАТ); Некоторые реализации Орепб). поддерживают режим 6С М1ККОКЕО КЕРЕАТ, обращающий ориентацию целочисленных коорлинат текстур. На рис. 9.11 показана разница между обыкновенным размножением с переносом (слева на рисунке) и зеркальным повторением (справа). Рис. 9.11. Режим 61 КЕРЕАТ в сравнении с 66 М1ККОКЕО КЕРЕАТ Рис.
9.10. Повторение текстуры На рис. 9.12 продемонстрировано действие режима 6С ССАМР в применении к обо- им направлениям. В местах, где координата 3 или г болыпе единицы, используется тексел, взятый оттуда, где значение координаты текстуры в точности равно 1. 360 Глава 9 ° Наложение текпур Рис. 9.12.
Ограничивание текстуры Режимы обработки границ по каждому направлению независимы. Вы вправе так- же применить ограничение в одном измерении и повторение для другого, как по- казано на рис. 9.13. Рис. 9.13. Размножение текстуры вместе с ограничиванием Теперь, после рассмотрения всех аргументов В1техрагаветег*(), суммируем все в одной подпрограмме. уо1с) 91техрагаветегЯ(С)епит гагдет, С|еппш рпате, ТУРЕ рахат)' уо1г) В1Техрагааетег(11)у(СЕепцш Гасящей С1.ещнп рпате, ТУРЕ "Рахат); Устанавливает различные параметры, управляющие обработкой текстуры, применением ее к фрагментам и сохранением в объекте текстуры. Аргумент Гагяеувыбнрается из 6! ТЕХТОЙЕ 10,6! ТЕХТОЙЕ 20, 6! ТЕХТОЙЕ 30 или 6! ТЕХТОКЕ СОВЕ ИАР в соответствии с характером текстуры.
Возможные значе. ния для аргументов рпате и рахат приведены в табл. 9.7. Вы можете задавать параметры по отдельности обычной версией команды, и в вашем распоряжении также ее векторная форма, работающая с массивом значений для случая 6! ТЕХТОЙЕ ВОйОЕЙ СОСОК. Если значения представлены целыми числами, они преобразуются в формат с плавающей запятой согласно табл.
4.1; кроме того, они ограничиваются диапазоном 10, 11 Таблица 9.7. Аргументы команды 4техРвгате1ег*() Значения Параметр 6! ССАИР,6! ССАМР ТО ЕООЕ,6! ССАМР ТО ВОЙОЕЙ,О! ЙЕРЕАТ, 6! М[КЙОЙЕО КЕРЕАТ 6! ССАМР,6! ССАИР ТО Е06Е,6! С!АМР ТО ВОКОЕй,6! КЕРЕАТ, 6! М1ККОКЕО КЕРЕАТ 6! С1АМР, 6! С!АМР ТО Е06Е, 6! ССАИР ТО ВОКОЕК, 6! КЕРЕАТ, 6! М1ККОКЕО КЕРЕАТ 6$ МЕАКЕ5Т,6! С!НЕАЙ 6! ТЕХТОКЕ )УВАР 5 6! ТЕХТОКЕ ЬУКАР Т 6! ТЕХТОЙЕ ЪУЙАР й 6! ТЕХТОКЕ МА6 ЕП.ТЕК Значения Параметр 6! ТЕХТОРЕ М)И Р1СТЕР Упражнение Рисунки 9.12 и 9.13 получены с исгюльзованием б! ИЕАРЕ5Т для фильтров уве- личения и миниатюризации. Что же произойдет, если вы изме»гите это значение ка б! С1ИЕАР? Результирующее изображение должно выглядеть не таким рез- иим. Информация границ может потребоваться во время обсчета текстурирования. Для простейшей демонстрации этого установите б! ТЕХТОРЕ ВОРОЕР СОСОР в хорошо заметный цвет.
Установив фильтры в б! ИЕАРЕ5Т и режим обработки границ 6! ССАИР ТО ВОРОЕР, оцените эффект от цвета границы текстуры на текстурируемый объект (для диапазона координат текстуры вне [О, 1]). Граница также оказывает воздействие на текстурирование с фильтрами б! С1ИЕАй и режимом обработки границ б! ССАИР. Что теперь случится, если включить режим б! ССАИР ТО Е06Е или б! РЕРЕАТ? Для обоих случаев цвет границы игнорируется. ПОсобие по текстураи от Нэйта Робинса Запустите пособие по текстурам Нэйта Робинса и оцените влияние параметров 6! РЕРЕАТ и б! ССАИР.