artykuły

Variable Rate Shading – zgrubne cieniowanie w DirectX i nowych konsolach

31
16 kwietnia 2020, 14:01 Mateusz Brzostek

Ile można zyskać na VRS?

Największego zysku wydajności należy się spodziewać tam, gdzie cieniowanie jest stosunkowo największą częścią generowania obrazu:

  • Im wyższa rozdzielczość, tym wyższy zysk: w wyższych rozdzielczościach jest do wykonania tyle samo obliczeń niezwiązanych z cieniowaniem, ale więcej cieniowania.
  • Im słabszy układ graficzny, tym większy zysk: mało wydajne układy graficzne muszą sobie poradzić z tak samo złożoną geometrią, jak wydajne osobne karty graficzne, ale są zwykle projektowane z myślą o niższej rozdzielczości. Przez to częściej mają niedobór mocy obliczeniowej do przeznaczenia na cieniowanie. 
  • Im bardziej złożone cieniowanie, tym większy zysk: gry i sceny z dużą liczbą skomplikowanych efektów, przezroczystości, rozmyć, ale ze stosunkowo mało złożoną geometrią zyskają najwięcej na uniknięciu cieniowania.
  • Im mniej obiektów i im mniej skomplikowane one są, tym większy zysk: w złożonych scenach z dużą liczbą draw calli płynność jest zwykle w większym stopniu ograniczona wydajnością procesora, a więc odjęcie pracy GPU da mniejszy efekt.
  • Im mniejsza przepustowość pamięci GPU, tym większy zysk: mniej cieniowania oznacza sprawdzanie koloru tekstury w pamięci mniej razy.

VRS nie jest jeszcze szeroko wykorzystywana w grach, ale możemy wnioskować na podstawie kilku przykładów.

W Wolfenstein II: The New Colossus wykorzystano VRS w trybie mapy ekranu. Rozdzielczość cieniowania jest wybierana dla regionów o rozmiarze 16×16 pikseli na podstawie informacji z poprzedniej klatki („co było kontrastowe i istotne w poprzedniej klatce?”) oraz wektorów ruchu („co się szybko porusza, a więc zostanie poddane rozmyciu?”). Wolfenstein II wykorzystuje specjalne rozszerzenie API Vulkan, dostępne wyłącznie na kartach Nvidia Turing, i obniża rozdzielczość cieniowania najdalej do 1/8 (2×4 lub 4×2). Jak wykazały przeprowadzone przez nas testy, zastosowanie najbardziej agresywnego trybu pozwala zwiększyć płynność na high-endowych kartach graficznych o najwyżej 9%. Utrata jakości obrazu jest niemal niezauważalna – algorytm zmniejsza rozdzielczość cieniowania bardzo zachowawczo, a utracone detale zostają zwykle ukryte przez rozmycie lub odzyskane przez TAA.

Twórcy nadchodzącej gry Chivalry II (Unreal Engine 4) używają w swojej grze VRS w trybie mapy ekranu. Jak donoszą, wykorzystanie VRS pozwala poprawić wydajność na zintegrowanym układzie graficznym w procesorze Ice Lake o maksymalnie 32%, ale z łatwo zauważalną utratą jakości. Ponieważ to dynamiczna gra wieloosobowa, zachowanie wysokiej płynności oraz rozdzielczości krawędzi i rozpoznawalności kształtów zostały uznane za ważniejsze, niż wysoka jakość cieniowania wewnątrz powierzchni.

W eksperymentalnej wersji gry Cywilizacja VI twórcy uzyskali ok. 14% wyższą płynność na GeForce RTX 2060 w rozdzielczości 4K w trybie mapy ekranu oraz o ok. 20% lepszą płynność ustawiając rozdzielczość cieniowania osobno dla każdego obiektu.

W 3DMarku można wykonać test wydajności VRS, zarówno w trybie mapy ekranu jak i w trybie „po jednym poleceniu”. Zaprezentowane tam sceny są bardzo proste, a wzrost wydajności dzięki włączeniu VRS przedstawia bardzo optymistyczny scenariusz.

Najważniejsze, co możemy z niego wynieść, to potwierdzenie zależności od rozdzielczości. Im wyższa rozdzielczość, tym większą korzyść daje ograniczenie cieniowania.

Obraz powiększony dwukrotnie.

W czym nie pomaga VRS

Zgrubne cieniowanie pozwala oszczędzić obliczeń tylko na jednym z etapów powstawania obrazu. Nie ma żadnego istotnego wpływu na obciążenie procesora, bo symulacja świata gry, interakcje z użytkownikiem, komunikacja z serwerem gry sieciowej, ani wydawanie poleceń rysowania nie stają się prostsze dzięki VRS. Te technika nie pozwala też na żadną dużą oszczędność pamięci potrzebnej do wygenerowania obrazu. Oczywiście rzadsze cieniowanie oznacza mniej informacji wynikowych do przechowania, ale różne już poddane rasteryzacji powierzchnie są małą cześcią tego, co trzeba zmieścić w pamięci GPU.

Potencjalne problemy

VRS nie zawsze jest łatwym i skutecznym rozwiązaniem. Po pierwsze, może powodować powstawanie artefaktów nie związanych bezpośrednio z tak zwaną „pikselozą”. Jeśli częstotliwość kontrastowych elementów na teksturze jest bliska częstotliwości próbkowania koloru, mogą pojawić się typowe artefakty związane z aliasingiem: migotanie i utrata małych detali, tym razem nie na krawędziach, ale wewnątrz obiektów. Dlatego mipmapy (wstępnie zmniejszone wersje tekstur wykorzystywane, kiedy nie jest potrzebny pełen rozmiar) muszą być przygotowane z myślą o VRS. Również krawędzie wewnątrz tekstur z przezroczystością mogą stać się niedokładne, ponieważ nie są interpretowane jako krawędź bryły, ale ciągła powierzchnia.

Po drugie, zgrubne cieniowanie może kłócić się z założeniami, dzięki którym skutecznie działają różne techniki postprodukcyjne, np. temporalny antyaliasing (TAA), postprodukcyjne odbicia (screen space reflections) czy ambient occlusion.

Po trzecie, zbyt gorliwe zmienianie rozdzielczości cieniowania może nawet zmniejszyć wydajność i wydłużyć proces renderowania jednej klatki. Procesory graficzne są doskonale przystosowane do wykonywania wiele razy tego samego programu na dużym zbiorze danych. Cieniowanie wielu pikseli w ten sam sposób pozwala zająć całą szerokość bloku SIMD oraz wykorzystać w efektywny sposób pamięć podręczną oraz bezstratną kompresję danych w pamięciach podręcznych i pamięci GPU. Zmniejszenie liczby jednakowo cieniowanych pikseli poniżej pewnego progu może dać najwyżej jakąś oszczędność energii, ale nie skrócenie obliczeń. Na dodatek przygotowanie poleceń rysowania z różnymi rozdzielczościami cieniowania daje procesorowi nieco dodatkowej pracy.

4