Система материалов (Material Properties) в Deck.gl используется для управления взаимодействием объектов сцены с источниками освещения. Материал определяет, насколько поверхность отражает свет, насколько выражены блики, как распределяется освещение по поверхности и насколько реалистично выглядит трёхмерный объект.
Параметры материала применяются преимущественно в слоях, поддерживающих освещение и трёхмерную геометрию:
ColumnLayerPolygonLayer с экструдированными полигонамиGeoJsonLayer с параметром extrudedSolidPolygonLayerScenegraphLayerБез настройки материала объекты используют стандартные значения, однако для создания качественной визуализации городов, рельефа, инженерных моделей и аналитических карт часто требуется более точный контроль над поведением света.
Материал задаётся через свойство material.
Пример:
import {ColumnLayer} from '@deck.gl/layers';
const layer = new ColumnLayer({
id: 'columns',
data,
extruded: true,
material: {
ambient: 0.35,
diffuse: 0.6,
shininess: 32,
specularColor: [255, 255, 255]
}
});
Объект material содержит набор физических параметров,
влияющих на расчёт освещения в шейдерах.
Перед изучением параметров материала необходимо понимать основные компоненты освещения.
В модели освещения Deck.gl используются несколько составляющих:
Фоновое освещение сцены.
Такой свет присутствует повсеместно и не зависит от направления.
Пример:
new AmbientLight({
color: [255, 255, 255],
intensity: 1.0
});
Направленный источник света.
Имитирует солнечный свет.
new DirectionalLight({
color: [255, 255, 255],
intensity: 1.0,
direction: [-1, -3, -1]
});
Точечный источник.
Свет распространяется из конкретной точки пространства.
new PointLight({
color: [255, 255, 255],
intensity: 2,
position: [-122.4, 37.8, 1000]
});
Материал определяет, как поверхность реагирует на каждый из этих источников.
Параметр ambient управляет интенсивностью фонового
освещения, воспринимаемого поверхностью.
material: {
ambient: 0.5
}
ambient: 0.1
Особенности:
ambient: 0.3
Особенности:
ambient: 1.0
Особенности:
Для городской застройки:
material: {
ambient: 0.25
}
Здания приобретают выраженный объём.
Для тематических карт:
material: {
ambient: 0.7
}
Все объекты становятся хорошо различимыми независимо от положения источника света.
Параметр diffuse отвечает за диффузное отражение
света.
Диффузное отражение моделирует рассеивание света шероховатой поверхностью.
material: {
diffuse: 0.6
}
Когда луч света попадает на поверхность:
Именно за этот эффект отвечает коэффициент diffuse.
diffuse: 0.1
Результат:
diffuse: 0.6
Результат:
diffuse: 1.0
Результат:
Слабое диффузное освещение:
material: {
ambient: 0.4,
diffuse: 0.2
}
Ярко освещённый объект:
material: {
ambient: 0.4,
diffuse: 1.0
}
Параметр shininess управляет размером и концентрацией
зеркального блика.
material: {
shininess: 32
}
Чем больше значение, тем меньше и ярче блик.
Зеркальное отражение возникает при совпадении:
Алгоритм вычисляет интенсивность блика и использует значение
shininess как показатель концентрации отражённого
света.
shininess: 4
Особенности:
Подходит для:
shininess: 32
Особенности:
Подходит для:
shininess: 128
Особенности:
Подходит для:
Матовый материал:
material: {
shininess: 8
}
Глянцевый материал:
material: {
shininess: 128
}
Параметр specularColor определяет цвет зеркального
отражения.
Формат:
specularColor: [r, g, b]
Пример:
material: {
specularColor: [255, 255, 255]
}
Наиболее распространённый вариант.
specularColor: [255, 255, 255]
Используется для:
Красный:
specularColor: [255, 0, 0]
Синий:
specularColor: [0, 0, 255]
Золотистый:
specularColor: [255, 220, 100]
Цветные блики позволяют имитировать отражающие свойства различных материалов.
Золото:
material: {
shininess: 128,
specularColor: [255, 215, 0]
}
Медь:
material: {
shininess: 96,
specularColor: [184, 115, 51]
}
Сталь:
material: {
shininess: 128,
specularColor: [220, 220, 220]
}
Если объект создаётся без свойства material,
используется встроенный набор параметров:
material: {
ambient: 0.35,
diffuse: 0.6,
shininess: 32,
specularColor: [30, 30, 30]
}
Эти значения обеспечивают сбалансированное освещение для большинства сценариев.
material: {
ambient: 0.25,
diffuse: 0.8,
shininess: 16,
specularColor: [80, 80, 80]
}
Особенности:
material: {
ambient: 0.5,
diffuse: 0.5,
shininess: 8,
specularColor: [20, 20, 20]
}
Особенности:
material: {
ambient: 0.2,
diffuse: 0.7,
shininess: 128,
specularColor: [255, 255, 255]
}
Особенности:
material: {
ambient: 0.35,
diffuse: 0.9,
shininess: 4,
specularColor: [40, 40, 40]
}
Особенности:
Наиболее полный контроль достигается при совместном использовании материала и пользовательской системы освещения.
import {
AmbientLight,
DirectionalLight,
LightingEffect
} from '@deck.gl/core';
const ambientLight = new AmbientLight({
color: [255, 255, 255],
intensity: 1.0
});
const directionalLight = new DirectionalLight({
color: [255, 255, 255],
intensity: 2.0,
direction: [-1, -3, -2]
});
const lightingEffect = new LightingEffect({
ambientLight,
directionalLight
});
Далее эффект подключается к экземпляру Deck:
const deckgl = new Deck({
effects: [lightingEffect],
layers: [layer]
});
Материал каждого слоя начинает взаимодействовать с настроенной схемой освещения.
Система материалов реализована на уровне GPU через GLSL-шейдеры и оказывает минимальное влияние на производительность современных видеокарт.
Наиболее затратными факторами являются:
Параметры материала сами по себе практически не становятся узким местом производительности.
material: {
ambient: 0.5,
diffuse: 0.5,
shininess: 8
}
Приоритет отдаётся данным, а не визуальным эффектам.
material: {
ambient: 0.25,
diffuse: 0.8,
shininess: 16
}
Подчёркивается объём зданий и структура городской среды.
material: {
ambient: 0.2,
diffuse: 0.7,
shininess: 64,
specularColor: [255, 255, 255]
}
Достигается более выразительное взаимодействие объектов со светом.
material: {
ambient: 0.15,
diffuse: 0.75,
shininess: 128,
specularColor: [220, 220, 220]
}
Формируются концентрированные отражения, характерные для отполированных материалов.
Все параметры работают совместно:
| Параметр | Отвечает за |
|---|---|
ambient |
Фоновое освещение |
diffuse |
Рассеянное отражение |
shininess |
Размер и резкость блика |
specularColor |
Цвет зеркального отражения |
Даже небольшое изменение одного коэффициента может существенно изменить визуальное восприятие сцены. Наиболее реалистичные результаты обычно достигаются не экстремальными значениями отдельных параметров, а сбалансированным сочетанием всех характеристик материала и корректно настроенной системой освещения.