
Diablo Immortal to wieloosobowa gra fabularna typu action-RPG (ARPG) dostępna bezpłatnie, opracowana wspólnie przez Blizzard Entertainment i NetEase. Diablo Immortal – nowy rozdział w serii Diablo, który ukazał się w 2022 r. Gra wypełnia lukę fabularną między Diablo 2 a Diablo 3 i zabiera graczy w nowe przygody związane z fragmentami Kamienia Świata. Gracze eksplorują kontynent Sanctuary, walcząc z demonami i złotymi mocami.
Dzięki innowacyjnej architekturze mobilnych procesorów graficznych i przełomowym osiągnięciom w zakresie akceleracji sprzętowej technologia śledzenia promieniowego stopniowo przenosi się z komputerów na urządzenia mobilne, stając się jednym z głównych czynników napędzających renderowanie grafiki o wysokiej jakości. Obliczanie dynamicznych odbić o realistycznym wyglądzie jest wymagające pod względem obliczeniowym, ale dedykowany układ sprzętowy umożliwia to na platformach mobilnych o ograniczonej mocy. Dzięki śledzeniu ścieżki rozchodzenia się światła w czasie rzeczywistym technologia dokładnie symuluje odbicie na złożonych powierzchniach, takich jak lustra, metale i ciecze. Śledzenie promieni pozwala przezwyciężyć ograniczenia przestrzenne i błędy przybliżania tradycyjnych schematów rastrowania oraz obsługuje globalne spójne wyrażanie dynamicznych źródeł światła, obiektów poza ekranem i odblasków wielopoziomowych.
sprzętowy ray tracing na urządzeniach mobilnych,
Technologia przetwarzania promieniowego na sprzęcie obejmuje głównie 2 paradygmaty implementacji: przetwarzanie promieniowe w pipeline’ie i zapytanie promieniowe.
Ścieżka ray tracingu tworzy pełną ścieżkę za pomocą specjalnych etapów shadera (generowanie promieni / przecięcie / shader najbliższego trafienia). Chociaż pozwala ona na precyzyjne kontrolowanie interakcji promieni, śledzenie promieni wymaga niezależnej konfiguracji potoku, co zwiększa złożoność procesu tworzenia.
Z drugiej strony zapytanie o promienie umożliwia inicjowanie zapytań o promienie bezpośrednio z tradycyjnego obliczenia lub fragmentu, co czyni je podstawową technologią do śledzenia promieni w mobilnych grach. Dzięki temu, że nie trzeba tworzyć osobnych ścieżek, zapytanie o promienną nie tylko znacznie upraszcza proces tworzenia, ale ma też 3 główne zalety:
- Zapewnia zgodność z zróżnicowanymi środowiskami obliczeniowymi i niepełnym sprzętem do śledzenia promieniowego.
- Obsługuje wywoływanie ray tracingu na żądanie na dowolnym etapie cieniowania.
- Dzięki ograniczeniu wykorzystania zasobów spełnia wymagania dotyczące przepustowości i mocy platform mobilnych oraz stanowi odpowiednią podstawę dla zaawansowanych efektów, takich jak dynamiczna globalna iluminacja i odbicia w czasie rzeczywistym w grach mobilnych.
Diablo Immortal korzysta z Vulkana, aby wykorzystać możliwości sprzętowego ray tracingu karty graficznej. Gra oblicza ścieżkę promieni światła w scenie w czasie rzeczywistym i uwzględnia złożone właściwości materiałów, aby uzyskać przełomowe efekty odbicia w czasie rzeczywistym na urządzeniach z Androidem.


