Материалы

Материалы описывают реакцию поверхности объекта на освещение, а также содержат информацию о ее прозрачности, отражающей способности, физических и других параметрах.

Меши могут использовать один или несколько материалов. В случае использования нескольких материалов назначение их различным полигонам происходит в режиме редактирования Edit Mode. Для этого нужно выделить нужные полигоны, выбрать материал из списка и нажать кнопку Assign.

Поддерживаются следующие типы материалов: Surface (поверхность), Halo (гало).

Параметры освещения

_images/panel_shading.png
Diffuse > Color

Цвет диффузного (рассеянного) света. Значение по умолчанию (0.8, 0.8, 0.8). Может взаимодействовать с цветом диффузной текстуры.

Diffuse > Intensity

Интенсивность диффузного (рассеянного) света. Значение по умолчанию 0.8.

Diffuse > Shader

Алгоритм расчета диффузного (рассеянного) освещения. Значение по умолчанию Lambert.

Specular > Color

Цвет отраженного света. Значение по умолчанию (1.0, 1.0, 1.0). Может взаимодействовать с цветом карты бликов.

Specular > Intensity

Интенсивность отраженного света. Значение по умолчанию 0.5.

Specular > Hardness

Степенной показатель в формуле расчета отраженного света (“жесткость” блика). Значение по умолчанию 50. Алгоритм применения в движке отличается от алгоритма применения в Blender’e.

Specular > Shader

Алгоритм расчета отраженного освещения. Значение по умолчанию CookTorr.

Shading > Emit

Интенсивность эмиссии (излучения). Значение по умолчанию 0.0.

Shading > Ambient

Фактор влияния освещения от окружающей среды на материал. Значение по умолчанию 1.0.

Shading > Shadeless

При включении материал не реагирует на освещение. По умолчанию выключено.

Shading > Tangent Shading

При включении этого параметра движок использует тангенциальный вектор материала (вместо нормального вектора) для расчёта итогового цвета объекта. Может применяться для имитации анизотропных поверхностей.

_images/materials_tangent_shading_comparison.png

Слева: стандартное затенение, справа: тангенциальное затенение.

Shading > Double-Sided Lighting

Включить двухстороннее освещение. Опция полезна для однослойных непросвечивающих объектов.

Прозрачность

_images/panel_transparency.png

Типы

Тип реализации прозрачности выбирается в меню Transparency на панели Properties > Material.

_images/alpha_types.png

Движком поддерживаются все типы прозрачности, доступные в Blender.

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

Alpha Sort

Прозрачный с градиентом. Для корректного отображения перекрывания одних прозрачных поверхностей другими движком производится сортировка треугольников по дальности от камеры. Операция требует дополнительных затрат вычислительных ресурсов. Рекомендуется применять для замкнутых прозрачных объектов (бутылка, стекла автомобиля и т.д.).

Alpha Anti-Aliasing

Прозрачный с градиентом. Этот тип реализован при помощи технологии Alpha to coverage и доступен только при включённом MSAA (только на устройствах с поддержкой WebGL2). Сортировка треугольников не производится. Эту технику рекомендуется использовать совместно с текстурой-маской для изображения мелких деталей, таких, как трава или листья.

Alpha Blend

Прозрачный с градиентом. Сортировка треугольников не производится. Рекомендуется применять для незамкнутых прозрачных объектов (поверхность воды, декали).

Add

Прозрачный c градиентом. Сортировка треугольников не производится. Движок отключает запись в буфер глубины, что приводит к произвольному порядку отображения прозрачных поверхностей. Рекомендуется применять для создания эффектов (системы частиц, светящиеся лучи).

Alpha Clip

Прозрачный без градиента. Движок отбрасывает пикселы (discard) с прозрачностью менее 0.5. Сортировка треугольников не производится. Рекомендуется применять с текстурой в качестве маски для визуализации множества мелких деталей (листва деревьев, трава).

Opaque

Непрозрачный. Альфа-канал игнорируется. Значение по умолчанию.

Дополнительные настройки

Transparency > Show Transparency

Опция включения прозрачности требуется для отображения прозрачных объектов в Blender’e. Движок игнорирует эту опцию, используя вместо нее Alpha Blend.

Transparency > Alpha

Уровень прозрачности материала. При наличии диффузной текстуры движок (в отличие от Blender’a) игнорирует этот параметр, используя вместо него значение прозрачности текстуры.

Transparency > Z Offset

