Библиотека материалов

Xtreme3D

Урок 5
Библиотека материалов

Уровень: начинающий
Версия Xtreme3D: 3.0.x
Автор урока: Gecko

Одна из самых замечательных особенностей Xtreme3D — использование библиотеки материалов. Материал - это набор параметров, определяющих внешний вид объекта. В этот набор входят значения цвета, прозрачности, текстуры, типа смешивания и т.д. Понятие материала в Xtreme3D куда более фундаментально, чем во многих других движках. Очень часто под материалом понимается текстура, но в Xtreme3D материал может и не иметь текстуры. В других случаях система материалов бывает непродуманной или неполной, чего нельзя сказать о Xtreme3D.

Материал создается один раз и может быть применен к любому количеству объектов, поддерживающих материалы. Изменение параметров материала коснется всех объектов, использующих этот материал. Такой принцип дает ощутимые выгоды (экономия памяти, объема кода, времени и труда программиста), хотя может вызвать и определенные неудобства (например, если необходимо, чтобы изменения параметров материала коснулись только одного конкретного объекта). Материал в Xtreme3D имеет уникальное имя, по которому осуществляется изменение параметров. Имя задается строковым значением, например "mGround".

Библиотекой материалов (Material Library) называется специальная конструкция, содержащая список материалов. Библиотека может быть активной или неактивной. В первом случае в нее можно добавлять материалы, настраивать их и применять к объектам. Во втором случае это невозможно. Поскольку разные библиотеки могут содержать материалы с одинаковыми именами, нельзя сделать активными две или более библиотеки одновременно.

Смысл в использовании нескольких библиотек материалов заключается в возможности определять для них индивидуальные пути к текстурам. Эти пути учитываются при загрузке моделей, использующих внешние файлы текстур. По умолчанию библиотеки ищут текстуры в рабочей директории игры. Разумеется, хранить их там — не самая лучшая идея. Несомненно, лучше распределить их по отдельным папкам. Например, если у вас есть три папки с тремя разными моделями уровней, то можно будет создать для каждой из них свою библиотеку материалов и назначить им пути к текстурам, соответствующие искомым папкам.

Существует поистине огромное количество разнообразных настроек материалов. Кроме того, материалы позволяют применять к ним шейдеры, "фотографировать" в них картинки с экрана или с камеры, а также хранить различные невизуальные данные, например, маски и карты высот. Охватить в одной статье все возможности, которыми располагает система материалов Xtreme3D, просто нереально. Поэтому мы рассмотрим только самые основные: цвет, текстуру и несколько других.

Сначала создается и активируется библиотека материалов:

matlib=MaterialLibraryCreate();
MaterialLibraryActivate(matlib);

Теперь можно создавать сами материалы:

MaterialCreate('mTexture', 'texture.jpg');

Эта функция одновременно создает материал и присваивает ему текстуру из файла. Xtreme3D поддерживает форматы BMP, JPG, PNG, TGA, DDS. Рекомендуется использовать текстуры со стороной, равной 128, 256, 512 и прочим степеням двойки. Текстура не обязательно должна быть квадратной.

Вы можете создать материал без текстуры, просто оставив строку имени файла пустой:

MaterialCreate('mColor', '');

В этом случае можно задать цвет материала. Проще всего это сделать функцией

MaterialSetDiffuseColor('mColor', c_red, 1);

Цвет вы можете передать встроенными константами GML (с_red, c_yellow, c_green и др.), функциями make_color_rgb(r, g, b) или make_color_hsv(h, s, v) для цветовых моделей RGB и HSV, соответственно, а также в обратном шестнадцатиричном формате, например, $0000FF означает красный.

Кроме цвета, функция MaterialSetDiffuseColor задает значение прозрачности — альфа — лежащее в промежутке от 0 до 1. Альфа в нашем случае равно 1 (полная непрозрачность).

Строго говоря, MaterialSetDiffuseColor задает только один из компонентов цвета материала, а всего их четыре - Ambient, Diffuse, Specular и Emission. Такое разделение связано с тем, что участки поверхности с различным уровнем освещенности могут иметь разный цвет. Ambient задает общий оттенок материала, не зависящий от освещения (цвет теневой стороны), Diffuse - цвет освещенной стороны, Specular - цвет блика, Emission — цвет имитации самосвечения. Более того, сами источники освещения также имеют собственные компоненты Ambient, Diffuse и Specular, и это делает цвет объектов еще более сложным и многообразным.

Вы можете отключить для материала освещение (и, заодно, влияние тумана, о котором пойдет речь чуть позже):

MaterialSetOptions('mColor', 1, 0);

Первый параметр, в данном случае равный 1, отвечает за влияние тумана, второй - за влияние освещения.

Применить созданный материал к объекту очень просто:

ObjectSetMaterial(object, 'mTexture');

Кстати, вернемся к материалу с текстурой. С этой текстурой можно творить удивительные вещи! Например, изменение режима проецирования на сферический сделает материал похожим на отражение на металле:

MaterialSetTextureMappingMode('mTexture', tmmSphere);

А чтобы многократно повторить текстуру на поверхности объекта, меняется ее масштаб:

MaterialSetTextureScale('mTexture', 10, 10);

При этом текстура повторится десять раз.

В качестве самостоятельной работы попробуйте создать и наложить материалы на планеты из предыдущего урока про иерархию. В качестве текстур можно использовать реальные карты поверхности Земли и Луны. А Солнце можно оставить без текстуры и сделать просто желтым. Вспомните также, как создается источник освещения и сделайте его дочерним для Солнца, чтобы оно излучало свет (в этом случае стоит отключить освещение для его материала).