Struktura przyspieszenia
Struktura akceleracji to podstawa raytracingu sprzętowego. Struktura przyspieszenia znacznie zwiększa wydajność testowania przecięcia promieniowego dzięki hierarchicznej organizacji danych.
System ma zwykle 2 poziomy: strukturę przyspieszenia na najwyższym poziomie (TLAS) i strukturę przyspieszenia na najniższym poziomie (BLAS):
- TLAS pełni rolę menedżera sceny. Dzięki zapisywaniu macierzy transformacji przestrzennej (w tym pozycji, obrotu i skali) wszystkich instancji BLAS realizuje globalną organizację dynamicznych scen. Na przykład TLAS umożliwia deweloperom rozpowszechnianie setek instancji tego samego modelu drzewa w różnych pozycjach i postawach w scenie. W rezultacie deweloperzy muszą tylko zaktualizować macierz przekształcenia obiektu ruchomego w każdej klatce, zamiast rekonstruować geometrię.
- BLAS jako jednostka podstawowa – odpowiada za wydajne kodowanie szczegółów geometrycznych pojedynczego obiektu 3D. BLAS tworzy strukturę indeksu przestrzennego za pomocą algorytmu hierarchii ograniczonego wolumenu (BVH), dzięki czemu nieistotne obszary mogą być szybko pomijane podczas wykrywania promieni.
Ta hierarchiczna konstrukcja umożliwia ścieżce ray tracingu tworzenie wydajnego łańcucha wykrywania, który składa się z elementów ray ==> TLAS (instancja obiektu sita o grubych oczkach) ==> BLAS (dokładne przecięcie).
Oddzielenie modeli dynamicznych od statycznych jest kluczowe dla zminimalizowania kosztów budowy struktury przyspieszenia:
- Model statyczny – bibliotekę BLAS trzeba skompilować tylko raz na etapie inicjowania i można jej używać bezpośrednio podczas wczytywania kolejnych scen. Aby uniknąć opóźnień podczas wczytywania dużych scen, można użyć asynchronicznej technologii wstępnej konstrukcji do tworzenia ramek, aby rozłożyć zadanie tworzenia BLAS na wiele klatek.
- Model dynamiczny
- Za pomocą animacji szkieletu – dane wierzchołka z szkieletem muszą być obliczane równolegle przez shader obliczeniowy w każdej klatce, aby wygenerować nowy bufor wierzchołków, a następnie wywołać przyrostową aktualizację odpowiedniego BLAS-a, co pozwala uniknąć całkowitej rekonstrukcji i poprawia wydajność.
- Przekształcenie sztywnego ciała – jeśli występują tylko przekształcenia translacji, obrotu i powiększenia, nie trzeba modyfikować BLAS. Wystarczy zaktualizować jego macierz przekształcenia świata w TLAS, a potem wywołać proces szybkiej aktualizacji TLAS.
Okresowe odtwarzanie jest niezbędne do utrzymania efektywności struktury akceleracji w dynamicznych scenach z śledzeniem promienistym. Gdy obiekty dynamiczne ulegają znacznym zmianom w topologii geometrycznej, takim jak odkształcenie czy przesunięcie wierzchołka na dużą odległość, pierwotne podziały przestrzenne mogą nie działać, co zmniejsza skuteczność wykrywania kolizji podczas przeszukiwania promieniowego. W efekcie pełna rekonstrukcja bardzo dynamicznego BLAS/TLAS musi być wywoływana co N klatek, a nie w ramach aktualizacji przyrostowej.
Aby zoptymalizować wydajność renderowania z wykorzystaniem ray tracingu, zastosuj dynamiczną strategię tworzenia TLAS na podstawie widocznego obszaru postaci: do TLAS są dodawane tylko modele znajdujące się w zakresie aktywnego promienia postaci, co pozwala zmniejszyć obciążenie związane z obliczeniem przecięcia promieni.
odbicia promieniowe,
Odbicie promieniowe ma kilka zalet w porównaniu z tradycyjnymi technikami, takimi jak odbicia w płaszczyźnie ekranu (SSR) i odbicia planarne (proste powierzchnie, które wyświetlają scenę w jednym wymiarze). Odbicie śledzenia promieniowego symuluje fizycznie ścieżkę światła, dokładnie rejestruje obiekty dynamiczne wewnątrz i na zewnątrz sceny, obsługuje naturalne odbicia od zakrzywionych i niepłaskich powierzchni oraz umożliwia tworzenie efektów odbić światła, takich jak odbicia w lustrach. W przeciwieństwie do SSR, SSR jest ograniczony do informacji widocznych na ekranie, a odbicia w płaskich powierzchniach są podatne na błędy wizualne lub zniekształcenia w skomplikowanych scenach.