Используется для явного указания расположения прозрачных объектов с разными материалами относительно друг друга с целью сортировки по глубине. Может принимать отрицательные и положительные значения. Для корректного отображения дальние объекты должны иметь меньшее значение параметра, чем ближние. Значение по умолчанию 0.0.

Зеркальное отражение

_images/panel_mirror.png

Настройки отражений во вкладке Material

Статическое отражение

Поверхность отражает одно и то же изображение вне зависимости от изменения окружающей среды. Для активации достаточно использовать карту зеркального отражения.

Динамическое отражение

Поверхность отражает текущее расположение определенных объектов. Поддерживаются отражения от плоскости и сферические отражения.

Примечание

При использовании нодовых материалов динамические отражения будут работать только в том случае, если в нодовом дереве присутствует нода Material или Extended Material.

Активация

  1. Проверить опцию Reflections на панели Render > Reflections and Refractions.

  2. Для отражающих объектов на панели Object > Reflections выставить опцию Reflective.

    • Для плоских отражений выставить значение Object > Reflections > Type в Plane. Добавить пустой объект для задания плоскости отражения Add > Empty > Single Arrow. Переименовать для удобства и указать его имя в поле Reflection plane отражающего объекта.

    • Для кубических отражений выставить значение Object > Reflections > Type в Cube.

  3. Для нужных материалов отражающих объектов выставить значение отражающей способности Material > Mirror > Reflectivity.

    • Mirror > Reflectivity > Show Reflectivity требуется для отображения отражений на объектах в Blender’e. Движок игнорирует эту опцию.

  4. Для отражаемых объектов на панели Object > Reflections выставить опцию Reflexible.

Примечание

Рекомендуется также включить использование освещения от окружающей среды World > Environment Lighting.

Ограничения

В отраженном изображении игнорируется карта нормалей, тени.

Эффект Френеля для отражения

Эффект Френеля проявляется в зависимости интенсивностей проходящего и отраженного света от угла падения. Если угол падения близок к нулю (т.е. свет падает почти перпендикулярно поверхности), доля проходящего света велика, а отраженного мала. И наоборот, если угол падения близок к 90 градусам (т.е. свет падает почти параллельно поверхности), отражается почти весь свет.

Движок использует приближенную формулу Шлика:

R = R0 + (1 − R0)(1 - cos θ)N, где

R - коэффициент отражения,

R0 - коэффициент отражения в случае обзора под прямым углом к поверхности (т.е. при θ = 0),

θ - угол падения (равный углу отражения, под которым свет попадает в камеру), рассчитывается движком в реальном времени,

N - показатель степени.

Настройка

Эффект Френеля применяется как для статического, так и для динамического отражения.

Material > Mirror > Fresnel

Степень Френеля для отражения. Показатель степени N в формуле Шлика. В пакете Blender ограничен значениями от 0 до 5. Если этот параметр равен нулю, эффект Френеля не проявляется, происходит полное отражение на всех углах. Если этот параметр больше нуля, при обзоре поверхности под углами, близкими к прямому (почти перпендикулярно поверхности), материал становится менее отражающим. Чем больше этот параметр, тем больше отклонение угла от прямого, для которого наблюдается такой эффект.

Material > Mirror > Blend

Фактор Френеля для отражения. Приводится к R0 в формуле Шлика: R0 = 1 - Blend / 5. В пакете Blender ограничен значениями от 0 до 5. Этот параметр показывает интенсивность проявления эффекта Френеля: чем больше фактор Blend, тем сильнее влияние эффекта Френеля. Если он равен нулю, эффект Френеля не проявляется.

_images/reflection_dynamic_and_fresnel.png

Опции рендеринга

_images/panel_render_options.png
Material > Rendering Options > Do not Render

Отключить рендеринг объекта.

Material > Rendering Options > Backface Culling

При включении обратная сторона полигона не отображается движком. По умолчанию включено.

Material > Rendering Options > Wettable

Для материала активируется эффект смачивания водой.

См.также

Вода

Material > Rendering Options > Lens Flare

Включает эффект Lens Flare для материала.

Material > Rendering Options > Render Above All

Материал отрисовывается поверх всех объектов на сцене. Требует тип прозрачности c градиентом (Add, Alpha Blend или Alpha Sort)

Material > Rendering Options > Vertex Color Paint

Опция включает использование вертексного цвета меша вместо диффузного цвета.

Material > Rendering Options > Refractive

