Shader Model 5.0, Tesselace, Hull a Domain Shader
Kapitoly článků
Ještě jsme nenapsali, že, zcela pochopitelně, Radeony HD 5800 podporují Shader Model 5.0, který přináší několik novinek (SV_Coverage, Flexible Gather, Coarse Partial Derivatives, Type Conversion Instructions, Bit Manipulation Instructions). Jinak AMD pochopitelně vidí využití nového GPU i ve hrách pro věci jako zpracování a filtrování obrazu, Order Independent Transparency (OIT - efektivní pro věci jako kouř, oheň, vlasy, vodu, sklo), renderování stínů, fyziku, umělou inteligenci i raytracing, pár z těchto věcí v minulosti prezentovali.
Ještě v této souvislosti připomeňme DirectX 11 tesselaci programovatelnou skrze dva nové typy shaderů: hull a domain shadery. Díky nim je přístupná řada (staro)nových implementací jako Catmull-Clark Subdivison, Bezier Patches, N-patches, Displacement Mapping, Adaptive & Continuous Tessellation (Dynamic Level of Detail). Celkově se tak v rámci tesselace můžeme dočkat (záleží na praktických implementacích v herních engine) více polygonů, detailnějších postav, šatů či terénu.
Každopádně protože už v tom možná mohou mnozí mít chaos, podívejme se na celou Direct3D 11 renderovací pipeline na schématu. Tesselace, resp. oba nové typy shaderů pochopitelně přicházejí na řadu hned po vertex shaderech. Zelené čteverečky, tedy oba shadery, jsou plně programovatlené, žluté, tedy tesselátor, je pouze konfigurovatelný a modré jsou (zpravidla?) implementovány jako pevně daná funkcionalita v GPU.
Hull shader má na starosti dvě hlavní věci: (volitelně) konvertovat kontrolní body (které dostává z vertex shaderu) z jedné báze do jiné (například pomocí aproximací Catmull-Clark Subdivision Surfaces (letitý efektivní a rychlý standard) s „Bicubic Patches“ - ty jsou v DirectX 11 novým typem primitiv). Kontrolní body jsou posílány přímo do domain shaderu, obcházejí tedy tesselátor.
Druhou zodpovědností hull shaderu je spočítání vhodných tesselačních faktorů, které jsou poté předány tesselátoru. To se používá pro adaptivní tesselaci, která je tím, co realizuje průběžnou korekci LOD z pohledu postavy ve hře. Tesselační faktory jsou specifické pro každou „hranu patche“, a to v rozsahu 2 až 64, což znamená, že každou hranu lze rozdělit na nejméně dvě, resp. nejvíce 64 trojůhelníkovité nebo čtvercové „patche“.
Než se podíváme na domain shader, ještě pár slov k tesselaci (kterou ATI implementovala poprvé v Radeonu 8500, tehdy ještě bez jakékoli odezvy). Tesselátor přebírá od hull shaderu ony faktory a „sudvididuje patche“ (tedy rozsekává je) na tří a čtyř uhelníková primitiva. Tesselátor pochopitelně nemá přístup ke kontrolním bodům, dělá pouze hrubou mechaickou práci, přemýšlí za něj hull shader, který o tesselaci rozhoduje právě volbou faktorů, další částí je nastavení konfigurace tesselátoru (opět je mu dána zvenčí). Kažopádně vertexy vzniklé tesselací odcházejí z tesselátoru do domain shaderu.
Ten pracuje na parametrových koordinátech „patchů“, pro každý vertex odděleně (i když může přistupovat i k transformovaným kontrolním bodům pro celou „patch“). Zpracovaná data z domain shaderu, tedy vertexy s údaji o pozici a koordinátech textur atd., poté putují do již známého geometry shaderu.
A poznámka na závěr: Microsoft sice implemetoval Catmull-Clark subdivision surfaces, ale implementovat lze i jiné algoritmy a postupy.