Odbicie w technologii ray-tracing działa podobnie jak tradycyjna metoda SSR: emituje promienie w kierunku linii widzenia odbicia w przypadku każdego piksela i oblicza ich przecięcie z obiektami sceny. Punkt przecięcia zwrócony przez interfejs API zapytania o promienie zawiera informacje geometryczne (w tym identyfikator instancji, indeks geometrii i indeks prymitywu) oraz parametry rasteryzacji (współrzędne barycentrum) na poziomie trójkąta, ale nie zawiera danych o kolorze piksela. Typowe rozwiązanie wykorzystuje technologię bindless resource binding do wstępnego kompilowania wszystkich parametrów tekstur i materiałów sceny w globalną tablicę indeksów. Za pomocą identyfikatorów geometrycznych zwróconych przez zapytanie o promienie można sprawdzić właściwości fizyczne odpowiedniego materiału (takie jak mapa normalna i szorstkość), a następnie połączyć je z interpolacją współrzędnych barycentrum, aby obliczyć informacje o cieniowaniu powierzchni. Prawdziwą wartość koloru przecięcia można odtworzyć za pomocą rasteryzacji.
Podczas implementacji zespół Diablo Immortal odkrył 2 istotne problemy techniczne:
- Model oświetlenia został wymuszony na jednolity, co było sprzeczne z różnymi systemami cieniowania nagromadzonymi w historii projektu i spowodowałoby niezgodność między materiałem odbłyskowym a oryginalnym materiałem.
- Różnorodność formatów wierzchołków prowadzi do spadku wydajności rozgałęzienia instrukcji na etapie rasteryzacji, co jest poważnym problemem w warunkach ograniczonego budżetu wydajności na urządzeniu mobilnym.
Zespół Diablo Immortal wprowadził innowacyjne rozwiązanie w postaci bufora widoczności, aby oddzielić przetwarzanie geometrii od obliczeń cieniowania:
- Faza śledzenia promieni — informacje o trafieniach promieni na poziomie piksela są rejestrowane w czasie rzeczywistym za pomocą zapytania o wiązkę promieni. Identyfikator przestrzenny 3D (
InstanceID
zPrimitiveIndex
) punktu przecięcia jest kodowany w kompaktowym identyfikatorze widoczności i zapisywany w buforze przestrzeni ekranu. - Etap kolorowania – podobnie jak operacje wykonywane przez shadery wierzchołków i pixeli, identyfikatory geometryczne w buforze widoczności są dynamicznie analizowane, pobierane są właściwości wierzchołków (takie jak UV i normalne) oraz mapy materiałów opartych na fizyce oryginalnego modelu, a na koniec wykonywane są obliczenia cieniowania powiązane z typem materiału.
To rozwiązanie umożliwia połączenie zasobów graficznych z systemem odbić odbitych promieniowo bez konieczności modyfikowania formatów wierzchołków ani shaderów.
Szczegółowe kroki renderowania
Przetwarzanie zapytania o promienie
Odpowiada etapowi śledzenia promieni i generuje bufor widoczności dla odbić w przestrzeni ekranu:
- Kolor0
- Format: R32G32UInt
- R = TriangleID, G = Barycentrics

- Głębokość:
- Format: Depth32F
- D = EncodeAsFloat(InstanceIdx, GeometryIdx)
- Identyfikator materiału na skrzyżowaniu jest kodowany w 32-bitowej zmiennej wykładniczej i zapisywany w buforze głębi na potrzeby następnego etapu techniki wykrywania dopasowania kodowania głębokości materiału.

W porównaniu z shaderem obliczeniowym zapytanie o promienie w shaderze pikseli ma następujące zalety:
- Integracja potoku – strumień jest wbudowany bezpośrednio w istniejące strumienie renderowania do przodu lub opóźnionego, zachowując ciągłość stanu strumienia renderowania.
- Optymalizacja przepustowości mobilnej – w przypadku architektury opartej na elementach mozaikowych można włączyć bezstratną kompresję na chipie, gdy dane kolizji promieniowej są zapisywane w
RenderTarget
. Pozwala to zmniejszyć zużycie przepustowości pamięci w porównaniu z tradycyjnym wyjściem z shadera obliczeniowego do bufora. - Kontrola ilości promieniowania – obszary nieodblaskowe można oznaczać i odrzucać za pomocą fazy wstępnego obliczenia w połączeniu z testem szablonu.
Rozwiązanie problemu
Na etapie kolorowania (patrz odbicie promieniami) zespół Diablo Immortal osiągnął szybkie dopasowanie identyfikacji, korzystając z urządzenia do testowania głębi obrazu i wykonując kolorowanie materiałów w kolejnych partiach.
W przypadku każdego materiału jest generowany pełny ekran. Shader wierzchołkowy dynamicznie odtwarza zakodowany identyfikator bieżącego materiału. Za pomocą testu równości głębi identyfikator jest porównywany z zakodowanymi wartościami w buforze głębi, a tylko piksele, których zakodowane wartości dokładnie pasują, są zatrzymywane, czyli te piksele, które należą do bieżącej instancji materiału. Zatrzymane piksele wykonują odpowiedni shader materiału.
Następnie w shaderze pikseli wdrożono funkcję dokładnego odwzorowania materiałów:
- Dekodowanie danych geometrycznych – z bufora widoczności wyodrębnia identyfikator trójkąta (
MeshID
+PrimitiveID
) i współrzędne barycentrum, a następnie dynamicznie wczytuje z bufora wierzchołków atrybuty wierzchołka (pozycja, UV, normalna itp.) odpowiadającego trójkąta. Ponieważ każdy model jest cieniowany jako niezależny materiał, zaawansowane funkcje, takie jak wiązanie, nie są konieczne. - Odtwarzanie parametrów powierzchni – oblicza współrzędne UV na przecięciu za pomocą interpolacji współrzędnych barycentrum. Wykonujemy rasteryzację oprogramowania, aby pobrać próbki mapy na podstawie interpolowanych współrzędnych UV.
- Ponowne używanie obliczeń cieniowania – bezpośrednie ponowne używanie istniejącego kodu shadera w celu zachowania tej samej logiki materiału co w głównym potoku renderowania.