Включить рефракцию. Коэффициент возмущения задаётся опцией Refraction Bump на панели Refraction Settings. Значение по умолчанию 0.001.

Примечание

Для отображения эффекта необходимо выбрать опцию ON или AUTO на панели Render > Reflections and Refractions > Refractions. Объект должен быть с типом прозрачности Alpha Blend.

См.также

Прозрачность


Настройки вьюпорта

Раздел Viewport находится на панели Blend4Web.

_images/update_material_anim.png

Update Material Animation

Обновлять анимированный шейдер во вьюпорте Blender.


Специальные параметры движка

_images/panel_b4w.png

Material > Water

Специальный материал для рендеринга воды.

Material > Terrain Dynamic Grass

Материал используется для рендеринга травяного покрова.

Material > Collision

Специальный материал для физического объекта.

См.также

Физика

Material > Export Options > Do Not Export

Не экспортировать.

Материалы гало (Halo)

Используются в системах частиц и в статических мешах. Ниже рассматривается использование гало на статических мешах.

Активация

Выставить тип Halo во вкладке Materials. Рекомендуется также выставить тип прозрачности c градиентом (Add, Alpha Blend или Alpha Sort).

_images/halo.png

Дополнительные настройки

Halo > Alpha

Параметр прозрачности материала. Значение по умолчанию 1.0 (непрозрачный).

Halo > Color

Цвет материала. Значение по умолчанию (0.8, 0.8, 0.8) (почти белый).

Halo > Size

Размер частиц. Значение по умолчанию 0.5.

Halo > Hardness

Показатель степени при расчете градиента. Влияет на видимый размер частиц. Значение по умолчанию 50.

Halo > Rings

Использовать кольца. Настраивается относительное количество и цвет.

Halo > Lines

Использовать линии. Настраивается относительное количество и цвет.

Halo > Star Tips

Использовать звезды. Настраивается количество концов.

Halo > Special: Stars

Включает режим рендеринга звездного неба, при этом меш неподвижен относительно камеры. Для лампы типа Sun необходимо также выставить опцию Lamp > Dynamic Intensity. Приложения должны установить ночное время суток, используя API.

Halo > Blending Height

Диапазон высот, на котором происходит затухание яркости звезд.

Halo > Minimum Height

Минимальная высота в локальном пространстве объекта, на которой видны звезды.

Методы API для работы с материалами

Все методы API, используемые для настройки материалов, как стандартных, так и нодовых, находятся в модуле API material. Все методы этого модуля подробно описаны на странице документации API.

Примечание

Методы API могут работать только с материалами, которые используются с динамическими объектами.

Методы для стандартных материалов

Модуль API material включает методы для управления практически любым параметром стандартного материала.

Ниже приводится ряд примеров, демонстрирующих, как модуль API material может использоваться для различных операций с материалом объекта:

Получение диффузного цвета объекта:

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var cube = m_scenes.get_object_by_name("Cube");

var diffuse_color = m_material.get_diffuse_color(cube, "MyMaterial");
var diffuse_color_factor = m_material.get_diffuse_color_factor(cube, "MyMaterial");
var diffuse_intensity = m_material.get_diffuse_intensity(cube, "MyMaterial");

Получение цвета блика материала:

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var cube = m_scenes.get_object_by_name("Cube");

var specular_color = m_material.get_specular_color(cube, "MyMaterial");
var specular_color_factor = m_material.get_specular_color_factor(cube, "MyMaterial");
var specular_hardness = m_material.get_specular_hardness(cube, "MyMaterial");
var specular_intensity = m_material.get_specular_intensity(cube, "MyMaterial");

Получение других параметров:

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var cube = m_scenes.get_object_by_name("Cube");

var emit_factor = m_material.get_emit_factor(cube, "MyMaterial");
var alpha_factor = m_material.get_alpha_factor(cube, "MyMaterial");
var ambient_factor = m_material.get_ambient_factor(cube, "MyMaterial");

var extended_parameters = m_material.get_material_extended_params(cube, "MyMaterial");

Установка параметров материала:

var m_scenes    = require("scenes");
var m_material  = require("material");
var m_rgba      = require("rgba");

...

var cube = m_scenes.get_object_by_name("Cube");

m_material.set_diffuse_color(cube, "MyMaterial", m_rgba.from_values(1.0, 0.0, 0.0, 1.0));
m_material.set_diffuse_color_factor(cube, "MyMaterial", 0.05);
m_material.set_material_extended_params(cube, "MyMaterial", {fresnel: 0,
                                                             fresnel_factor: 1.25,
                                                             parallax_scale: 0,
                                                             parallax_steps: "5.0",
                                                             reflect_factor: 0});

