Глава 4.3: Материалы (.rvmat)
Главная | << Назад: 3D-модели | Материалы | Далее: Аудио >>
Введение
Материал в DayZ -- это мост между 3D-моделью и её визуальным представлением. В то время как текстуры предоставляют необработанные данные изображений, файл RVMAT (Real Virtuality Material) определяет, как эти текстуры комбинируются, какой шейдер их интерпретирует и какие свойства поверхности движок должен моделировать -- блеск, прозрачность, самосвечение и многое другое. Каждая грань каждой P3D-модели в игре ссылается на RVMAT-файл, и понимание того, как их создавать и настраивать, необходимо для любого визуального мода.
Эта глава охватывает формат файла RVMAT, типы шейдеров, настройку этапов текстур, свойства материалов, систему замены материалов по уровню повреждений и практические примеры из DayZ-Samples.
Содержание
- Обзор формата RVMAT
- Структура файла
- Типы шейдеров
- Этапы текстур
- Свойства материала
- Уровни здоровья (замена материалов при повреждении)
- Как материалы ссылаются на текстуры
- Создание RVMAT с нуля
- Реальные примеры
- Распространённые ошибки
- Лучшие практики
Обзор формата RVMAT
Файл RVMAT -- это текстовый конфигурационный файл (не бинарный), который определяет материал. Несмотря на пользовательское расширение, формат представляет собой обычный текст с синтаксисом Bohemia в стиле конфигурации с классами и парами ключ-значение.
Ключевые характеристики
- Текстовый формат: Редактируемый в любом текстовом редакторе (Notepad++, VS Code).
- Привязка шейдера: Каждый RVMAT указывает, какой шейдер рендеринга использовать.
- Назначение текстур: Определяет, какие файлы текстур назначены каким входам шейдера (диффузный, нормали, спекулярный и т.д.).
- Свойства поверхности: Управляет спекулярной интенсивностью, свечением, прозрачностью и прочим.
- Ссылается из P3D-моделей: Грани в LOD Resolution Object Builder назначаются RVMAT. Движок загружает RVMAT и все текстуры, на которые он ссылается.
- Ссылается из config.cpp:
hiddenSelectionsMaterials[]может переопределять материалы во время выполнения.
Соглашение о путях
RVMAT-файлы располагаются рядом со своими текстурами, обычно в директории data/:
MyMod/
data/
my_item.rvmat <-- Определение материала
my_item_co.paa <-- Диффузная текстура (ссылается из RVMAT)
my_item_nohq.paa <-- Карта нормалей (ссылается из RVMAT)
my_item_smdi.paa <-- Спекулярная карта (ссылается из RVMAT)Структура файла
RVMAT-файл имеет единообразную структуру. Вот полный аннотированный пример:
ambient[] = {1.0, 1.0, 1.0, 1.0}; // Множитель цвета рассеянного освещения (RGBA)
diffuse[] = {1.0, 1.0, 1.0, 1.0}; // Множитель цвета диффузного освещения (RGBA)
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0}; // Аддитивное переопределение диффузного
emmisive[] = {0.0, 0.0, 0.0, 0.0}; // Цвет свечения (самосвечение)
specular[] = {0.7, 0.7, 0.7, 1.0}; // Цвет спекулярного блика
specularPower = 80; // Резкость спекулярного (выше = более узкий блик)
PixelShaderID = "Super"; // Программа пиксельного шейдера
VertexShaderID = "Super"; // Программа вершинного шейдера
class Stage1 // Этап текстуры: карта нормалей
{
texture = "MyMod\data\my_item_nohq.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage2 // Этап текстуры: диффузная/цветовая карта
{
texture = "MyMod\data\my_item_co.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage3 // Этап текстуры: спекулярная/металлическая карта
{
texture = "MyMod\data\my_item_smdi.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};Свойства верхнего уровня
Они объявляются перед классами Stage и управляют общим поведением материала:
| Свойство | Тип | Описание |
|---|---|---|
ambient[] | float[4] | Множитель цвета рассеянного освещения. {1,1,1,1} = полный, {0,0,0,0} = без рассеянного. |
diffuse[] | float[4] | Множитель цвета диффузного освещения. Обычно {1,1,1,1}. |
forcedDiffuse[] | float[4] | Аддитивное переопределение диффузного. Обычно {0,0,0,0}. |
emmisive[] | float[4] | Цвет самосвечения. Ненулевые значения заставляют поверхность светиться. Примечание: Bohemia использует ошибочное написание emmisive, а не emissive. |
specular[] | float[4] | Цвет и интенсивность спекулярного блика. |
specularPower | float | Резкость спекулярных бликов. Диапазон 1-200. Выше = более узкое, сфокусированное отражение. |
PixelShaderID | string | Имя программы пиксельного шейдера. |
VertexShaderID | string | Имя программы вершинного шейдера. |
Типы шейдеров
Значения PixelShaderID и VertexShaderID определяют, какой конвейер рендеринга обрабатывает материал. Оба обычно должны быть установлены в одно значение.
Доступные шейдеры
| Шейдер | Применение | Требуемые этапы текстур |
|---|---|---|
| Super | Стандартные непрозрачные поверхности (оружие, одежда, предметы) | Нормали, Диффузный, Спекулярный/Металлический |
| Multi | Многослойный рельеф и сложные поверхности | Несколько пар диффузных/нормалей |
| Glass | Прозрачные и полупрозрачные поверхности | Диффузный с альфа |
| Water | Водные поверхности с отражением и преломлением | Специальные водные текстуры |
| Terrain | Поверхности рельефа | Спутник, маска, слои материалов |
| NormalMap | Упрощённая поверхность с картой нормалей | Нормали, Диффузный |
| NormalMapSpecular | С картой нормалей и спекулярным | Нормали, Диффузный, Спекулярный |
| Hair | Рендеринг волос персонажа | Диффузный с альфа, специальная просвечиваемость |
| Skin | Кожа персонажа с подповерхностным рассеянием | Диффузный, Нормали, Спекулярный |
| AlphaTest | Жёсткая прозрачность (листва, заборы) | Диффузный с альфа |
| AlphaBlend | Плавная прозрачность (стекло, дым) | Диффузный с альфа |
Шейдер Super (самый распространённый)
Шейдер Super -- это стандартный шейдер физически корректного рендеринга, используемый для подавляющего большинства предметов в DayZ. Он ожидает три этапа текстур:
Stage1 = Карта нормалей (_nohq)
Stage2 = Диффузная/Цветовая карта (_co)
Stage3 = Спекулярная/Металлическая карта (_smdi)Если вы создаёте предмет для мода (оружие, одежда, инструмент, контейнер), вы почти всегда будете использовать шейдер Super.
Шейдер Glass
Шейдер Glass обрабатывает прозрачные поверхности. Он считывает альфа из диффузной текстуры для определения прозрачности:
PixelShaderID = "Glass";
VertexShaderID = "Glass";
class Stage1
{
texture = "MyMod\data\glass_nohq.paa";
uvSource = "tex";
class uvTransform { /* ... */ };
};
class Stage2
{
texture = "MyMod\data\glass_ca.paa"; // Примечание: суффикс _ca для цвет+альфа
uvSource = "tex";
class uvTransform { /* ... */ };
};Этапы текстур
Каждый класс Stage в RVMAT назначает текстуру определённому входу шейдера. Номер этапа определяет, какую роль играет текстура.
Назначения этапов для шейдера Super
| Этап | Роль текстуры | Типичный суффикс | Описание |
|---|---|---|---|
| Stage1 | Карта нормалей | _nohq | Детали поверхности, выпуклости, бороздки |
| Stage2 | Диффузная / Цветовая карта | _co или _ca | Базовый цвет поверхности |
| Stage3 | Спекулярная / Металлическая карта | _smdi | Блеск, металлические свойства, детали |
| Stage4 | Рассеянная тень | _as | Предзапечённое рассеянное затенение (опционально) |
| Stage5 | Макро-карта | _mc | Крупномасштабная цветовая вариация (опционально) |
| Stage6 | Детальная карта | _de | Тайлящаяся микродетализация (опционально) |
| Stage7 | Карта свечения | _li | Самосвечение (опционально) |
Свойства этапа
Каждый этап содержит:
class Stage1
{
texture = "path\to\texture.paa"; // Путь относительно диска P:
uvSource = "tex"; // Источник UV: "tex" (UV модели) или "tex1" (2-й набор UV)
class uvTransform // Матрица трансформации UV
{
aside[] = {1.0, 0.0, 0.0}; // Масштаб и направление оси U
up[] = {0.0, 1.0, 0.0}; // Масштаб и направление оси V
dir[] = {0.0, 0.0, 0.0}; // Обычно не используется
pos[] = {0.0, 0.0, 0.0}; // Смещение UV (трансляция)
};
};UV-трансформация для тайлинга
Чтобы тайлить текстуру (повторять по поверхности), измените значения aside и up:
class uvTransform
{
aside[] = {4.0, 0.0, 0.0}; // Тайл 4x по горизонтали
up[] = {0.0, 4.0, 0.0}; // Тайл 4x по вертикали
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};Это обычно используется для материалов рельефа и поверхностей зданий, где одна детальная текстура повторяется.
Свойства материала
Управление спекулярным
Значения specular[] и specularPower работают вместе для определения блеска поверхности:
| Тип материала | specular[] | specularPower | Внешний вид |
|---|---|---|---|
| Матовый пластик | {0.1, 0.1, 0.1, 1.0} | 10 | Тусклый, широкий блик |
| Потёртый металл | {0.3, 0.3, 0.3, 1.0} | 40 | Умеренный блеск |
| Полированный металл | {0.8, 0.8, 0.8, 1.0} | 120 | Яркий, узкий блик |
| Хром | {1.0, 1.0, 1.0, 1.0} | 200 | Зеркальное отражение |
| Резина | {0.02, 0.02, 0.02, 1.0} | 5 | Почти без блика |
| Мокрая поверхность | {0.6, 0.6, 0.6, 1.0} | 80 | Скользкий, средне-резкий блик |
Свечение (самосвечение)
Чтобы поверхность светилась (LED-индикаторы, экраны, светящиеся элементы):
emmisive[] = {0.2, 0.8, 0.2, 1.0}; // Зелёное свечениеЦвет свечения добавляется к финальному цвету пикселя независимо от освещения. Карта свечения _li на более позднем этапе текстуры может маскировать, какие части поверхности светятся.
Двусторонний рендеринг
Для тонких поверхностей, которые должны быть видимы с обеих сторон (флаги, листва, ткань):
renderFlags[] = {"noZWrite", "noAlpha", "twoSided"};Это не свойство верхнего уровня RVMAT, а настраивается в config.cpp или через параметры шейдера материала в зависимости от случая использования.
Уровни здоровья (замена материалов при повреждении)
Предметы DayZ деградируют со временем. Движок поддерживает автоматическую замену материала на разных порогах повреждений, определяемых в config.cpp с помощью массива healthLevels[]. Это создаёт визуальную прогрессию от нового до разрушенного.
Структура healthLevels[]
class MyItem: Inventory_Base
{
// ... другая конфигурация ...
healthLevels[] =
{
// {порог_здоровья, {"набор_материалов"}},
{1.0, {"MyMod\data\my_item.rvmat"}}, // Новый (100% здоровья)
{0.7, {"MyMod\data\my_item_worn.rvmat"}}, // Поношенный (70% здоровья)
{0.5, {"MyMod\data\my_item_damaged.rvmat"}}, // Повреждённый (50% здоровья)
{0.3, {"MyMod\data\my_item_badly_damaged.rvmat"}},// Сильно повреждённый (30%)
{0.0, {"MyMod\data\my_item_ruined.rvmat"}} // Разрушенный (0% здоровья)
};
};Как это работает
- Движок отслеживает значение здоровья предмета (от 0.0 до 1.0).
- Когда здоровье падает ниже порога, движок заменяет материал на соответствующий RVMAT.
- Каждый RVMAT может ссылаться на разные текстуры -- обычно прогрессивно более повреждённые варианты.
- Замена автоматическая. Скриптовый код не нужен.
Прогрессия текстур повреждений
Типичная прогрессия повреждений:
| Уровень | Здоровье | Визуальное изменение |
|---|---|---|
| Новый | 1.0 | Чистый, заводской вид |
| Поношенный | 0.7 | Небольшие потёртости, мелкие царапины |
| Повреждённый | 0.5 | Видимые царапины, обесцвечивание, грязь |
| Сильно повреждённый | 0.3 | Сильный износ, ржавчина, трещины, отслаивание краски |
| Разрушенный | 0.0 | Сильно деградированный, сломанный вид |
Создание материалов повреждений
Для каждого уровня повреждений создайте отдельный RVMAT, ссылающийся на прогрессивно более повреждённые текстуры:
data/
my_item.rvmat --> my_item_co.paa (чистый)
my_item_worn.rvmat --> my_item_worn_co.paa (лёгкие повреждения)
my_item_damaged.rvmat --> my_item_damaged_co.paa (умеренные повреждения)
my_item_badly_damaged.rvmat --> my_item_badly_damaged_co.paa (тяжёлые повреждения)
my_item_ruined.rvmat --> my_item_ruined_co.paa (разрушен)Совет: Вам не всегда нужны уникальные текстуры для каждого уровня повреждений. Распространённая оптимизация -- использовать общие карты нормалей и спекуляра для всех уровней и менять только диффузную текстуру:
my_item.rvmat --> my_item_co.paa my_item_worn.rvmat --> my_item_co.paa (тот же диффузный, ниже спекуляр) my_item_damaged.rvmat --> my_item_damaged_co.paa my_item_ruined.rvmat --> my_item_ruined_co.paa
Использование ванильных материалов повреждений
DayZ предоставляет набор универсальных оверлейных материалов повреждений, которые можно использовать, если вы не хотите создавать пользовательские текстуры повреждений:
healthLevels[] =
{
{1.0, {"MyMod\data\my_item.rvmat"}},
{0.7, {"DZ\data\data\default_worn.rvmat"}},
{0.5, {"DZ\data\data\default_damaged.rvmat"}},
{0.3, {"DZ\data\data\default_badly_damaged.rvmat"}},
{0.0, {"DZ\data\data\default_ruined.rvmat"}}
};Как материалы ссылаются на текстуры
Связь между моделями, материалами и текстурами образует цепочку:
P3D-модель (Object Builder)
|
|--> Грань назначена RVMAT
|
|--> Stage1.texture = "path\to\normal_nohq.paa"
|--> Stage2.texture = "path\to\color_co.paa"
|--> Stage3.texture = "path\to\specular_smdi.paa"Разрешение путей
Все пути текстур в RVMAT-файлах указываются относительно корня диска P::
// Правильно: относительно диска P:
texture = "MyMod\data\textures\my_item_co.paa";
// Это означает: P:\MyMod\data\textures\my_item_co.paaПри упаковке в PBO префикс пути должен совпадать с префиксом PBO:
Префикс PBO: MyMod
Внутренний путь: data\textures\my_item_co.paa
Полная ссылка: MyMod\data\textures\my_item_co.paaПереопределение hiddenSelectionsMaterials
Config.cpp может переопределить, какой материал применяется к именованной выборке во время выполнения:
class MyItem_Green: MyItem
{
hiddenSelections[] = {"camo"};
hiddenSelectionsTextures[] = {"MyMod\data\my_item_green_co.paa"};
hiddenSelectionsMaterials[] = {"MyMod\data\my_item_green.rvmat"};
};Это позволяет создавать варианты предметов (цветовые схемы, камуфляжные паттерны), которые используют одну P3D-модель, но разные материалы.
Создание RVMAT с нуля
Пошагово: стандартный непрозрачный предмет
Создайте файлы текстур:
my_item_co.paa(диффузный цвет)my_item_nohq.paa(карта нормалей)my_item_smdi.paa(спекулярный/металлический)
Создайте RVMAT-файл (обычный текст):
ambient[] = {1.0, 1.0, 1.0, 1.0};
diffuse[] = {1.0, 1.0, 1.0, 1.0};
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0};
emmisive[] = {0.0, 0.0, 0.0, 0.0};
specular[] = {0.5, 0.5, 0.5, 1.0};
specularPower = 60;
PixelShaderID = "Super";
VertexShaderID = "Super";
class Stage1
{
texture = "MyMod\data\my_item_nohq.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage2
{
texture = "MyMod\data\my_item_co.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage3
{
texture = "MyMod\data\my_item_smdi.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};Назначьте в Object Builder:
- Откройте вашу P3D-модель.
- Выделите грани в LOD Resolution.
- Правый клик --> Face Properties.
- Укажите путь к вашему RVMAT-файлу.
Протестируйте в игре через файловый патчинг или PBO-сборку.
Реальные примеры
DayZ-Samples Test_ClothingRetexture
Официальные DayZ-Samples включают пример Test_ClothingRetexture, демонстрирующий стандартный рабочий процесс материалов:
// Из примера ретекстуры DayZ-Samples
ambient[] = {1.0, 1.0, 1.0, 1.0};
diffuse[] = {1.0, 1.0, 1.0, 1.0};
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0};
emmisive[] = {0.0, 0.0, 0.0, 0.0};
specular[] = {0.3, 0.3, 0.3, 1.0};
specularPower = 50;
PixelShaderID = "Super";
VertexShaderID = "Super";
class Stage1
{
texture = "DZ_Samples\Test_ClothingRetexture\data\tshirt_nohq.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage2
{
texture = "DZ_Samples\Test_ClothingRetexture\data\tshirt_co.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};
class Stage3
{
texture = "DZ_Samples\Test_ClothingRetexture\data\tshirt_smdi.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1.0, 0.0, 0.0};
up[] = {0.0, 1.0, 0.0};
dir[] = {0.0, 0.0, 0.0};
pos[] = {0.0, 0.0, 0.0};
};
};Материал металлического оружия
Полированный ствол оружия с высоким металлическим откликом:
ambient[] = {1.0, 1.0, 1.0, 1.0};
diffuse[] = {1.0, 1.0, 1.0, 1.0};
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0};
emmisive[] = {0.0, 0.0, 0.0, 0.0};
specular[] = {0.9, 0.9, 0.9, 1.0}; // Высокий спекуляр для металла
specularPower = 150; // Узкий, сфокусированный блик
PixelShaderID = "Super";
VertexShaderID = "Super";
// ... определения Stage с текстурами оружия ...Светящийся материал (экран устройства)
Материал для экрана устройства, излучающего свет:
ambient[] = {1.0, 1.0, 1.0, 1.0};
diffuse[] = {1.0, 1.0, 1.0, 1.0};
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0};
emmisive[] = {0.05, 0.3, 0.05, 1.0}; // Мягкое зелёное свечение
specular[] = {0.5, 0.5, 0.5, 1.0};
specularPower = 80;
PixelShaderID = "Super";
VertexShaderID = "Super";
// ... определения Stage, включая карту свечения _li на Stage7 ...Распространённые ошибки
1. Неправильный порядок этапов
Симптом: Текстура выглядит перемешанной, карта нормалей отображается как цвет, цвет как выпуклости. Исправление: Убедитесь, что Stage1 = нормали, Stage2 = диффузный, Stage3 = спекулярный (для шейдера Super).
2. Ошибочное написание emmisive
Симптом: Свечение не работает. Исправление: Bohemia использует emmisive (двойное m, одинарное s). Использование правильного английского написания emissive не сработает. Это известная историческая особенность.
3. Несоответствие пути текстуры
Симптом: Модель отображается с серым по умолчанию или пурпурным материалом. Исправление: Убедитесь, что пути текстур в RVMAT точно совпадают с расположением файлов относительно диска P:. Пути используют обратные слеши. Проверьте регистр -- некоторые системы чувствительны к регистру.
4. Отсутствие назначения RVMAT в P3D
Симптом: Модель рендерится без материала (плоский серый или шейдер по умолчанию). Исправление: Откройте модель в Object Builder, выделите грани и назначьте RVMAT через Face Properties.
5. Использование неправильного шейдера для прозрачных предметов
Симптом: Прозрачная текстура выглядит непрозрачной, или вся поверхность исчезает. Исправление: Используйте шейдер Glass, AlphaTest или AlphaBlend вместо Super для прозрачных поверхностей. Используйте текстуры с суффиксом _ca с правильными альфа-каналами.
Лучшие практики
Начинайте с рабочего примера. Скопируйте RVMAT из DayZ-Samples или ванильного предмета и модифицируйте его. Создание с нуля провоцирует опечатки.
Храните материалы и текстуры вместе. Размещайте RVMAT в той же директории
data/, что и его текстуры. Это делает связь очевидной и упрощает управление путями.Используйте шейдер Super, если нет причины для другого. Он корректно обрабатывает 95% случаев использования.
Создавайте материалы повреждений даже для простых предметов. Игроки замечают, когда предметы визуально не деградируют. Как минимум, используйте ванильные материалы повреждений по умолчанию для нижних уровней здоровья.
Тестируйте спекуляр в игре, а не только в Object Builder. Освещение редактора и внутриигровое освещение дают очень разные результаты. То, что идеально выглядит в Object Builder, может быть слишком блестящим или слишком тусклым при динамическом освещении DayZ.
Документируйте настройки материалов. Когда вы найдёте значения specular/power, которые хорошо работают для типа поверхности, запишите их. Вы будете переиспользовать эти настройки для многих предметов.
Использование в реальных модах
| Паттерн | Мод | Детали |
|---|---|---|
| Общий RVMAT повреждений для всех предметов | Expansion (несколько модулей) | Переиспользует общий набор RVMAT уровней повреждений (worn, damaged, ruined) вместо вариантов для каждого предмета, чтобы сократить количество файлов |
| Светящиеся материалы для экранов | COT (Admin Tools) | Использует значения emmisive[] в RVMAT для эффектов экрана планшета/устройства, видимых ночью |
| Шейдер Glass для стёкол транспорта | DayZ-Samples (Test_Vehicle) | Демонстрирует PixelShaderID = "Glass" с текстурами _ca для прозрачных панелей лобового стекла |
Совместимость и влияние
- Мульти-мод: Пути RVMAT привязаны к PBO и не конфликтуют между модами. Однако переопределения
hiddenSelectionsMaterials[]в config.cpp следуют приоритету "побеждает последний загруженный", поэтому два мода, переопределяющих материал одного ванильного предмета, будут конфликтовать. - Производительность: Каждый уникальный RVMAT, на который ссылаются грани одной P3D-модели, создаёт отдельный вызов отрисовки. Объединение граней под меньшим количеством материалов снижает нагрузку на GPU, особенно для сложных сцен.
- Версионность: Текстовый формат RVMAT и имена шейдеров (Super, Glass, AlphaTest) стабильны с DayZ 1.0. Структурных изменений в последних обновлениях не было.
Навигация
| Предыдущая | Вверх | Следующая |
|---|---|---|
| 4.2 3D-модели | Часть 4: Форматы файлов и DayZ Tools | 4.4 Аудио |
