Com2uS korzysta z interfejsu Vulkan, aby zwiększyć jakość grafiki

Zrzut ekranu z logo gry Com2uS Chronicles.

Summoners War: Chronicles US(WW)KR autorstwa Com2uS korzysta z Vulkana wyłącznie do renderowania na Androidzie, co zapewnia wzrost wydajności nawet o 30%.

Vulkan to nowoczesny, wieloplatformowy interfejs API do obsługi grafiki 3D, który został zaprojektowany tak, aby zminimalizować abstrakcję między sprzętem do obsługi grafiki na urządzeniu a grą. Vulkan ma mniejsze obciążenie procesora niż OpenGL ES i oferuje szerszy zakres funkcji.

Rysunek 1. Zrzut ekranu z gry.
Rysunek 2. Film z gry.

Funkcje renderowania

Firma Com2uS opracowała zaawansowane funkcje renderowania w grze Summoners War: Chronicles, w tym:

  • Niestandardowy system opóźnionego renderowania z wycięciem światła przed renderowaniem i do 16 aktywnych świateł w widoku frustum jednocześnie
  • metoda instancjonowania pośredniego (nazywana Clay) do rysowania wielu siatek, materiałów i tekstur naraz;
  • intensywne korzystanie z shaderów obliczeniowych do zadań wstępnych renderowania;
  • Możliwość dynamicznego dostosowywania renderowania cieni i efektów postprodukcyjnych na podstawie ruchu kamery, opcji graficznych i wydajności w czasie działania

Uwzględnienie sprzętu mobilnego

Summoners War: Chronicles używa tego samego renderera na urządzeniach z Androidem, komputerach osobistych i specjalnych konsolach do gier. Aby uzyskać optymalną wydajność na sprzęcie mobilnym, Com2uS dostosował ustawienia renderowania, w tym głębię i gęstość rysowania. Aby uwzględnić niektóre urządzenia z Androidem 11 (poziom interfejsu API 30) lub niższym, Com2uS utworzyła alternatywne wersje niektórych shaderów i użyła mniejszej liczby instancji. Summoners War: Chronicles korzysta też z funkcji adaptacyjnej wydajności na Androidzie, aby dynamicznie dostosowywać opcje graficzne do warunków termicznych urządzenia.

Uzasadnienie dotyczące tylko interfejsu Vulkan

Firma Com2uS używała Vulkana wyłącznie w grze Summoners War: Chronicles z kilku powodów:

  • Minimalne wymagania dotyczące urządzeń z wyłączeniem starszych, mniej wydajnych urządzeń bez obsługi Vulkana
  • Dostosowywanie silnika Unity Wbudowany potok renderowania (BiRP) wymagane funkcje dostępne tylko w backendzie Vulkan gry
  • Funkcje renderowania korzystające z wyjścia shadera obliczeniowego i obiektów bufora pamięci shadera (SSBOs) można implementować w Vulkan, ale nie w OpenGL ES.

Zadania przetwarzania

Summoners War: Chronicles wykonuje wiele obliczeń za pomocą shadera obliczeniowego, aby wygenerować dane do renderowania. Shadery obliczeniowe służą do:

  • Wycinanie obiektów
  • Kontrola po kolizji
  • Zadania dotyczące animacji
  • Generowanie danych do renderowania pośredniego

Wyniki obliczeń są zapisywane w obiektach RWBuffer silnika Unity. Aby osiągnąć optymalną wydajność, Summoners War: Chronicles wykonuje wszystkie zadania obliczeniowe za pomocą pojedynczego rozkładu, co wymaga jednoczesnego użycia wielu buforów RW. Takie podejście było możliwe tylko przy użyciu Vulkana, ponieważ backend BiRP OpenGL ES w Unity obsługuje tylko jednoczesne używanie jednego RWBuffera.

Zestawy danych generowane na potrzeby renderowania są często większe niż limity rozmiaru urządzenia dla obiektów UBO. Summoners War: Chronicles używa zamiast tego obiektów bufora pamięci Shader (SSBO), które mają większe limity pojemności. Jednak wiązanie usług SSBO z operacjami etapu wierzchołka wymaga obsługi usługi SSBO tylko do odczytu. OpenGL ES obsługuje tylko SSBO z możliwością odczytu i zapisu, a Vulkan może oznaczać SSBO jako tylko do odczytu.

Rendering z użyciem instancjonowania pośredniego w Clay

W przypadku gry Summoners War: Chronicles firma Com2uS opracowała metodę grupowania wielu materiałów, siatek i tekstur w jednym wywołaniu funkcji rysowania. Firma Com2uS nazywa ten system Clay. Clay poprawia wydajność gry o 30% dzięki znacznemu zmniejszeniu liczby wywołań funkcji draw.

Clay rozpoczyna działanie w fazie odrzucania i kolizji, tworząc listę widocznych obiektów do renderowania. Następnie Clay generuje informacje o renderingu dla każdego zidentyfikowanego obiektu w ramach SSBO. Ten proces jest wykonywany za pomocą shaderów obliczeniowych, które umożliwiają użycie pośredniego renderowania instancji za pomocą funkcji DrawMeshInstancedIndirect w renderze Unity. W przypadku renderowania pośredniego informacje o instancjach i parametry liczby instancji są generowane bezpośrednio na karcie graficznej. Podczas rysowania obiektów zamiast wiązania tradycyjnej siatki obiektu Clay wiąże siatkę stożka, jak pokazano na ilustracji:

Rysunek 3. Sieć kratowa w kształcie stożka.

Następnie Clay przekształca siatkę stożka w shaderze wierzchołkowym, używając powiązanego SSBO danych transformacji wierzchołkowej wygenerowanych przez shadery obliczeniowe. Powiązanie SSBO z etapami wierzchołków wymaga użycia Vulkana. Clay może używać wielu przekształconych wierzchołków do renderowania pojedynczego obiektu. Liczba rożków zależy od złożoności obiektu.

Rysunek 4. Jak siatka stożka jest przekształcana w drzewo.

Dane materiału dla obiektów są grupowane w innym buforze generowanym przez shadery obliczeniowe. Bufor jest powiązany z shaderem fragmentów. Tekstury rysowanych obiektów są konfigurowane w tablicy tekstur. Indeksy tablic tekstur obiektu są zawarte w danych materiału obiektu. W idealnych warunkach Clay może renderować z maksymalnie 7 wywołaniami rysowania:

  • Obiekty statyczne
  • Animowane obiekty
  • Cienie (4 iteracje)
  • Refleksje

Unity plus Vulkan

Summoners War: Chronicles pokazuje, że potężna kombinacja silnika gier Unity i interfejsu Vulkan Graphics API umożliwia deweloperom tworzenie zaawansowanej grafiki w jakości konsolowej na urządzeniach z Androidem.