Skip to content

Rozdział 4.3: Materiały (.rvmat)

Strona główna | << Poprzedni: Modele 3D | Materiały | Dalej: Audio >>


Wprowadzenie

Materiał w DayZ jest pomostem między modelem 3D a jego wyglądem wizualnym. Podczas gdy tekstury dostarczają surowe dane obrazu, plik RVMAT (Real Virtuality Material) definiuje, jak te tekstury są łączone, który shader je interpretuje i jakie właściwości powierzchni silnik powinien symulować -- połyskliwość, przezroczystość, samoświecenie i więcej. Każda ściana na każdym modelu P3D w grze odwołuje się do pliku RVMAT, a zrozumienie sposobu ich tworzenia i konfiguracji jest niezbędne dla każdego moda wizualnego.

Ten rozdział opisuje format pliku RVMAT, typy shaderów, konfigurację etapów tekstur, właściwości materiałów, system zamiany materiałów przy różnych poziomach uszkodzeń oraz praktyczne przykłady z DayZ-Samples.


Spis treści


Przegląd formatu RVMAT

Plik RVMAT to tekstowy plik konfiguracyjny (nie binarny) definiujący materiał. Mimo niestandardowego rozszerzenia, format to zwykły tekst używający składni konfiguracji w stylu Bohemii z klasami i parami klucz-wartość.

Kluczowe cechy

  • Format tekstowy: Edytowalny w dowolnym edytorze tekstu (Notepad++, VS Code).
  • Wiązanie shadera: Każdy RVMAT określa, którego shadera renderowania użyć.
  • Mapowanie tekstur: Definiuje, które pliki tekstur są przypisane do których wejść shadera (diffuse, normal, specular, itp.).
  • Właściwości powierzchni: Kontroluje intensywność specularną, poświatę emisyjną, przezroczystość i więcej.
  • Referencjonowany przez modele P3D: Ścianom w LOD Resolution Object Builder przypisuje się RVMAT. Silnik ładuje RVMAT i wszystkie tekstury, do których się odwołuje.
  • Referencjonowany przez config.cpp: hiddenSelectionsMaterials[] może nadpisywać materiały w trakcie działania.

Struktura pliku

Plik RVMAT ma spójną strukturę. Oto kompletny, opatrzony komentarzami przykład:

cpp
ambient[] = {1.0, 1.0, 1.0, 1.0};        // Ambient color multiplier (RGBA)
diffuse[] = {1.0, 1.0, 1.0, 1.0};        // Diffuse color multiplier (RGBA)
forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0};  // Additive diffuse override
emmisive[] = {0.0, 0.0, 0.0, 0.0};       // Emissive (self-illumination) color
specular[] = {0.7, 0.7, 0.7, 1.0};       // Specular highlight color
specularPower = 80;                        // Specular sharpness (higher = tighter highlight)
PixelShaderID = "Super";                   // Shader program to use
VertexShaderID = "Super";                  // Vertex shader program

class Stage1                               // Texture stage: Normal map
{
    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 stage: Diffuse/Color map
{
    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 stage: Specular/Metallic map
{
    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};
    };
};

Właściwości najwyższego poziomu

WłaściwośćTypOpis
ambient[]float[4]Mnożnik koloru światła otoczenia. {1,1,1,1} = pełny, {0,0,0,0} = brak otoczenia.
diffuse[]float[4]Mnożnik koloru światła rozproszonego. Zazwyczaj {1,1,1,1}.
forcedDiffuse[]float[4]Addytywne nadpisanie diffuse. Zazwyczaj {0,0,0,0}.
emmisive[]float[4]Kolor samoświecenia. Wartości niezerowe sprawiają, że powierzchnia świeci. Uwaga: Bohemia używa błędnej pisowni emmisive, nie emissive.
specular[]float[4]Kolor i intensywność odblasków specularnych.
specularPowerfloatOstrość odblasków specularnych. Zakres 1-200. Wyższa = ciaśniejsze, bardziej skupione odbicie.
PixelShaderIDstringNazwa programu shadera pikseli.
VertexShaderIDstringNazwa programu shadera wierzchołków.

Typy shaderów

Dostępne shadery

ShaderPrzypadek użyciaWymagane etapy tekstur
SuperStandardowe nieprzezroczyste powierzchnie (broń, odzież, przedmioty)Normal, Diffuse, Specular/Metallic
MultiWielowarstwowy teren i złożone powierzchnieWiele par diffuse/normal
GlassPrzezroczyste i półprzezroczyste powierzchnieDiffuse z alfą
WaterPowierzchnie wodne z odbiciem i refrakcjąSpecjalne tekstury wody
AlphaTestOstrokrawędziowa przezroczystość (roślinność, ogrodzenia)Diffuse z alfą
AlphaBlendGładka przezroczystość (szkło, dym)Diffuse z alfą

Shader Super (Najczęstszy)

Shader Super to standardowy shader renderowania opartego na fizyce używany dla zdecydowanej większości przedmiotów w DayZ. Oczekuje trzech etapów tekstur:

Stage1 = Normal map (_nohq)
Stage2 = Diffuse/Color map (_co)
Stage3 = Specular/Metallic map (_smdi)

Etapy tekstur

Przypisania etapów dla shadera Super

