OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 78
Текст из файла (страница 78)
Вы можете подготовить все координаты по отдельности, а можете и использовать векторную версию команды, чтобы сделать это из одного массива. Координаты текстуры умножаются на 4 х 4 матрицу текстуры перед тем, как будет выполнено наложение текстур. (См, раздел «Стек матриц текстур».) Обратите внимание, что целочисленные координаты текстуры интерпретируются непосредственно, а не проецируются в диапазон (-1, 1]. В следующем разделе объясняется, как рассчитать соответствующие координаты текстур.
Вместо явного их присвоения вами, можно воспользоваться средствами ОрепОБ для автоматического их вычисления. (См. раздел «Автоматическая генерация координат текстуры) Пособие по текстурам от Найта Робинса При наличии у вас самоучителя Нэйта Робинса запустите пособие по текстурам и экспериментируйте с параметрами ~1техСоогс(2(О для четырех различных вершин. Посмотрите, как можно наложить часть полной текстуры. Что случится, если вы сделаете координаты текстуры меньше 0 илн больше 17 Вычисление подходящих координат текстуры Двухмерные текстуры — это квадратные или прямоугольные изображения, которые обычно проецируются на многоугольники, образующие полигональную (ро!уяоп— многоугольник) модель. В простейшем случае вы отображаете прямоугольник текстуры в такую же «прямоугольную» модель — например, нашей текстурой может быть сканированное изображение кирпичной стены, и ваш прямоугольник может представлять один кирпич в кладке. Для простоты предположим, что кирпичная стена имеет квадратную форму и текстура тоже квадратная, и вы желаете наложить всю текстуру на всю стену.
Координаты текстуры — (О, 0), (1, 0), (1, 1) и (О, 1) обходятся против часовой стрелки. Рисуя стену, просто задайте зти координаты как координаты текстуры, когда указываете координаты вершин стены, в порядке против часовой стрелки. Теперь усложним. Пусть отношение высоты стены к ее ширине — два к трем, но текстура все еше квадратная. Чтобы избежать искажения текстуры, вам следует спроецировать на стену часть карты текстуры так, чтобы сохранились пропорции. Допустим, что вы решили использовать нижние лве трети карты для текстурирования стены, В таком случае используйте координаты текстуры (О, 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~, в расчет принимаются только текселы границы (при отсутствии границы основываются на константном цвете границы).