Работа с текстурами

```
***Основная статья***

```

## Раскладка

В первую очередь нужно отметить важность равномерной плотности текстуры на поверхностях модели, обращенных к зрителю. Для контроля за равномерностью плотности рекомендуется использовать специальную «шахматную клетку». Она поможет также оценить деформацию текстуры и ее **flip** (буква «R» на предлагаемой текстуре поможет понять, где текстура обращена задом наперед). Для неквадратных текстур нужно указывать **tile** в текстурной карте 3DSmAX в соответствующей пропорции (например для текстуры с соотношением 1:2 U tile=10, V tile=20).

Перед выполнением раскладки текстурных координат (РТК) моделер должен четко представлять себе, какие текстуры он будет использовать на модели. РТК – это этап, на котором может произойти переопределение набора текстур для модели, если в процессе выполнения раскладки окажется необходимым совмещение нескольких текстур или наоборот, их разделение.

К началу выполнения РТК также необходимо знать, нужна ли уникальная раскладка для данной текстуры (это может быть вызвано применением **bump** или **lightmap**). При такой раскладке каждая грань занимает свое отдельное место на текстуре, можно совмещать на одном участке только абсолютно одинаковые 3D элементы с одинаковыми условиями освещения и материалом. Уникальная раскладка не должна выходить за пределы текстурного поля (U=0..1, V=0..1).

В случае неуникальной раскладки нужно знать, каким образом выполняется повторение (**tile**) текстуры. Если простое повторение на данном участке модели недопустимо (нарушается узор, происходит деформация текстуры или нет возможности разрезать модель в нужном месте без нарушения РТК), допускается введение дополнительных полигонов, по которым будет проходить например, шов на текстуре стены.

Следует помнить: правильно созданная РТК – это сэкономленное время работы над текстурой. На раскладке должно быть, по возможности, минимум кластерных швов (поскольку они не только затрудняют рисование текстуры, но и вызывают дублирование вертексов при рендере) – разрывы на текстуре всегда трудно стыковать, но без них, к сожалению, не обойтись. Нельзя использовать исключительно автоматическую РТК, предоставляемую пакетом моделирования – раскладка получается математически правильной (соблюдена плотность), но неудобной для художника.

Раскладка выполняется любым удобным способом, но есть некоторые рекомендации:

* Для простых форм можно использовать пару модификаторов **Mesh**(**Poly**)**Select - UVWMap**. В последнем используется метод **Planar**, **Box**, **Cylinder**, **Spherical** для соответствующих ситуаций (плоские стены домов, стволы пушек – вполне могут быть развернуты с помощью соответствующих примитивных методов, сферическое наложение можно применять только на сферические объекты).
* Для любых других рекомендуется выделить в **UVWUnwrap** все полигоны и выполнить **Mapping - Flatten** **Mapping** с настройками **Face** **Angle** **Threshold**: от 20 до 60 в зависимости от характера поверхности, обычно 45; **Spacing**: 0,002; включены **Normalize** **Clusters**, **Rotate** **Clusters**, **Fill** **Holes**. После этого выполняется выделение и сшивание (**Stitch** **Selected**) мелких кластеров в более крупные и удобные для текстурирования кластеры.
* По окончании РТК все отдельные части модели, располагающиеся на одной текстуре, нужно объединить в единое целое – **attach** (обязательно, если это сетка персонажа). Это нужно для того, чтобы выполнить компоновку полной раскладки. С помощью **UVWUnwrap** кластеры расставляются и масштабируются таким образом, чтобы минимизировать потери полезного места на текстуре и повысить удобство ее рисования.
* Отдельным слоем в исходнике текстуры (**psd**, **tif**) можно пометить части раскладки (просто подписать их) – для удобства. Кроме того в исходнике нужен слой с проволочной схемой (**wireframe**) раскладки полигонов. Его можно получить с помощью утилиты **Texporter** и далее в **PhotoShop** дать слою с **wireframe** тип **Screen** либо **Exclusion** (фон должен быть черным, линии – белыми).

### **Важно:**

