Skip to content

Глава 4.3: Материалы (.rvmat)

Главная | << Назад: 3D-модели | Материалы | Далее: Аудио >>


Введение

Материал в DayZ -- это мост между 3D-моделью и её визуальным представлением. В то время как текстуры предоставляют необработанные данные изображений, файл RVMAT (Real Virtuality Material) определяет, как эти текстуры комбинируются, какой шейдер их интерпретирует и какие свойства поверхности движок должен моделировать -- блеск, прозрачность, самосвечение и многое другое. Каждая грань каждой P3D-модели в игре ссылается на RVMAT-файл, и понимание того, как их создавать и настраивать, необходимо для любого визуального мода.

Эта глава охватывает формат файла RVMAT, типы шейдеров, настройку этапов текстур, свойства материалов, систему замены материалов по уровню повреждений и практические примеры из DayZ-Samples.


Содержание


Обзор формата 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-файл имеет единообразную структуру. Вот полный аннотированный пример:

cpp
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]Цвет и интенсивность спекулярного блика.
specularPowerfloatРезкость спекулярных бликов. Диапазон 1-200. Выше = более узкое, сфокусированное отражение.
PixelShaderIDstringИмя программы пиксельного шейдера.
VertexShaderIDstringИмя программы вершинного шейдера.

Типы шейдеров

Значения 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 обрабатывает прозрачные поверхности. Он считывает альфа из диффузной текстуры для определения прозрачности:

cpp
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Самосвечение (опционально)

Свойства этапа

Каждый этап содержит:

cpp
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:

cpp
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-индикаторы, экраны, светящиеся элементы):

cpp
emmisive[] = {0.2, 0.8, 0.2, 1.0};   // Зелёное свечение

Цвет свечения добавляется к финальному цвету пикселя независимо от освещения. Карта свечения _li на более позднем этапе текстуры может маскировать, какие части поверхности светятся.

Двусторонний рендеринг

Для тонких поверхностей, которые должны быть видимы с обеих сторон (флаги, листва, ткань):

cpp
renderFlags[] = {"noZWrite", "noAlpha", "twoSided"};

Это не свойство верхнего уровня RVMAT, а настраивается в config.cpp или через параметры шейдера материала в зависимости от случая использования.


Уровни здоровья (замена материалов при повреждении)

Предметы DayZ деградируют со временем. Движок поддерживает автоматическую замену материала на разных порогах повреждений, определяемых в config.cpp с помощью массива healthLevels[]. Это создаёт визуальную прогрессию от нового до разрушенного.

Структура healthLevels[]

cpp
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% здоровья)
    };
};

Как это работает

  1. Движок отслеживает значение здоровья предмета (от 0.0 до 1.0).
  2. Когда здоровье падает ниже порога, движок заменяет материал на соответствующий RVMAT.
  3. Каждый RVMAT может ссылаться на разные текстуры -- обычно прогрессивно более повреждённые варианты.
  4. Замена автоматическая. Скриптовый код не нужен.

Прогрессия текстур повреждений

Типичная прогрессия повреждений:

УровеньЗдоровьеВизуальное изменение
Новый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 предоставляет набор универсальных оверлейных материалов повреждений, которые можно использовать, если вы не хотите создавать пользовательские текстуры повреждений:

cpp
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::

cpp
// Правильно: относительно диска 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 может переопределить, какой материал применяется к именованной выборке во время выполнения:

cpp
class MyItem_Green: MyItem
{
    hiddenSelections[] = {"camo"};
    hiddenSelectionsTextures[] = {"MyMod\data\my_item_green_co.paa"};
    hiddenSelectionsMaterials[] = {"MyMod\data\my_item_green.rvmat"};
};

Это позволяет создавать варианты предметов (цветовые схемы, камуфляжные паттерны), которые используют одну P3D-модель, но разные материалы.


Создание RVMAT с нуля

Пошагово: стандартный непрозрачный предмет

  1. Создайте файлы текстур:

    • my_item_co.paa (диффузный цвет)
    • my_item_nohq.paa (карта нормалей)
    • my_item_smdi.paa (спекулярный/металлический)
  2. Создайте RVMAT-файл (обычный текст):

cpp
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};
    };
};
  1. Назначьте в Object Builder:

    • Откройте вашу P3D-модель.
    • Выделите грани в LOD Resolution.
    • Правый клик --> Face Properties.
    • Укажите путь к вашему RVMAT-файлу.
  2. Протестируйте в игре через файловый патчинг или PBO-сборку.


Реальные примеры

DayZ-Samples Test_ClothingRetexture

Официальные DayZ-Samples включают пример Test_ClothingRetexture, демонстрирующий стандартный рабочий процесс материалов:

cpp
// Из примера ретекстуры 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};
    };
};

Материал металлического оружия

Полированный ствол оружия с высоким металлическим откликом:

cpp
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 с текстурами оружия ...

Светящийся материал (экран устройства)

Материал для экрана устройства, излучающего свет:

cpp
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 с правильными альфа-каналами.


Лучшие практики

  1. Начинайте с рабочего примера. Скопируйте RVMAT из DayZ-Samples или ванильного предмета и модифицируйте его. Создание с нуля провоцирует опечатки.

  2. Храните материалы и текстуры вместе. Размещайте RVMAT в той же директории data/, что и его текстуры. Это делает связь очевидной и упрощает управление путями.

  3. Используйте шейдер Super, если нет причины для другого. Он корректно обрабатывает 95% случаев использования.

  4. Создавайте материалы повреждений даже для простых предметов. Игроки замечают, когда предметы визуально не деградируют. Как минимум, используйте ванильные материалы повреждений по умолчанию для нижних уровней здоровья.

  5. Тестируйте спекуляр в игре, а не только в Object Builder. Освещение редактора и внутриигровое освещение дают очень разные результаты. То, что идеально выглядит в Object Builder, может быть слишком блестящим или слишком тусклым при динамическом освещении DayZ.

  6. Документируйте настройки материалов. Когда вы найдёте значения 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 Tools4.4 Аудио

Released under CC BY-SA 4.0 | Code examples under MIT License