Методы для нодовых материалов

На данный момент поддерживаются только ноды типа RGB и Value. Все прочие типы не поддерживаются.

Для того, чтобы изменить значение той или иной ноды материала, требуется:

  • объект, использующий данный материал,

  • имя материала,

  • имя самой ноды,

  • а также имя группы нод, в которую входит данная нода (если есть).

Имя ноды можно узнать (и изменить) в верхней части боковой панели справа от главного окна редактора нод.

Примечание

Следует иметь в виду, что главное окно редактора нод не показывает имён нод, только их типы.

_images/material_node_name.png

Два следующих примера демонстрируют, как параметры нодового материала могут быть настроены с использованием методов API:

Получение параметров нодового материала:

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var cube = m_scene.get_object_by_name("Cube");

var rgb_node_1 = m_material.get_nodemat_rgb(cube, ["MyMaterial", "MyRGB"]);
var rgb_node_2 = m_material.get_nodemat_rgb(cube, ["MyMaterial", "MyRGB_2"]);
var value_node = m_material.get_nodemat_value(cube, ["MyMaterial", "MyValue"]);

Установка параметров нодового материала:

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var cube = m_scene.get_object_by_name("Cube");

m_material.set_nodemat_value(cube, ["MyMaterial", "MyValue"], 0.8);
m_material.set_nodemat_rgb(cube, ["MyMaterial", "MyRGB"], 0.7, 0.9, 0.3);

Те же методы могут применяться для настройки окружения сцены, если объект World использует ноды RGB или Value. В этом случае не требуется использовать имя материала. Другое отличие в том, что ссылку на объект сцены следует заменить ссылкой на объект World; эту ссылку можно получить при помощи метода get_world_by_name():

var m_scenes    = require("scenes");
var m_material  = require("material");

...

var my_world = m_scene.get_world_by_name("World");

var world_rgb = m_material.get_nodemat_rgb(my_world, ["My_RGB_3"]);

Замена текстур

Использование методов API также позволяет заменять текстуры. Это делается при помощи метода change_image() из модуля textures:

var m_scenes  = require("scenes");
var m_tex = require("textures");

...

var my_cube = m_scenes.get_object_by_name("Cube");

m_tex.change_image(my_cube, "My_Texture", "./test.png");

Этот метод может применяться и для замены текстур, используемых объектом World. Однако в этом случае вместо имени текстуры следует использовать имя ноды Texture.

Наследование материалов

Blend4Web поддерживает динамическую смену материалов. Эта возможность очень полезна для т.н. приложений-конфигураторов, где пользователю предлагается настроить внешний вид какой-либо модели (одежда, мебель, автомобили и т.д.). В случае, если не хватает возможностей API по изменению стековых и нодовых материалов, описанных выше, а также метода change_texture и простой смены текстур, тогда можно воспользоваться наследованием.

Преимуществом наследования является простота и универсальность использования, что хорошо подходит, когда нужно довольно сильно изменить исходный материал. Также оно доступно как из внешнего API, так и в нодовой логике, и подходит одинаково как для нодовых, так и для стековых материалов. Недостатком может являться то, что операция наследования может быть хуже по производительности, чем другие вышеупомянутые методы, что может быть критически важным в ряде случаев.

Активация

В наследовании участвуют 2 объекта. Первый - источник, на котором находится наследуемый материал, второй - целевой объект, на котором требуется произвести замену материала. Оба этих объекта требуют выставления опции Dynamic Geometry & Materials на панели Object в разделе Rendering Properties.

Примечание

После наследования материал на целевом объекте будет выглядеть также как, если бы он был просто назначен на него в самом Blender, т.е. при необходимости на целевом объекте нужно заранее подготовить UV-слои и слои вертексного цвета под все материалы, которые будут на него наследоваться. Для объекта источника это уже необязательно.

При использовании нодовой логики наследование можно осуществить с помощью ноды Object->Inherit Material. В API же для этого существует метод inherit_material.

_images/material_container.png

Если в приложении требуется смена множества разных материалов, то хорошим подходом будет создание специального объекта-контейнера. Он может представлять собой простой объект типа Plane, на котором будут находится все нужные материалы. При необходимости его можно скрыть на самой сцене, выставив на нём настройку Hidden или Do Not Render на панели Object->Rendering Properties.