1. Если используется уникальная раскладка для **bump**, то требуется следующее: для смежных граней, использующих одинаковую группу сглаживания, кластер должен быть непрерывным. Например, если на текстуру разворачивается согнутая труба, то на сгибах нужно не только сшить геометрические вертексы, но и вершины на раскладке, иначе при рендере возникнут непредусмотренные визуальные изломы поверхности.
2. Везде, где несколько вертексов на текстуре совпадают, их нужно сшивать вместе.
3. Швы цилиндров и т.п. частей модели на раскладке нужно делать по внутренней или невидимой стороне объекта. Например: шов текстуры рукава нужно делать по внутренней стороне руки, которая меньше всего видна зрителю.
4. Чтобы избежать проявления границ текстурных участков в игре из-за фильтрации, не следует располагать нестыкующиеся кластеры вплотную друг к другу, но нужно заполнять пространство, прилегающее к границе любого кластера текстурой (или иногда цветом) этой границы.

## **Формат текстур**

### **Размеры**

Поскольку рендер каждого кадра в игре производится аппаратно, нужно использовать все доступные возможности для ускорения этого процесса. Видеопамять организована таким образом, что быстрее всего происходит доступ к данным, расположенным по быстро вычислимым адресам. Такие адреса получаются операцией сдвига и соответствуют степеням двойки (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048.......). Исходя из этого, оптимально расположатся в памяти текстуры с размером стороны, равным степени двойки. При этом текстура не обязательно должна быть квадратной. Возможно использование и текстур других размеров, но при этом, если текстура не объединяется с другими при загрузке в игре, будет нерационально расходоваться видеопамять за счет дополнения текстуры до размеров степени 2 (и в этом случае память будет расходоваться бесконтрольно!).

Нужно привести текстуру в любое возможное соответствие с размерами сторон 2n. В крайнем случае, можно немного пожертвовать пропорциями текстуры и учесть это при наложении на модель (например, 256x280 лучше превратить в 256x256, чем доращивать до 256x512). Или же оставить по краям небольшие пустые места (если текстура «не дотягивает» до нужных размеров) – возможно, они даже понадобятся в дальнейшем.

Небольшое исключение можно сделать для текстур, сжимаемых в формат **DXT**# – для этих текстур важно, чтобы размер сторон был кратен 4 (соответствует размеру кванта сжатия). Но все равно рекомендуется использовать только размеры степени 2.

#### **Важно:**

Текстуры с размером стороны, равным 1, нежелательно создавать, поскольку возникнут проблемы с фильтрацией при рендере. Минимальный размер стороны текстуры равен 2. Максимальный размер всей текстуры, для большей совместимости с различными видеокартами, не рекомендуется делать больше 2048х2048 (такой размер тоже нужно использовать только в крайнем случае).

## **Материалы**

### **Именование материалов**

Все имена должны быть логически обоснованы, если их больше одного на модели. Для одного-двух материалов допустимо давать имя «**material1**», «**mtl1**» и т.п. Однако крайне рекомендуется давать мнемонические имена, типа «**hull**», «**barrel**», «**stuff**» и т.п. Нельзя оставлять автоматически назначаемые имена типа «**Material #378**», особенно при большом количестве материалов в модели (больше 3) – возможно после вас с моделью будет работать кто-то другой и потратит ценное время на выяснение, к чему данный материал относится.

Имя мультиматериала рекомендуется начинать с префикса «**multi\_**» (для удобства навигации в списке материалов). Желательно, чтобы имена материалов совпадали с именами диффузных текстур. Это может оказаться полезным, т.к. в дальнейшем, возможно, некоторые материалы будут выноситься в общие папки, что потребует уникальности их имен. Имена материалов, как и имена костей в иерархии объекта не должны содержать пробелов, знаков препинания и т.п. символов, недопустимых в именах файлов.

#### **Важно:**

Все материалы при изготовлении модели в 3DSMAX должны быть типа **Standard**, «обернутые» в материал-оболочку **EclipseMtl**. Исключение составляют мультиматериалы, для которых требуется только название, удобное для моделера. Для их дочерних материалов – то же требование, что и для независимых материалов. Очень часто наблюдается ошибка, когда в сцене с моделью сложного объекта (например, дома) присутствует полсотни мультиматериалов с одинаковым набором дочерних материалов и все это названо с помощью автоматической системы именования 3DSMAX. В таком наборе приходится разбираться не меньше получаса, вычищая лишнее и создавая ссылки типа **instance** для одинаковых материалов. Контролируемый процесс создания материалов так же важен, как и процесс создания самой модел.! Если текстура не указана, то автоматически генерируется текстура размером **2x2** с диффузным цветом материала. Следует избегать таких ситуаций, поскольку появляются лишние текстуры, к тому же материалов без текстур в модели быть не должно.

