Grafická pipeline: jak se tvoří obraz II
23.2.2015, Pavel Šantrůček, článek
Minule jsme si ukázali, jak nám grafická pipeline vůbec vzniká. Naší poslední zastávkou byl KMD (Kernel Mode Driver) a dnes se porozhlédneme, jak se to vlastně všechno v grafické kartě umele tak, abychom scénu z naší hry uviděli na monitoru počítače.
Kapitoly článku:
- Grafická pipeline: jak se tvoří obraz II
- Input Assembler, Vertex Shader, Tessellation, Geometry Shader, Stream Output
- Rasterizace a Rasterizer
- Pixel Shader a Output Merger
Input Assembler (IA)
První naší zastávkou je tedy Input Assembler, který je také první a fixní (neprogramovatelnou) jednotkou tohoto potrubí. IA je odpovědný za načítání geometrických dat z paměti GPU (Vertex Buffer) a následné sestavování primitives (trojúhelníků) v pomyslném 3D prostoru grafické karty. Nemá cenu jít do větších detailů, tohle nám bude v tuto chvíli stačit. Trojúhelník definovaný svými vertexy je v 3D prostoru umístěn a my tedy můžeme letět dál.
Vertex Shader (VS)
Vertex shader je první programovatelnou jednotkou grafické karty. Zde se zpracovávají všechny vertexy vytvořené IA. Pomocí VS můžeme s vertexy programově manipulovat (transformovat). Pokud jste někdy viděli vlnící se hladinu moře v některých hrách, tak právě toto vlnění je realizováno pomocí VS, který aplikuje transformace na vertexy modelu hladiny moře. Podobným příkladem může být také pohupující se tráva ve větru.
Tessellation (TS)
(Hull shader, Tessellator, Domain shader)
Ačkoliv se jedná o tři samostatné zastávky v potrubí, my se o nich budeme bavit jako o jediné fázi s názvem „Teselace“. Už jsme si řekli, že jedinou funkcí VS je manipulace s vertexy. Vstupním parametrem funkce VS je jeden vertex a výstupním musí být opět pouze jediný vertex. Co kdybychom ale chtěli také nějaký ten nový vertex do modelu objektu přidat? Odpovědí je právě teselace. Úkolem teselace je rozdělit jednoduchý geometrický tvar do menších částí, což má za následek celkové zvýšení detailu vykreslovaného objektu, protože se jeho model bude skládat z více vertexů a polygonů.
Důvod této funkce je vcelku prostý, nové vertexy jsou vytvářeny až v pipeline grafické karty. Pokud by takto detailní model (s tak velkým množstvím vertexů) vznikl již při návrhu hry, musel by se o všechny tyto vertexy postarat i samotný procesor, a jak už víme z minulého článku, ten už má i tak práce až nad hlavu.
Určitě si říkáte, že tahle funkce vypadá skvěle a rádi byste viděli ve svých hrách opravdu detailní modely 3D objektů, ale nenechte se mýlit, vše něco stojí. V případě teselace se musí postupovat opravdu s mírou, protože sice dostanete krásný model tvořený mnoha tisíci trojúhelníků, ale nesmíte zapomenout na to, že se pak o tyto nové trojúhelníky grafická karta musí nějak postarat v procesu rasterizace a antialiasingu (MSAA)! Mohlo by se také stát to, že by se ti naši „vyteselovaní krasavci“ ve hře ploužili šnečím krokem.
Teselace je nepovinnou fází potrubí, takže teselovat se může, nebo také vůbec nemusí (vše záleží na hře). Teselace je snad objasněna a my poletíme dále.
Geometry Shader (GS)
Tato zastávka je opět volitelná a plně programovatelná. Pokud GS použit je, pracuje s kompletním primitivním tvarem jako trojúhelník tak, že jako vstupní parametry používá jeho 3 vertexy. Výsledkem manipulace GS pak může být na výstupu shaderu vertexů více, méně, nebo také vůbec žádný. Operacemi GS tedy mohou nové tvary vznikat (složitější nebo jednodušší), nebo může původní tvar (v našem případě trojúhelník) úplně zaniknout.
Příklad: Máme-li trojúhelník definovaný třemi vertexy a jeden z nich odstraníme, trojúhelník se promění na Line. Odstraníme-li dva vertexy, dostaneme Point a odstraníme-li všechny vertexy, nezbude nám nic a trojúhelník zanikne.
GS je také poslední zastávkou v potrubí, která se věnuje geometrii objektů. Pokud je práce GS hotova, je hotový i geometrický model a všechny vertexy objektů jsou ve 3D prostoru tam, kde být mají.
Stream Output (SO)
Jedná se o fixní jednotku napojenou na GS, jejíž úloha pro nás není sice nějak významná, ale je dobré alespoň něco málo o ní vědět. Jak již víme, výstupem GS jsou finálně umístěné vertexy. Pomocí této jednotky můžeme přesměrovat tyto hotové vertexy zpět na začátek pipeline a provádět na nich opětovné manipulace v dalších průchodech. Kdo používá částicové efekty (Particles), už má tedy jasno, kde se berou, jak vznikají a také jak zanikají. No, a nám ostatním to může být jaksi šumák.
Nemá význam se o SO zajímat nějak detailněji, snad zmíníme ještě to, že se jedná o zastávku nepovinnou, takže pojďme dále k procesu, který nás zajímá asi nejvíce a kde se bude z naší grafické karty opravdu hodně kouřit. Ubereme výšku, protože tady se bude rasterizovat a my bychom na to rádi viděli lépe.