Geometry shader, DirectX 10
Kapitoly článků
Je totiž ten pravý čas doplnit si další díl skládačky s názvem DirectX 10. V této verzi zažije své stylové antré nový typ shaderů: „geometrické shadery“. Ty provádějí primitivní operace s vrcholy, díky čemuž dokáží, narozdíl od vertex shaderů, vytvářet složitější objekty z jednoduchého vstupu. Kupříkladu na vstupu dostane geometry shader instrukci, vytvoří první bod objektu, ten „expanduje“ na přímku, přímku na trojúhelník a tak dále, až máte třeba nějaký lomený jehlan. Na vstupu tedy může být jednoduchá informace/objekt, na výstupu něco podstatně složitějšího, z čehož plyne i to, že padá limitace jednoho jediného vertexu na vstupu a stejného jediného (byť „nějak zpracovaného“) vertexu na výstupu klasických vertex shaderů. Svojí povahou tak geometry shader výpočty spadají někam mezi pixel a vertex shadery. Na stávající architektuře DirectX 9 se pak používají značně neelegantním způsobem, kdy jsou nejprve vstupní údaje spojeny do větších objektů (trojúhelníky, úsečky, pásy, atd.), aby pak mohly být předány k postupnému zpracování úzce zaměřeným vertex shaderům (které si s nimi bez této úpravy neporadí) k prvnímu kolu výpočtů. Jako druhé kolo následuje zpracování v pixel shaderech, kterým zase musí být primitiva rozsekána na jednotlivé fragmenty, jinak by si s tím pixel shadery neporadily. Na výstupu z geometry shaderu pak máte nějaký (otexturovaný) objekt, který jde do rasterizeru, dále pak pixel shaderu a nakonec na výstup, kde se vše poskládá dohromady.
Asi si teď říkáte, jak se s tímto stávající DirectX 9 architektura vypořádá v budoucnu. Inu, s výhledem na odhad náročnosti 3D scény v budoucích hrách, špatně. Na geometry shader výpočty „padne“ hned několik shader jednotek obou stávajících typů. Naproti tomu v R600 a DirectX 10 generaci bude tento problém „přetěžování“ shaderů značně eliminován, vzhledem k tomu (již jen připomínám), že shadery budou unifikované a o optimální přerozdělování shaderových výpočtů (bez ohledu na jejich povahu) se bude starat Thread Arbiter.
Efektivita DirectX
Ale vraťme se na chvíli od hardwarové vrstvy k softwarové. Jedna z věcí, které ATI ve své prezentaci zmiňuje, je spotřeba času na činnosti přímo neprodukující výpočty 3D grafiky. Stávající DirectX 9 při renderingu scény v jistých momentech neprovádějí žádné přímé výpočty, ale pouze „doprovodné aktivity“. Mezi ně patří například momenty, kdy API (aplikační rozhraní, tedy např. Direct3D) přebírá požadavky od samotné hry, momenty, kdy je od API přebírá ovladač grafické karty atd. V DirectX 9 je každá z těchto činností prováděna samostatně a tudíž si vyžádá vždy nějaký ten čas navíc. To je zkrátka realita, není to bug, je to vlastnost, dalo by se zmínit nesmrtelný citát. Ale i když je to neoddělitelná vlastnost, neznamená to, že by se nedala vylepšit a tyto „hluché“ stavy opět o něco zkrátit.
DirectX 10 ve spojení s unifikovanými shadery celou tuto činnost zefektivní a hned si povíme jak (již tato věta to ostatně napovídá). Hluchá místa máte prakticky mezi všemi kroky výpočtů. Někde jsou takřka zanedbatelná, jinde docela markantní. DirectX 10 je bude eliminovat jednoduše. Snížením počtů míst, kde by mohl tento problém nastat. Náš vzorový příklad je jasný: geometry shader výpočty. Doposud se prováděly pomocí několika kroků při výpočtech na pixel i vertex shader jednotkách. Nyní je nahradí elegantnost unifikovaných shaderů a Thread Arbiteru. Sníží se tak počet „průchodů“ skrze jednotlivé části renderovací pipeline a tím i počet „hluchých míst“. ATI udává, že v DirectX 9 bylo (vlastně ještě je :-) „hlucho“ ve 40 % času. Pro DirectX 10 to vidí na 20 %.
Možná si teď říkáte, „skvělé, máme navíc 20 % výkonu“. Není tomu tak. Tento ušetřený prostor neznamená navýšení rychlosti výpočtů, nýbrž poskytne herním vývojářům dalších 20 % výpočetního času na zvýšení komplexnosti výpočtů (tedy například k o 20 % detailnějším modelům objektů nebo zvýšení počtu objektů ve scéně). A neplyne z toho jen šance na renderování více „nepřátel v Doomu“, ale také třeba na počítání fyziky více objektů ve scéně, pokud daná grafická karta bude určena k počítání fyzikálních výpočtů.
Další změny v DirectX 10
Vyšší efektivity desítkové verze se týká i několik dalších optimalizací, pro změnu právě v softwarové vrstvě tohoto API. DirectX 10 si budou uchovávat tzv. „state snapshots“ neboli „náhledy stavů“, myšleno v obecném slova smyslu. K tomu přibude dynamická indexace uvnitř shaderů. Náhledy stavů mají za úkol redukovat počet nutných kroků ke zjištění aktuálního stavu daného (elementárního) prvku v renderovacím řetězci. Systém tyto informace nebude muset zjišťovat přímo u zdroje, ale pouze se podívá do náhledu. Indexace shaderů opět zrychluje přístup k nim.
Další novinkou v DirectX 10 bude pohřeb tzv. „capability bits“. Ty doposud sloužily jako informační zdroj o tom, které schopnosti má ten daný grafický akcelerátor, tedy co všechno umí nebo neumí jeho GPU. To bylo pro herní vývojáře doslova noční můrou. Netřeba asi zmiňovat, že z velké části technologií si nVidia a ATI šly vlastní cestou (mimo jiné v návaznosti na to, koho v té či oné době zrovna koupili), přidejme Intel s jeho integrovanými grafikami, rádoby se vrátivší S3, pak třeba také XGI a další a vývojáři aby si pořídili poznámkový blok. DirectX 10 tomuto učiní utrum. Tato verze prostě bude disponovat podporou pro řadu technologií a pokud je dané GPU nebude beze zbytku splňovat, nedostane nálepku „Supports DirectX 10“. Žádné výjimky se nepovolují. Na finální specifikace rozhraní DirectX 10 a v tomto kontextu jeho části Direct3D si počkejme do doby uvedení, stejně tak jako na podporu ze strany výrobců grafických procesorů (tedy ATI a nVidie). Jen pro úplnost si řekněme, že podpora vymožeností přesahujících DirectX 10 specifikace není problémem, výrobci mohou rozšíření klidně implementovat, ale ... jen nám v tom hoši neudělejte moc velký zmatek :-).
Zcela logicky se evoluce dotkne i navýšení parametrů, takže v DirectX 10 povýší třeba počet instrukčních slotů na více než 65 536 (současné grafiky implementují typicky 512), zvýší se značně počet všech možných registrů, textury vzrostou až na 8192×8192 (dokážete si ve spojení s nimi a HDR představit třeba právě zmiňovaný Oblivion?), počet temp registrů roste z 32 na 4 096, počet současně zpracovatelných textur z 16 na 128 atd. Většina navýšení se koná i s ohledem na přidání geometry shaderů do specifikací Shader Modelu 4.0.