Polopatě - rendering 3D scény (a jak to přibližně funguje) | Kapitola 5
Seznam kapitol
Pokud Vám z Geometry, Pixel, Vertex shaderů, textur a jednotek ROP jde hlava kolem, nezoufejte, v následujícím bloku se pokusím (s pomocí jednoho automobilového příkladu) přiblížit, jak funguje moderní grafická karta (navíc DirectX 10).
Pixel shadery, zjednodušeně řečeno, pokrývají "kostru" našeho virtuálního auta odpovídajícími materiály - včetně stanovení vlastností těchto materiálů (jako jsou druhy textur a jejich umístění, míra průhlednosti, použité efekty...).
Pixel Shadery jsou vyvolávané předcházející fázi rasterizace, aby vypočítaly hodnotu každého elementárního bodu obrazu (pixelu) všech dále zpracovávaných elementárních plošek. Pixel shadery ovládají bohatý repertoár stínovacích funkcí (Per Pixel Lighting) a různých "post-processing" efektů.
Pixel shader je program, který podle zadaného "receptu" kombinuje vstupní konstanty, textury, interpolované nebo přímé vertexové hodnoty (bere v úvahu umístění, směr, osvětlení, barvu...) a další data za účelem získání konečné hodnoty každého pixelu každé elementární plošky (výpočet pro daný pixel probíhat v několika "kolech"). Výsledkem práce Pixel shaderů jsou "plně kvalifikované" pixely s komponentními údaji (jedním z těchto údajů může být například průhlednost - jinak bychom nemohli vytvářet mlhu oheň ani sklo).
Pixel shadery jsou dnes tak natolik pokročilé, že dokáží vytvářet celou řadu efektů které zle "nanést" na každou elementární plošku. NVIDIA v jednom známém demu předváděla, jak je možné pomocí pixel shaderů (ovládaných posuvníkem) plynule měnit "stáří" auta - přičemž výchozí geometrický model zůstával stále stejný.
Další častou aplikaci Pixel shaderů je tzv. per-pixel displacement mapping, takové zpracování pixelů v ploše, které (jinak ploché) textuře poskytují určitou 3D strukturu povrchu (tento proces spočívá ve spojení původní textury s dodatečnou "výškovou texturou" která určuje jak výšku každého bodu textury).
Displacement mapping - dvě cesty
Vše záleží na měřítku nerovností - zatímco vlny v oceánu se vytvářejí geometrickým způsobem - tzn. ve Vertex Shaderech, mapování struktury povrchu (np. silnice nebo zdí) je dnes s důvěrou předáváno Pixel Shaderům.
Níže vidíte dva typické příklady per-pixelového mapování struktury povrchu:
- mapování detailů zdí a nerovnosti prostředí:
Všimněte si že levá hrana zdi v ohybu je zcela rovná,
per-pixel mapování probíhá jen v rámci dané textury!
- nebo jemných detailů postav a prostředí (v příkladu níže - obličej a detaily brnění), které pak není třeba vytvářet na úrovni geometrie:
Quake 4 používá "displacement mapping" jako svůj základní stavební prvek...
Pro současnou a nejbližší generaci 3D her je to právě výkon Pixel Shaderů, tím rozhodujícím prvkem ovlivňujícím celkovou "svižnost" 3D renderingu. Bez práce Pixel Shaderů by byl voják v Quake 4 nepříliš pohlednou "3D loutkou".