Grafická pipeline: jak se vytváří obraz
18.2.2015, Pavel Šantrůček, článek
![Grafická pipeline: jak se vytváří obraz](navstevnost-a-redakce/1/img/website-800.jpg)
Dnes se podíváme na grafickou pipeline tak, aby souvislosti byly co nejvíce srozumitelné i pro čtenáře, kteří se o tuto problematiku dosud nezajímali. Půjde o předzvěst dalších článků o grafických kartách včetně recenzí zajímavých modelů.
Kapitoly článku:
Fáze Draw
Druhou částí herní smyčky je fáze Draw, kde má být scéna nebo objekty scény vykresleny na obrazovce monitoru.
Samotné vykreslování scény není prováděno přímo na obrazovku počítače, ale jsou k tomu zapotřebí nějací pomocníci. V první řadě je to grafická karta, která jako jediná umí komunikovat s monitorem počítače a jak už asi tušíte, je to také nějaké 3D API (Application Programming Interface). Důvod vzniku 3D API je poměrně prostý. Když vývojář vytváří hru, nikdy neví, kdo si jeho hru zakoupí a jakou grafickou kartu ve svém počítači onen uživatel používá. Grafické karty mohou být od různých výrobců a mohou tak používat pro vykreslení scény rozdílné příkazy a kódy. Proto bylo nutné vytvořit mezi samotnou aplikací a grafickou kartou ještě univerzální rozhraní, které by (kromě jiného) na svém vstupu od aplikace převzalo příkazy na vykreslení scény a podle druhu grafické karty by pak tyto příkazy převedlo do jazyka, kterému daná grafická karta rozumí a scénu nakonec zobrazí.
![](graficka-pipeline-jak-se-vytvari-obraz/40014/img/body-0.5B4.jpg)
Pokud se zde budeme bavit o operačním systému Windows, v kterém hrajete hry asi nejčastěji, pak jeho „domácím“ 3D rozhraním je DirectX (resp. Direct3D), o kterém si povíme více v další kapitole, až nad ním budeme přelétat.
Vraťme se zpět k vykreslování naší scény v herní smyčce. Naše počítačová hra (resp. její engine) bude tedy posílat příkazy na vykreslení scény do 3D API v nějakém univerzálním formátu, který je nezávislý na druhu konkrétní grafické karty. Těmto požadavků na vykreslení se říká Draw Calls (požadavky vykreslení) a nebudu jistě daleko od pravdy, když řeknu, že jste o Draw Calls už někdy slyšeli, a to především v souvislosti s Mantle a následně s DirectX12 a Metal.
![](graficka-pipeline-jak-se-vytvari-obraz/40014/img/body-0.97B6.jpg)
Poznámka: Nyní abych vysvětlil, jak Draw Calls vznikají a co obsahují, dopustím se zde kvůli zjednodušení problematiky vědomých chyb, za které se předem omlouvám a doufám, že mě snad odborníci na slovo vzatí neukřižují. Absolutním laikům by to mohlo pomoci v pochopení celého principu kolem Draw Calls.
Pokud chcete vykreslit celou scénu, musí tak být činěno postupně právě pomocí Draw Calls. Obsahuje-li scéna hry mnoho objektů (auto, láhev alkoholu, les, mrtvolu …), bude každý z těchto objektů vykreslován samostatně jedním Draw Call (zjednodušeně řečeno). Tento Draw Call pak obsahuje informace o tvaru (modelu) a umístění objektu ve scéně, použitých texturách, shaderech atd. Bude-li tedy scéna obsahovat 1000 takovýchto objektů (aut, lahví, stromů a mrtvol), bude při vykreslování zapotřebí vytvořit a odeslat ke zpracování na 3D API celkem 1000 Draw Calls. Po odeslání posledního Draw Call objektu scény bude odeslán finální příkaz „Present“, který grafické kartě říká, že všechny požadavky na vykreslení dané scény byly odeslány a že tedy může tuto scénu (snímek) zobrazit na monitoru počítače.
Poznámka: Ve skutečnosti může být jeden objekt scény vykreslován pomocí více než jednoho Draw Call, nebo také několik objektů může být vykresleno společně pomocí jediného.
O každý takový požadavek na vykreslení (Draw Call) se musí samozřejmě 3D API postarat. Může se tedy stát, že v případě opravdu masivního počtu vykreslovacích požadavků bude 3D API (její pipeline) natolik zahlcena, že už nebude schopna přijímat další požadavky a výkon hry (snímková frekvence) rapidně klesne. Pokud se tak stane, vina pak zcela jistě leží na bedrech samotného vývojáře hry, protože nezajistil patřičnou optimalizaci požadavků na vykreslení (Instancing, Draw Calls Batching …).
Když ale tento problém se zahlcováním potrubí velkým množstvím požadavků na vykreslení vznikne, co s tím můžeme vůbec dělat? Popravdě nic moc! My totiž nemáme ani možnost (bez nějakých nástrojů jako jsou profilery) na tento problém vůbec nějak přijít. Pokud ale máme podezření, že tento problém opravdu vznikl, budeme se snažit ve hře nastavit třeba kratší viditelnost objektů nebo objektům snížit detaily (prostě snížit počet nebo složitost objektů). Experimentům se meze nekladou a každá hra je jiná.
Pro naše účely jsme si probrali herní smyčku poměrně dostatečně, takže odlétáme z této zóny a začínáme zase rychle stoupat. Další přeletovou oblastí je potrubí API DirectX, v kterém z okénka vidíme mizet Draw Calls, které tam poslala naše hra.