Postęp czasem musi być krwawy. Mesh Shaders na szczęście żniwa jeszcze nie zebrały
Jest karta graficzna i jest gra wideo – co w takim połączeniu musi pójść nie tak, żeby sprzętowe ograniczenia nie umożliwiły karcie działania? Technologia przyzwyczaiła już nas, że grę można odpalić praktycznie na wszystkim (nawet starych zintegrowanych procesorach graficznych), ale tak się składa, że wszystkie starsze karty graficzne zostały zagięte przed kilkoma laty przez sprzętowe wsparcie Mesh Shaders, czyli wyjątkowej technologii renderowania, która to jest częścią API DirectX 12 Ultimate. Aktualnie obsługują ją karty graficzne z serii GeForce RTX 2000 (i nowsze) oraz Radeon RX 6000 (i nowsze).
Czytaj też: Wszyscy mówili: nie idź do gamedevu. Nie posłuchałem i dziś mogę się pochwalić pierwszą grą
W gruncie rzeczy jest ona rewolucyjna, ale jej wejście do użytku wraz z wprowadzeniem na rynek kart GeForce RTX 2000 wcale nie zapoczątkowało tej mitycznej “nowej ery” w grafice komputerowej. Dlaczego więc ten temat powraca przy grze Alan Wake 2? Odpowiedź na to pytanie zdradza sama natura implementacji tej technologii, bo Alan Wake 2 jest pierwszą grą, która wymaga obsługi Mesh Shaders do samego uruchomienia gry. Dlatego właśnie Cyberpunk 2077 od wersji 1.3 nie wymaga od kart graficznych obsługi Mesh Shaders – deweloperzy zadbali, żeby ich gra obsługiwała jednocześnie zarówno tę nowość, jak i tradycyjny potok renderowania.
Jednak jak wiele możliwości otwierają Mesh Shaders, że studio Remedy Entertainment tak bardzo ograniczyło swoje grono odbiorców na PC, żeby tylko je wykorzystać? Oczywiście pomijając lenistwo lub dziury w budżecie, aby postąpić w podobny sposób, jak to miało miejsce z Cyberpunkiem 2077. Tego właśnie dowiecie się z tekstu poniżej.
Czym są Mesh Shaders?
Z racji braku polskojęzycznego określenia, musimy posługiwać się angielskim “Mesh Shaders”, czyli zlepku dwóch słów, określających kolejno graficzną “siatkę” i specyficzne programy komputerowe. Termin Mesh odnosi się do sposobu reprezentacji i renderowania obiektów trójwymiarowych na ekranie i sprowadza się do zbioru punktów, krawędzi i ścian, które tworzą kształt obiektu. Może być również podzielony na mniejsze części, zwane meshletami, które mogą być łatwiej przetwarzane i odrzucane przez kartę graficzną. Z kolei shader to krótki program komputerowy, który w grafice trójwymiarowej opisuje właściwości pikseli oraz wierzchołków. Pozwala na bardziej skomplikowane modelowanie oświetlenia i materiału na obiekcie niż standardowe modele oświetlenia i teksturowania.
Chociaż mogłoby się wydawać, że takie wyjaśnienie pozwala już zrozumieć naturę Mesh Shaders, to w praktyce jest to znacznie bardziej skomplikowany termin. Rzeczywiście jednak łączy “szejdery z meszami”, jako że ta technika renderowania robi użytek z modelu programowania obliczeniowego i wykorzystuje wątki do generowania siatek w ramach grupy roboczej. Dane wierzchołków i indeksów dla tych siatek są zapisywane podobnie do pamięci współdzielonej w shaderach obliczeniowych i mogą być bezpośrednio wykorzystane w procesie rasteryzacji, a więc zamieniania obiektów trójwymiarowych na piksele na ekranie.
Dzięki temu Mesh Shaders zastępują tradycyjne shadery wierzchołków i geometrii w potoku graficznym, oferując zwłaszcza technicznym artystom (deweloperom odpowiadającym za techniczno-graficzną sferę gry) większe możliwości oraz elastyczność w modelowaniu wirtualnego świata. Wystarczy wspomnieć, że ten właśnie rodzaj shaderów może wzmacniać i usuwać geometrię, tworząc więcej lub mniej geometrii w czasie rzeczywistym i nawet odrzucać tę część modelu, która nie jest widoczna lub istotna. Tego typu możliwości manipulowania renderowaną treścią przekładają się bezpośrednio na optymalizację gry, co pozwala albo skupić się na ważniejszych elementach obrazu, albo zwyczajnie zwiększyć liczbę generowanych klatek, przekierowując na to właśnie moc obliczeniową.
W praktyce silniki gier przy wykorzystaniu Mesh Shaders mogą poprawić wydajność, wykorzystując potok cieniowania siatki do efektywnego usuwania geometrii, która nie jest widoczna dla kamery. Zmniejsza to ilość danych oraz liczbę tak zwanych “draw calls”, czyli wywołań rysowania, które to muszą zostać przetworzone przez procesor graficzny. Mogą również poprawić szczegółowość obiektów, umożliwiając realizację dokładniejszego i dynamicznego dostosowywania szczegółów zależnie od odległości obiektu od kamery. Wisienką na torcie jest fakt, że Mesh Shaders mogą również umożliwiać bardziej zaawansowane efekty, takie jak generowanie proceduralne, deformacja lub teselacja geometrii, które mogą posłużyć do stworzenia bardziej realistycznych oraz immersyjnych środowisk dla graczy.
Niestety jednak na rynku ciągle brakuje gier, które robią użytek z Mesh Shaders, ale każdy kolejny rok z pewnością będzie teraz opiewał w nowe tytuły. Produkcja wielkich gier trwa bowiem latami, więc to naturalne, że pięć lat temu nikt nie myślał o wykorzystaniu Mesh Shaders w swoim rozwiniętym już do pewnego etapu prototypie gry w produkcji. Dziś wiemy już, że ta technika renderowania to przyszłość, więc deweloperzy z całą pewnością będą po niego sięgać. Zwłaszcza że jest w banalny sposób dostępy w najpopularniejszych silnikach do tworzenia gier.
Czytaj też: Gdzie się podziały gry w wersji demo?
Przykładowo Unreal Engine 5 wykorzystuje funkcję o nazwie Nanite, która jest zwirtualizowanym systemem geometrii mikropoligonów, umożliwiającym artystom tworzenie tak wielu szczegółów geometrycznych, jak tylko oko może zobaczyć. Tak się składa, że Nanite korzysta z funkcji Mesh Shaders do wydajnego pobierania i renderowania milionów trójkątów na klatkę. Mniej zaawansowane implementacje tej techniki znalazły się w Unity w potoku High Definition Render Pipeline (HDRP) czy silniku Godot, dzięki obsługiwaniu przez niego niskopoziomowego API Vulkan i rozszerzenia o nazwie VK_NV_mesh_shader. Ewidentnie jednak to twórcy na Unreal Engine 5 mają “najłatwiej” z wykorzystaniem Mesh Shaders, choć musimy pamiętać, że firmy pokroju Remedy Entertainment mają swoje własne silniki, które mogą robić z tej techniki użytek. Alan Wake 2 postawiony na Nortlight jest tego świetnym przykładem.