четверг, 27 октября 2011 г.

3D текстуры



Допустим, у нас созрела некоторая модель — и выглядит она пластмассовой: единый ровный цвет, ровная поверхность. Надо что-то ещё. Раскрасить её, что ли? - Да, именно. Для этого существуют т.н. материалы и текстуры. 
Материал — это комбинация физических свойств модели: какой её основной цвет, как она поглощает, преломляет, пропускает, рассеивает или отражает свет, какова фактура поверхности и так далее. Эти параметры регулируются с помощью шейдеров — программ, используемых для определения окончательных параметров объекта или изображения (в том числе произвольной сложности описания поглощения и рассеяния света,  отражения и преломления, затенения, смещения поверхности, эффектов пост-обработки и наложения текстур) и самих текстур, — растровых изображений, с помощью которых полигональной поверхности можно придать нужную окраску и/или иллюзию рельефа. В некоторых пакетах с помощью текстур можно воздействовать на карты нормалей и другие характеристики поверхности, связанные с поглощением или отражением света.
Текстурирование — не менее значимый процесс в создании трёхмерной графики, чем непосредственно моделирование, а может быть, и более; и в чём-то он даже более сложен в освоении, нежели работа с полигонами.
Подобрать правильную «одёжку» и, самое главное, правильно её расположить на поверхности модели — задача трудоёмкая и каверзная, особенно, если поверхность сложная.
Возьмём два примера. Первый — это текстурирование определённого природного ландшафта. Тут очень уместно вспомнить, как выглядят открытые пространства в таких играх, как World of Warcraft или других фэнтезийных массивно-многопользовательских играх.
World of Warcraft
Что у нас здесь? Нерегулярная поверхность, ландшафт с возвышениями и впадинами, имитация грунта — песка, травы, воды, в воздухе вон что-то летает... ну, и так далее. Естественно, тут используется множество текстур достаточно высокого разрешения. Но, естественно, не такого высокого, чтобы покрыть весь ландшафт одним растровым изображением (хотя в id Software разработана технология Megatexture, позволяющая поступать как раз таким образом — одной картинкой накрывать весь огромный ландшафт как стол скатертью).
По традиции изготавливаются изображения — квадратные или прямоугольные, со сторонами, чьи измерения строго кратны 16 (256х256, 512х512, 2048х2048, 2048х512 и так далее). Чем больше изображения, тем более подробными они будут выглядеть в сцене или в игре, тем больше деталей удастся передать. Но габариты изображения — это ещё и размеры графического файла, и объёмы занимаемой оперативной памяти, само собой. Помнится, в движке Quake III существовало ограничение: 4 мегабайта текстур на всю карту. Что очень и очень немного, особенно по нынешним временам.
Текстуры должны стыковаться друг с другом бесшовно, что требует их особой подготовки. Наиболее простой, но небезотказный способ — это деление исходного изображения, например, фотографии, на четыре равных блока и перекрёстное перемещение этих фрагментов друг относительно друга как на вот этой схеме:
[A]-[B]
[C]-[D]
_____

[D]-[C]
[B]-[A]
После чего надо замазывать (например, с помощью штампа в Photoshop) образовавшиеся внутренние швы. А также маскировать повторяющиеся фрагменты: текстуре, изображающей, например, траву или песок, стоит выглядеть насколько возможно реалистично, с одной стороны, и однородно — с другой; при наложении на крупную поверхность повторяющейся текстуры, эффект черепицы (tiling) — явного повторения одних и тех же узоров, увы, неизбежен, но его можно хоть как-то спрятать. Если текстура имеет высокое разрешение, то tiling почти незаметен с близкого расстояния. Зато более чем заметен издали. Взглянем на скриншот - 
"Тайлинг" текстур в World of Warcraft
И без особого удовольствия увидим многочисленные «квадратики» на земле — повторяющиеся текстуры. При нахождении вблизи поверхности их почти не заметно.
Способов комбинировать несколько текстур существует множество — например, в трёхмерных редакторах можно назначать разные материалы (и, соответственно, разные текстуры) на разные группы вершин на одной и той же поверхности; можно использовать т.н. трафареты (stencil) для того, чтобы указывать, где одна текстура будет полностью или частично прозрачной, а где — нет, и где, соответственно, из-под неё будет выглядывать другая.
Второй пример — это некрупная трёхмерная модель, требующая достаточно сложной, но единой текстуры для все своей поверхности.
И здесь мы упираемся в UV-развёртку (UV Unwrapping).
UV-развёртка — это страшно. Не самое, пожалуй, уместное для журналистского материала высказывание, но зато справедливое.
На уровне теории тут всё просто: UV-развёртка — это проекция всей поверхности объёмной фигуры на плоскость для последующего расположения на ней растровых изображений (можно вспомнить старые игры типа Quake I или II и процесс изготовления «скинов» для моделей игроков — это как раз рисование текстур по заданной для каждой модели UV-развёртке). Если совсем «на пальцах», то UV-развёртка – это «разрезание» трёхмерной фигуры по заданным швам, так, чтобы она могла лечь на плоскость с минимальными искажениями пропорций.
Это нужно, чтобы избежать масштабных искажений текстуры — чтобы на разных фрагментах модели одно и то же растровое изображение имело одинаковое разрешение. На практике такого добиться удаётся довольно редко, но нужно добиться хотя бы относительного единообразия.
На практике же это целое искусство со своими Незыблемыми Правилами, подстроиться под которые ещё надо суметь.
Первое правило: вся поверхность фигуры должна лечь на плоскость «одним слоем», а то на деле бывает иначе — если швы неправильно выставлены.
Правило второе: развёртка должна быть как можно более непрерывной; просто для того, чтобы художнику проще было ориентироваться по ней. Совсем без «островов» дело вряд ли обойдётся, особенно, если фигура сложная, но и с разбросанными так и сяк маленькими фрагментами радости работать нет никакой.
Правило третье: пропорции развёртки должны соблюдаться. Иначе в одном месте фрагмент текстуры будет иметь одно разрешение, а в другом — другое, и выглядеть это будет ужасающе.
После того, как развёртка готова, её можно экспортировать в любой растровый редактор и использовать в качестве шаблона, поверх которого рисуется текстура со всеми возможными деталями.
Далее приведём пример работы с относительно простым объектом:
Цельный объект без внутренних граней, без заданного материала и текстур. 
Разметка швов под UV-развёртку
Оранжевым цветом обозначены швы (seams), по которым модель будет «разрезаться» для расположения её поверхности на плоскости. По сути дела, UV-развёртка — это примерно то же, что и портновская  выкройка или плоская заготовка бумажной модели для склеивания.
Модель разрезана; вот как будет выглядеть UV-развёртка (серые линии и красные точки). Сразу поверх неё нарисована текстура. Как видно, «солома» размещена так, чтобы совпадать с ориентацией крыши в пространстве. Без искажений, естественно, не обошлось. 
Ну и вот, наконец, вот что получается в итоге:
Готовая модель
Отрендеренная модель. Текстура соломы на крыше выглядит так себе, даже несмотря на хитрость — пакет Blender 3D, в котором данная модель собрана, позволяет регулировать с помощью текстур нормали, добавляя ощущение неровной поверхности. С другой стороны, цели показать супермодель с супертекстурами данный материал и не преследовал. Главное тут — принцип, как это всё делается.Читать далее...

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...

Архив блога