Материалы 3D: назначение, цвет и прозрачность
Выбрать правильный слот материала, отделить поверхность от освещения и избежать общих правок ресурсов.
Сначала проверить назначение
StandardMaterial3D описывает поверхность: базовый цвет, шероховатость, металличность, текстуры и прозрачность. Освещаемый материал не задаёт окончательный цвет пикселя: на него влияют свет, отражения и Environment.
У одного MeshInstance3D несколько мест назначения материала. При неожиданном цвете сначала выясните, какое из них активно.
| Назначение | Область действия | Приоритет |
|---|---|---|
| Материал поверхности ресурса Mesh | Все экземпляры, разделяющие этот меш | Базовый |
| SetSurfaceOverrideMaterial(surface, material) | Одна поверхность одного экземпляра | Выше материала Mesh |
| MaterialOverride | Все поверхности экземпляра | Выше surface override |
| MaterialOverlay | Дополнительный проход поверх основного | Не заменяет основной материал |
GetActiveMaterial(0) возвращает выбранный основной материал первой поверхности, без MaterialOverlay. Для снятия override назначьте null. Индекс поверхности — не ID Entity и не номер блока GridMap.
В нативной проверке красный материал Mesh сменился синим surface override, затем зелёным MaterialOverride. Прозрачный синий overlay добавился поверх зелёного, но GetActiveMaterial продолжил возвращать зелёный. Проверка overlay относится к прозрачному Alpha-материалу.
Запустить освещаемую поверхность
Используйте LightingMaterials.cs ниже и LightingLab3D.cs из руководства освещения. Нужны C# SDK 1.0.0, net10.0 и уровень .rscene с Entity3D-корнем. Выполните dotnet build и назначьте LightingLab3D.cs корню. Появятся белый куб, синий шар и пол под направленным светом.
LightingMaterials.cs
using Reckfell;
public static class LightingMaterials
{
public static StandardMaterial3D Surface(Color color, float roughness = 0.65f, float metallic = 0) => new()
{
AlbedoColor = color,
Roughness = roughness,
Metallic = metallic
};
public static StandardMaterial3D Unshaded(Color color) => new()
{
AlbedoColor = color,
ShadingMode = BaseMaterial3D.ShadingModeEnum.Unshaded
};
public static Reckfell.Environment Environment() => new()
{
BackgroundMode = Reckfell.Environment.BGMode.Color,
BackgroundColor = new Color(0.025f, 0.03f, 0.045f),
AmbientLightSource = Reckfell.Environment.AmbientSource.Color,
AmbientLightColor = Colors.White,
AmbientLightEnergy = 0.12f,
AmbientLightSkyContribution = 0,
ReflectedLightSource = Reckfell.Environment.ReflectionSource.Disabled,
TonemapMode = Reckfell.Environment.ToneMapper.Linear
};
}Surface создаёт обычный освещаемый материал; Unshaded — материал без обычной реакции на источники света. Для диагностики чёрного объекта временный Unshaded помогает отделить проблему освещения от отсутствующего меша/неверного назначения. Он не отключает все эффекты окружения и не делает материал физически излучающим свет.
Настроить основные свойства
| Свойство | Значение и смысл |
|---|---|
| AlbedoColor | Базовый цвет; при текстуре умножается на её цвет |
| Roughness | Обычно 0..1: от узкого блика к более рассеянному |
| Metallic | Обычно 0 для неметалла, 1 для металла; влияет на отражённый свет |
| NormalEnabled и NormalTexture | Рельеф освещения без изменения силуэта или коллизии |
| EmissionEnabled, Emission, EmissionEnergyMultiplier | Собственная яркость; не самостоятельный источник прямого света |
В примере шероховатость куба 0.65, а у синего шара 0.2 и Metallic=0.8. Отражение неба намеренно выключено, поэтому это пример прямого освещения, а не полный PBR-стенд с отражениями. Тёмный металл без окружения не исправляется одним повышением albedo.
У текстур данных и цветных текстур разное назначение. Albedo несёт цвет; normal, roughness и metallic — данные поверхности. Проверьте режим импорта и каналы, а не подбирайте случайную гамму. Для normal map нужны корректные нормали/касательные меша; она не создаёт настоящие выступы.
ORMMaterial3D использует упакованную текстуру: R — occlusion, G — roughness, B — metallic. Это подтверждено генератором шейдера; практический импорт ORM, каналов normal map и UV в этом примере не проверяется. Неверная упаковка меняет свойства всей поверхности.
Включить нужную прозрачность
Одного AlbedoColor.A=0 недостаточно. При Transparency=Disabled поверхность остаётся непрозрачной — это проверено в кадре.
- Alpha смешивает альфа-канал с фоном. Подходит для полупрозрачности; учитывайте сортировку пересекающихся прозрачных поверхностей.
- AlphaScissor делает вырез по AlphaScissorThreshold. При пороге 0.5 альфа 0.2 исчезла, а 0.8 осталась. Это удобно для жёсткого контура, а не мягкого стекла.
- Другие режимы, включая AlphaHash и AlphaDepthPrePass, решают отдельные задачи качества/глубины; проверяйте их в целевом renderer. Они не входят в текущий исполняемый пример.
Отключение culling ради двусторонней видимости не исправляет перепутанные нормали и не превращает плоскость в объёмное стекло.
Не изменить все экземпляры случайно
Материал — ресурс. Если два экземпляра используют один Mesh с одним материалом, изменение AlbedoColor этого материала затронет оба. MaterialOverride со ссылкой на тот же ресурс тоже не создаёт копию.
Для независимой правки продублируйте материал через Duplicate(), приведите к нужному типу и назначьте копию экземпляру. Нативная проверка подтвердила независимость цвета такой копии. Это не обещает глубокой независимости всех вложенных текстур и ресурсов: их владение проверяйте отдельно.
Диагностика
| Проблема | Первый шаг |
|---|---|
| Материал Mesh меняется, объект нет | Проверить MaterialOverride и surface override через GetActiveMaterial |
| Объект чёрный | Активная камера, свет/ambient, визуальные слои; затем временный Unshaded |
| Изменились все копии объекта | Проверить общий ресурс материала и назначить отдельную копию |
| A=0 ничего не скрывает | Выбрать Transparency вместо Disabled |
| Свечение не освещает пол | Добавить Light3D; glow — отдельный экранный эффект |
| Рельеф не меняет силуэт | Normal map влияет на освещение, а не геометрию |