Modele, które faktycznie uczestniczą w obliczaniu odbić, stanowią tylko bardzo małą część sceny. Dane identyfikacyjne modelu odbicia zwracane przez GPU mogą być odczytywane asynchronicznie, aby wyeliminować modele i materiały, które nie uczestniczą w odbiciu, co skutecznie zmniejsza liczbę wywołań rysowania (wywołanie rysowania występuje, gdy materiały i siatka są przesyłane do GPU do narysowania) na etapie cieniowania.
odbicie światła oparte na fizyce
Aby uzyskać realistyczne odbicia, powierzchnie odbijające są klasyfikowane według szorstkości na jeden z trzech typów:
- Bez odbicia – obliczenia odbicia dla tych powierzchni można pominąć, aby zaoszczędzić zasoby. Jeśli powierzchnia jest bardzo szorstka, odbicie staje się niewyraźne i słabe, więc wpływ jest niejednoznaczny.
- odbicie lustrzane – obraz jest wyraźny i nierozmazany, jak w przypadku gładkiego lustra; Zrób zdjęcie linii w kierunku odbicia od linii wzroku.
- Połyskujące odbicie – odbicie z pewną chropowatością powierzchni jest symulowane na podstawie próbkowania GGX z uwzględnieniem ważności, które może uwzględniać zarówno wydajność obliczeniową, jak i dokładność fizyczną. Odchylenie odbicia w głównym kierunku odbicia stycznym podczas emitowania linii poprawia skuteczność próbkowania obszaru odbicia.
Aby uzyskać przydatną jakość obrazu przy ograniczonym zużyciu energii, zespół Diablo Immortal wdrożył rozwiązanie 1SPP+Denoiser. Oznacza to, że zespół Diablo Immortal pobrał 1 próbkę na piksel, a następnie zastosował algorytm redukcji szumów czasowych/przestrzennych, aby wygładzić duży szum spowodowany niską częstotliwością próbkowania.
Zespół Diablo Immortal wybrał algorytm Reflection Denoiser w AMD FidelityFX Denoiser, który jest wydajnym algorytmem redukcji szumów zoptymalizowanym pod kątem odbić ray-traced i odbić ekranowych. Podstawową zaletą algorytmu redukcji szumów odbicia jest hybrydowy algorytm redukcji szumów czasoprzestrzennej: dzięki łączeniu bieżących danych o ramce i danych historycznych (na podstawie kompensacji ruchu) w połączeniu z technikami filtrowania przestrzennego (np. filtrowania z zachowaniem krawędzi kierowanego przez odchylenie) algorytm redukcji szumów odbicia skutecznie eliminuje szum i wydaje płynne efekty odbicia przy bardzo niskiej próbkowaniu.
Aby dostosować się do specyfiki opracowanych przez siebie szyn renderowania i spełnić rygorystyczne ograniczenia wydajności na urządzeniach mobilnych, zespół Diablo Immortal wdrożył ukierunkowane uproszczenie i dostosowywanie architektury podczas integrowania narzędzia AMD FidelityFX Reflection Denoiser.
Ray tracing o wysokiej jakości z Vulkanem
Diablo Immortal działa na wielu urządzeniach z Androidem, które obsługują Vulkan. Zespół Diablo Immortal wykorzystał innowacyjne możliwości sprzętowego ray tracingu na GPU. Vulkan zmniejszył koszty i problemy związane z rozwojem, ułatwiając dostarczanie wysokiej jakości treści i rozgrywki Diablo Immortal użytkownikom Androida.