### **Типы материалов в игре**

1. В материале-оболочке **EclipseMtl** в 3DSMAX должен быть выбран тип смешивания («прозрачность»):
	* для непрозрачных материалов обязательно **None**.
	* для решеток и т.п. материалов, не требующих полупрозрачности – **Test**.
	* для полупрозрачных материалов – **Blend**.
	* для светящихся материалов – **Add**.
	* для некоторых специальных материалов – **Sub**.
2. В простейшем случае текстура накладывается на модель с помощью материала типа **simple** в игровом движке. Этот материал содержит только диффузную текстуру (канал **Diffuse** в материале 3DSMAX).
3. Для имитации рельефной поверхности и металлического блеска используется материал типа **bump**. Для него в материале 3DSMAX должны быть указаны диффузная текстура, а также **bump**-текстура (канал **Bump**, уровень подбирается экспериментально) и маска бликов **specular** (канал **Specular Level**). Могут быть либо обе текстуры, либо одна из них – все равно материал будет типа **Bump**. В случае использования маски **specular** имеет значение цвет (**Specular Color**) – он будет экспортирован и использован в игре.
4. Для имитации отражения используется материал типа **envmap**, оперирующий с заданной кубической картой отражения («энвирой»). Для настройки такого материала должна быть указана только диффузная текстура и в **EclipseMtl** установлен флажок «мэппинг окружения». Если материал отражает равномерно (вода, чистое стекло), можно указать только «коэффициент отражения»: 1.0 – только для зеркал, для стекла и воды – макс.0.8. Если имитируется естественно загрязненное стекло или протертый до полировки металл, а также в случаях если не вся поверхность с данным материалом должна отражать, нужно использовать маску – отдельную текстуру, указываемую в поле «маска отражения». При использовании маски коэффициент отражения игнорируется. В игре материалы, использующие кубические карты окружения, могут использовать энвиру-по-умолчанию, указанную в настройках погоды. Это обычно верно для воды и стекол в окнах. Для всех остальных поверхностей обычно степень блеска невелика и приходится подбирать энвиру вручную, чтобы наиболее качественно подчеркнуть эффект отражения (обычно это касается металлов). В таком случае нужно указать еще и «карту отражения».
5. Для имитации загрязнений, оттенения, а также для усиления объема, без модификации основной диффузной текстуры – используются лайтмапы. Они реализованы посредством применения материала типа **multiply**. Также этот материал можно использовать для отрисовки сложной текстуры, полученной умножением цвета одной на другую (может применяться как подкраска некоторых материалов). Для использования лайтмапы в материале нужно вместо обычной текстуры в диффузном канале использовать карту **RGB** **Multiply**, в которой в поле **Color#1** указывается основная диффузная текстура, с **Map Channel=1**, а в **Color#2** – текстура лайтмапы с **Map Channel=2**. Если предполагается использование лайтмапы, которая одновременно и затемняет и осветляет модель, в **EclipseMtl** выставляется флажок «**Modulate2X** **lightmap**».

### **Набор материалов для модели**

Скорость рендера в игре зависит, помимо прочего, от количества разных типов материалов. Все одинаковые материалы объединяются при рендере в один проход отрисовки. Вообще, чем меньше материалов на модели, тем лучше. В идеале несколько моделей могут использовать не только одни и те же текстуры, но и ссылаться на одни и те же материалы. При подготовке набора материалов нельзя забывать о максимальном размере поддерживаемых текстур. В случае, когда нужно покрыть текстурой модель значительных размеров, то настоятельно рекомендуется использовать лайтмап, который позволит разделить детали текстуры на мелкие-четкие (базовая «затайленная» диффузная текстура) и крупные-размытые (лайтмап). Оптимизация требует компромисса между полигонами и текстурами. Возможно, на этапе подготовки набора материалов, придется переделать часть модели, если от этого будет зависеть сокращение количества текстур и материалов и, как результат, выигрыш в скорости прорисовки объекта. Если текстура не содержит альфа-канала, а необходимо использовать полупрозрачность (например, альфа задана в вершинах), то в материале нужно задать **Opacity=99%**.