PSO je objekt, který v sobě zapouzdřuje kompletní stav grafické linky (pipeline) pro danou operaci vykreslování. Obsahuje konfiguraci od shaderů až po nastavení míchání barev a hloubkového testu.
V dobách starších API (jako OpenGL) byl stav grafické karty nastaven jako globální stavový stroj. Programátor měnil jednotlivé parametry (např. glEnable(GL_DEPTH_TEST)) těsně před vykreslením.
PSO je v podstatě „recept“, který říká GPU, jak přesně má zpracovat data. Po vytvoření je PSO neměnný (immutable). Obsahuje:
Hlavní výhodou PSO je, že se vytvářejí během načítání aplikace (loading screen), nikoliv během samotného hraní.
1. **Vytvoření (Creation):** Aplikace definuje všechny stavy a požádá [[Vulkan]]/DX12 o vytvoření PSO. Ovladač provede veškeré náročné výpočty a kompilace dopředu. 2. **Uložení do mezipaměti (Caching):** Vytvořené PSO se často ukládají na disk (Pipeline Cache), aby při příštím spuštění hry nebylo nutné znovu kompilovat. 3. **Vázání (Binding):** Během vykreslování scény aplikace pouze přepíná mezi hotovými PSO. To je extrémně rychlá operace.
Možná jste si u moderních PC her všimli obrazovky „Compiling Shaders“ při prvním spuštění. To je právě proces vytváření tisíců PSO pro všechny možné kombinace materiálů a efektů ve hře.
| Vlastnost | Starý přístup (OpenGL) | Moderní přístup (PSO) |
|---|---|---|
| Kdy se konfiguruje? | Těsně před kreslením (za běhu). | Při načítání aplikace (dopředu). |
| Změna stavu | Pomalá, nepředvídatelná. | Extrémně rychlá. |
| Zátěž CPU | Vysoká během renderování. | Minimální během renderování. |
| Plynulost | Možné záškuby při změnách. | Naprosto plynulý průběh. |
—
Zajímavost: Pro vývojáře je správa PSO náročná, protože i malá změna (např. zapnutí průhlednosti u jednoho objektu) vyžaduje vytvoření úplně nového PSO objektu. Proto jich moderní AAA hry mají v paměti tisíce.
Související: Vulkan, GPU, C++, Adobe Photoshop