Карты нормалей, металличности, шероховатости, AO

В разработке 3D-графики для веб-приложений карты текстур играют важнейшую роль в создании визуальных эффектов и реалистичности объектов. Babylon.js, одна из ведущих библиотек для работы с 3D-графикой в браузере, поддерживает использование карт нормалей, металличности, шероховатости и карт окруженющего освещения (AO). Эти карты позволяют моделировать сложные эффекты освещения, создавая более глубокие и детализированные сцены.

Карта нормалей (Normal Map)

Карта нормалей — это текстура, которая изменяет направление нормалей поверхностей, не изменяя их геометрии. Это позволяет создавать иллюзию более сложных объектов, добавляя мелкие детали, такие как складки, бороздки, шероховатости и другие элементы, которые могут повлиять на освещение, но не требуют создания дополнительных полигонов.

Карта нормалей состоит из пикселей, каждый из которых представляет собой вектор в 3D-пространстве, который указывает направление нормали. Обычно карта нормалей хранится в формате RGB, где:

  • Красный канал (R) указывает на направление по оси X.
  • Зеленый канал (G) — на направление по оси Y.
  • Синий канал (B) — на направление по оси Z.

Для применения карты нормалей в Babylon.js используется свойство normalTexture материала:

const material = new BABYLON.StandardMaterial("material", scene);
material.diffuseTexture = new BABYLON.Texture("path_to_diffuse_texture", scene);
material.normalTexture = new BABYLON.Texture("path_to_normal_map", scene);

При этом важно учитывать, что Babylon.js поддерживает карты нормалей в различных форматах, включая OpenGL и DirectX, и при необходимости можно использовать флаг invertY для правильной настройки.

Карта металличности (Metallic Map)

Карта металличности используется для определения того, какие части поверхности являются металлическими. В отличие от обычных материалов, металлические поверхности отражают свет по-другому, что влияет на поведение освещения. На металлических участках света отражаются более ярко, в то время как неметаллические области поглощают свет.

В Babylon.js карта металличности работает в связке с картой шероховатости (или картой гладкости). Обычно для этих карт используется формат серого изображения, где:

  • Белый цвет (значение 1) обозначает полностью металлическую поверхность.
  • Черный цвет (значение 0) — неметаллическую.

Для использования карты металличности в Babylon.js нужно задать её через свойство metallicTexture материала:

const material = new BABYLON.PBRMetallicRoughnessMaterial("material", scene);
material.baseTexture = new BABYLON.Texture("path_to_base_texture", scene);
material.metallicTexture = new BABYLON.Texture("path_to_metallic_map", scene);

Особенностью карты металличности является то, что её можно комбинировать с картой шероховатости или гладкости, что позволяет более точно контролировать отражения.

Карта шероховатости (Roughness Map)

Карта шероховатости контролирует, насколько поверхность будет «шершавой» или «гладкой». Она влияет на то, как рассеивается свет на поверхности объекта. Чем выше значение шероховатости, тем менее зеркальным будет отражение. Это особенно важно для создания материалов, таких как камень или дерево, где отражения минимальны, в отличие от стекла или воды, где отражения могут быть яркими и четкими.

Шероховатость чаще всего используется в сочетании с металличностью, и в Babylon.js она применяется через свойство roughnessTexture:

const material = new BABYLON.PBRMetallicRoughnessMaterial("material", scene);
material.baseTexture = new BABYLON.Texture("path_to_base_texture", scene);
material.roughnessTexture = new BABYLON.Texture("path_to_roughness_map", scene);

На карте шероховатости также используется оттенок серого, где:

  • Белый цвет (значение 1) означает максимальную шероховатость (поверхность полностью рассеивает свет).
  • Черный цвет (значение 0) — поверхность максимально гладкая, отражения более четкие.

Карта окруженющего освещения (Ambient Occlusion Map, AO)

Карта AO используется для моделирования эффекта затенения, создаваемого объектами и их частями, которые менее подвержены освещению. Это создаёт эффект тени в углублениях и на стыках, где поверхности встречаются друг с другом. AO помогает улучшить восприятие формы объекта и добавляет глубину сценам.

В Babylon.js можно использовать карту окруженющего освещения для улучшения визуальных эффектов:

const material = new BABYLON.StandardMaterial("material", scene);
material.diffuseTexture = new BABYLON.Texture("path_to_diffuse_texture", scene);
material.ambientTexture = new BABYLON.Texture("path_to_ao_map", scene);

Такую карту можно также комбинировать с другими картами для достижения более естественного и сложного освещения на объекте.

Совмещение карт для достижения реалистичности

Основное преимущество использования карт нормалей, металличности, шероховатости и AO заключается в том, что они позволяют значительно повысить реализм сцен без необходимости увеличивать количество полигонов. Это особенно важно для веб-разработки, где важно сохранять баланс между качеством изображения и производительностью.

Для эффективного совмещения карт важно учитывать несколько моментов:

  • Карты металличности и шероховатости часто идут в одной текстуре с использованием канала для металличности и другого для шероховатости. Это позволяет экономить память и ускорить рендеринг.
  • Карта нормалей всегда работает в контексте освещения и должна быть тщательно настроена для каждого объекта.
  • Карта AO должна быть использована в местах, где нужно подчеркнуть форму объекта, улучшая восприятие освещения и глубины.

Пример использования карт в Babylon.js

Пример создания материала с несколькими картами:

const material = new BABYLON.PBRMetallicRoughnessMaterial("pbrMaterial", scene);
material.baseTexture = new BABYLON.Texture("path_to_base_texture", scene);
material.metallicTexture = new BABYLON.Texture("path_to_metallic_map", scene);
material.roughnessTexture = new BABYLON.Texture("path_to_roughness_map", scene);
material.normalTexture = new BABYLON.Texture("path_to_normal_map", scene);
material.ambientTexture = new BABYLON.Texture("path_to_ao_map", scene);

Этот пример показывает, как можно создать сложный PBR-материал с множеством карт, что позволяет добиться высокого уровня детализации и реалистичности при визуализации в Babylon.js.