EtapRola teksturyTypowy sufiksOpis
Stage1Mapa normalnych_nohqDetale powierzchni, nierówności, rowki
Stage2Mapa diffuse / koloru_co lub _caBazowy kolor powierzchni
Stage3Mapa specular / metaliczna_smdiPołyskliwość, właściwości metaliczne, detal
Stage4Cień otoczenia_asWstępnie wypieciona okluzja otoczenia (opcjonalnie)
Stage5Mapa makro_mcWielkoskalowa wariacja koloru (opcjonalnie)
Stage6Mapa detalu_deKafelkowany mikrodetal (opcjonalnie)
Stage7Mapa emisji / światła_liSamoświecenie (opcjonalnie)

Poziomy zdrowia (zamiana materiałów przy uszkodzeniach)

Przedmioty DayZ degradują się z czasem. Silnik obsługuje automatyczną zamianę materiałów przy różnych progach uszkodzeń, definiowaną w config.cpp za pomocą tablicy healthLevels[].

Struktura healthLevels[]

cpp
class MyItem: Inventory_Base
{
    healthLevels[] =
    {
        {1.0, {"MyMod\data\my_item.rvmat"}},           // Pristine (100% health)
        {0.7, {"MyMod\data\my_item_worn.rvmat"}},       // Worn (70% health)
        {0.5, {"MyMod\data\my_item_damaged.rvmat"}},     // Damaged (50% health)
        {0.3, {"MyMod\data\my_item_badly_damaged.rvmat"}},// Badly Damaged (30% health)
        {0.0, {"MyMod\data\my_item_ruined.rvmat"}}       // Ruined (0% health)
    };
};

Jak to działa

  1. Silnik monitoruje wartość zdrowia przedmiotu (0.0 do 1.0).
  2. Gdy zdrowie spada poniżej progu, silnik zamienia materiał na odpowiedni RVMAT.
  3. Każdy RVMAT może odwoływać się do innych tekstur -- zazwyczaj stopniowo bardziej uszkodzonych wariantów.
  4. Zamiana jest automatyczna. Nie jest potrzebny żaden kod skryptowy.

Używanie waniliowych materiałów uszkodzeń

DayZ dostarcza zestaw ogólnych materiałów uszkodzeń nakładkowych, które można użyć, jeśli nie chcesz tworzyć niestandardowych tekstur uszkodzeń:

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"}}
};

Najczęstsze błędy

1. Zła kolejność etapów

Objaw: Tekstura wygląda na pomieszaną, mapa normalnych wyświetla się jako kolor, kolor jako nierówności. Rozwiązanie: Upewnij się, że Stage1 = normal, Stage2 = diffuse, Stage3 = specular (dla shadera Super).

2. Błąd pisowni emmisive

Objaw: Emisja nie działa. Rozwiązanie: Bohemia używa emmisive (podwójne m, pojedyncze s). Używanie poprawnej angielskiej pisowni emissive nie zadziała. To znana historyczna ciekawostka.

3. Niezgodność ścieżek tekstur

Objaw: Model wyświetla się z domyślnym szarym lub magentowym materiałem. Rozwiązanie: Sprawdź, czy ścieżki tekstur w RVMAT dokładnie odpowiadają lokalizacjom plików relatywnie do dysku P:. Ścieżki używają ukośników wstecznych. Sprawdź wielkość liter -- niektóre systemy rozróżniają wielkość liter.

4. Brak przypisania RVMAT w P3D

Objaw: Model renderuje się bez materiału (płaski szary lub domyślny shader). Rozwiązanie: Otwórz model w Object Builder, zaznacz ściany i przypisz RVMAT przez Face Properties.

5. Użycie złego shadera dla przezroczystych przedmiotów

Objaw: Przezroczysta tekstura wyświetla się jako nieprzezroczysta lub cała powierzchnia znika. Rozwiązanie: Użyj shadera Glass, AlphaTest lub AlphaBlend zamiast Super dla przezroczystych powierzchni. Używaj tekstur z sufiksem _ca z odpowiednimi kanałami alfa.


Dobre praktyki

  1. Zacznij od działającego przykładu. Skopiuj RVMAT z DayZ-Samples lub waniliowego przedmiotu i zmodyfikuj go. Zaczynanie od zera prowadzi do literówek.

  2. Przechowuj materiały i tekstury razem. Umieszczaj RVMAT w tym samym katalogu data/ co jego tekstury. Czyni to relację oczywistą i upraszcza zarządzanie ścieżkami.

  3. Używaj shadera Super, chyba że masz powód, by tego nie robić. Obsługuje 95% przypadków użycia poprawnie.

  4. Twórz materiały uszkodzeń nawet dla prostych przedmiotów. Gracze zauważają, gdy przedmioty nie degradują się wizualnie. Minimum to użycie waniliowych domyślnych materiałów uszkodzeń dla niższych poziomów zdrowia.

  5. Testuj specular w grze, nie tylko w Object Builder. Oświetlenie edytora i oświetlenie w grze dają bardzo różne wyniki. To, co wygląda idealnie w Object Builder, może być zbyt błyszczące lub zbyt matowe pod dynamicznym oświetleniem DayZ.

  6. Dokumentuj ustawienia materiałów. Gdy znajdziesz wartości specular/power, które dobrze działają dla danego typu powierzchni, zanotuj je. Będziesz ponownie używać tych ustawień w wielu przedmiotach.


Nawigacja

PoprzedniW góręDalej
4.2 Modele 3DCzęść 4: Formaty plików i DayZ Tools4.4 Audio

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