Материалы: Basic, Lambert, Phong, Standard

Один и тот же объект с разным материалом выглядит совершенно по-разному. Разбираем четыре главных материала.

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

Четыре рабочих лошадки

МатериалРеагирует на свет?Когда брать
MeshBasicMaterialнетотладка, плоские элементы, «нарисованные» объекты
MeshLambertMaterialда, дёшевоматовые поверхности, когда важна скорость
MeshPhongMaterialда, с бликамиглянец, пластик (старый подход)
MeshStandardMaterialда, физическиреализм — современный выбор по умолчанию

Basic — без света

MeshBasicMaterial вообще не учитывает освещение: он показывает заданный цвет одинаково ярко со всех сторон. Объект выглядит плоско, как наклейка. Зато его видно всегда — удобно, когда вы только проверяете, что меш на месте.

const mat = new THREE.MeshBasicMaterial({ color: 0x3399ff });

Standard — физически корректный (PBR)

Современный реализм даёт MeshStandardMaterial. Он построен на PBR (Physically Based Rendering — физически корректный рендеринг) и описывает поверхность двумя интуитивными параметрами:

  • roughness (шероховатость) — от 0 (зеркало) до 1 (матовый мел);
  • metalness (металличность) — от 0 (диэлектрик: дерево, пластик) до 1 (металл).
const metal = new THREE.MeshStandardMaterial({
  color: 0xaaaaaa,
  roughness: 0.2,
  metalness: 0.9
});

Комбинируя эти два числа, вы получаете от матового пластика до полированного хрома — и всё это реалистично реагирует на источники света.

Какой выбрать

Практическое правило: по умолчанию берите Standard — он выглядит современно и правдоподобно. Basic — когда свет не нужен (отладка, плоские иконки). Lambert/Phong — когда важна максимальная скорость на слабых устройствах и можно пожертвовать реализмом. Но помните: Standard, Lambert и Phong требуют, чтобы на сцене был свет, — иначе объект будет чёрным. Об этом отдельный урок.

Общие свойства материалов

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

  • transparent: true + opacity — полупрозрачность (стекло, вода, дымка).
  • wireframe: true — показать только рёбра-каркас; незаменимо для отладки геометрии.
  • side — какие грани рисовать: только лицевые (по умолчанию), только обратные или обе (THREE.DoubleSide). Полезно для тонких плоскостей вроде листа бумаги, которые иначе исчезают, если смотреть «с изнанки».
  • flatShading: true — гранёный, «низкополигональный» вид вместо сглаженного.

Ещё одна важная мысль: материал в Three.js занимает ресурсы видеокарты. Когда объект больше не нужен, материал и геометрию полагается явно освобождать методом .dispose() — иначе в долгоживущем приложении видеопамять будет утекать. В небольших демках об этом можно не думать, но в реальном продукте — обязательно.

Итог

  • Basic не реагирует на свет, остальные — реагируют.
  • Standard — PBR, реалистичный, выбор по умолчанию; настраивается roughness и metalness.
  • Материалам, кроме Basic, нужен свет на сцене.
Проверьте себя
1. Какой материал НЕ реагирует на свет и выглядит одинаково ярко при любом освещении?
AMeshStandardMaterial
BMeshPhongMaterial
CMeshBasicMaterial
DMeshLambertMaterial
2. Что означает PBR, который использует MeshStandardMaterial?
APixel-Based Rendering
BPhysically Based Rendering — физически корректное освещение через roughness и metalness
CPublic Browser Rendering
DPolygon Buffer Resolution
3. Для чего хорош MeshStandardMaterial по сравнению с Basic и Phong?
AОн быстрее всех
BОн даёт реалистичный, физически правдоподобный вид — современный выбор по умолчанию
CОн не требует геометрии
DОн работает без рендерера
Поддержать проект