Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Рельефное текстурирование
Первый метод основан на использовании рельефных карт (Bump Mapping).
Рис. 13.20
Рельефная карта — это обычная текстура, только в отличие от первой, несущей информацию о цвете определенных участков, рельефная карта несет информацию о неровностях. Самый распространенный способ представить неровности - это применить карту высот. Карта высот — это текстура в оттенках серого, где яркость каждого пикселя представляет, насколько он выдается из базовой поверхности. Используя карту высот, можно имитировать неровности практически любой поверхности: дерево, камень, шелушащуюся краску и т.д. Конечно, у всего есть свои пределы. Используя bump mapping, нельзя имитировать крупные впадины и возвышенности, но вот для имитации неровностей и шероховатостей на поверхности этот метод подходит идеально. По сути, это логическое продолжение техники просчета по Фонгу, где интерполируется нормаль к поверхности по всему полигону, и этот вектор используется для дальнейшего определения яркости соответствующего пикселя. Реализуя его, немного меняется направление вектора нормали, основываясь на информации, содержащейся в карте высот. Изменяя положение вектора нормали в конкретной точке полигона, меняется яркость текущего пикселя (закон косинуса из теории света).
Рис. 13.21
Для того, чтобы этого достичь, существует несколько путей. Вначале необходимо преобразовать информацию о высоте неровностей на карте высот в информацию о величине подстройки вектора нормали. Для этого нужно преобразовать высоты с карты в маленькие векторы. Более светлые квадраты соответствуют более выпуклым участкам. После этого для каждого пикселя рассчитывается вектор, указывающей направление уклона поверхности. Рисунок 13.22 демонстрирует нам это. Маленькие векторы указывают на уменьшение высоты.
Рис. 13.22
Для определения этих векторов определяется величина градиента для каждого пикселя: x_gradient = рixel(x -1, y) – pixel(x +1, y) y_gradient = pixel(x, y -1) - pixel(x, y +1),
Рис. 13.23
где x и y — координаты соответствующего пикселя. Теперь, имея в руках значения градиентов, можно подкорректировать вектор нормали в соответствующем пикселе.
Рис. 13.24
На рис. 13.24 показан полигон с изначальным вектором нормали, обозначенным n. Также показаны два вектора, которые будут использованы для изменения положения (направления) нормали к пикселю под ним. Оба вектора должны располагаться параллельно осям координат применяемой карты высот. На рисунке??? показаны карта высот и полигон. На обоих рисунках показаны направления U и V осей координат карты (текстуры) высот.
Рис. 13.25
Пересчитать новый вектор нормали легко: New_Normal = Normal + (U*x_gradient) + (V*y_gradient)
Получив новый вектор нормали, можно просчитать яркость данного пискеля, используя ранее изученную технологию затенения по Фонгу. Для затенения по Фонгу применялся способ с заранее просчитанной картой, которая представляет собой набор яркостей для всех возможных нормалей на полигоне. Таким образом, быстро выполняемым вариантом рельефного текстурирования будет просчет смещений к карте затенения по Фонгу. Результирующей яркостью пикселя будет сумма значений, полученных с карты затенения и рельефной карты. Используя этот подход, мы одновременно будем производить затенение по Фонгу с учетом рельефности рисунка.
|