Direct3D 11 (D3D11) je součást rozhraní pro programování aplikací ( API ) DirectX 11, 11. verze Direct3D , nástupce Direct3D 10/10.1 . Direct3D 11 poskytuje funkce pro operační systém a aplikace pro interakci s ovladači grafické karty . Tyto funkce nejsou vázány na další operační systém v řadě Windows ( Windows 7 ) a jsou dostupné ve Windows Vista . Částečně D3D11 funguje na grafických kartách úrovně Direct3D 9-10.
První náhledové verze se objevily v listopadu 2008. Oficiální finální verze byla vydána 22. října 2009 jako součást Windows 7 . Dne 28. října 2009 bylo DirectX 11 oficiálně dostupné pro Windows Vista a Windows Server 2008 stažením přes Windows Update . [jeden]
D3D11 přidává do renderovacího potrubí 3 další fáze, jejichž účelem je efektivně mozaikovat povrchy.
Potrubí D3D11 zahrnuje tři nové fáze mezi fázemi vertex a geometry shader . Dva z nich jsou programovatelné (stupně stínování trupu a stínování domény) a jeden je konfigurovatelný (stupeň teselace).
Prezentované potrubí pracuje s mřížkami definovanými povrchovými záplatami. Hlavními primitivy D3D11 jsou trojúhelníkové a čtvercové záplaty. Tvar každého políčka je určen počtem kontrolních bodů. Ve vertex shaderu se tyto body postupně transformují, stahují a/nebo morfují.
Shell shader je volán pro každý patch. Jako vstup se používají body přerušení patchů z vertex shaderu. Shell shader má dvě hlavní použití. První (volitelný) je převod bodů přerušení z jedné reprezentace do druhé. Umožňuje vám například implementovat metodu uvedenou v části Aproximace Catmull-Clark Subdivision Surfaces with Bicubic Patches . Po tomto shaderu jsou řídicí body poslány přímo dále a obcházejí tesselátor. Dalším využitím je výpočet vhodného parametru mozaikování, který je následně předán do fáze mozaikování. Tento přístup umožňuje adaptivní teselaci, kterou lze použít v případě úrovní detailů závislých na zobrazení (LOD). Parametr teselace je definován pro každou plochu pole a je v rozsahu od 2 do 64. To znamená, že každou plochu trojúhelníkového (nebo čtvercového) pole lze rozdělit na 2 (nebo maximálně 64) ploch.
Fáze tesselátoru je reprezentována pevnou sadou funkcí (vysoce konfigurovatelných), které používají parametr tessellation k rozdělení záplaty na více trojúhelníků nebo čtveřic. Tesellátor nemá přístup k bodům přerušení – všechna rozhodnutí o rozdělení se dělají na základě parametrů konfigurace a teselace předávaných z shell shaderu. Každý vrchol po fázi mozaikování je předán do doménového shaderu a jsou předány pouze parametrizační souřadnice.
Doménový shader pracuje na parametrizačních souřadnicích patche pro každý vrchol zvlášť, i když je možné přistupovat k transformovaným řídicím bodům pro celý patch. Shader domény odesílá všechny informace o vrcholu (poloha, souřadnice textury atd.) do shaderu geometrie (nebo do fáze oříznutí, pokud není zadán žádný shader geometry). V podstatě vyhodnocuje reprezentaci povrchu v každém bodě. V této fázi lze použít metodu mapování posunů.
Direct3D 11 představuje nový typ shaderu, Compute Shader. Compute shader se nazývá jako běžné pole vláken. Proudy jsou rozděleny do skupin. Každá skupina má 32 kB paměti sdílené mezi vlákny ve skupině. Vlákna ve skupině tak mohou sdílet výsledky a zlepšovat svůj výkon. Vlákna mohou také provádět čtení a zápis s náhodným přístupem ke grafickým zdrojům: textury, pole vertexů, cíle vykreslování. Tyto přístupy do paměti jsou neuspořádané, i když různé instrukce jsou synchronizovány v případě potřeby.
Pixelové (fragmentové) shadery mohou také číst na libovolné adrese, což umožňuje zápis datových struktur, které lze následně použít ve výpočetním shaderu nebo naopak. Stojí za zmínku, že pixel shadery vždy měly náhodný přístup ke čtení prostřednictvím vyhledávání textur.
Výpočetní shadery mohou také provádět operace, jako jsou tabulky součtových oblastí, rychlé Fourierovy transformace mnohem rychleji než dříve používané metody na GPU. V současné době Microsoft zkoumá knihovny, které takové výpočty poskytují. Microsoft věří, že algoritmy, jako je vykreslování A-bufferu a sledování paprsků, lze také efektivně implementovat, ale v tuto chvíli neexistují žádné skutečné důkazy o jejich účinnosti.
Volání výpočetního shaderu nahradí všechny fáze vykreslovacího kanálu. Pomocí jejich výsledků je však možné kombinovat výpočetní shadery a tradiční vykreslování. Například zpracování obrazu po vykreslení pomocí výpočetního shaderu (lze načíst další datové struktury).
D3D10 umožňuje pouze předávání renderovacích příkazů z jednoho vlákna (v současnosti existuje speciální vícevláknový režim, ale kvůli slabému výkonu jej Microsoft nedoporučuje používat). Jak víte, odesílání vizualizačních příkazů prostřednictvím Direct3D vyžaduje použití dalších výpočetních zdrojů CPU . Vzhledem k trendu zvyšování počtu jader CPU se zavádí podpora pro pokročilejší multithreading, aby bylo možné tuto práci distribuovat mezi několik vláken a tím ji efektivněji vyrábět.
Direct3D 11 umožňuje vytvářet seznamy zobrazení z více vláken a spouštět je z hlavního vykreslovacího vlákna. Kromě toho bylo zařízení, které vytváří prostředky, odstraněno z kontextu, který odesílá příkazy vykreslování. To umožňuje vytvářet prostředky asynchronně. Odložené kontexty se používají k vytváření seznamů zobrazení a Okamžitý kontext se používá k předávání příkazů vykreslování do GPU , včetně zpracování seznamů zobrazení vytvořených v odložených kontextech.
Na rozdíl od jiných funkcí je vícevláknové vykreslování v Direct3D 11 implementováno programově prostřednictvím ovladače. Vhodné ovladače D3D10 (možná i D3D9) umožňují vícevláknové vykreslování mnohem efektivněji než dříve. Určitá úroveň multithreadingu bude dostupná i bez nových ovladačů, ale zatím není jasné, jaká omezení v tomto případě budou.
Podpora dynamického linkování shaderů (podobně jako Cg). To vám umožní oddělit světelné a materiálové shadery pro psaní a kompilaci. Pozdní vazba se provádí, když je shader vystaven. Tento přístup je řešením problému kombinatorické exploze v případě různých světelných zdrojů a materiálů (jeho a některé další problémy jsou diskutovány v sekci 7.9 Real-Time Rendering, 3rd Edition )
Byly přidány dva nové komprimované formáty textur. BC6 podporuje široký dynamický rozsah RGB textur pomocí 1 bajtu na texel (místo 6 bajtů pro 6bitové RGB skutečné textury). BC7 podporuje textury RGB nebo RGBA s úzkým dynamickým rozsahem. Používá také 1 byte na texel (jako DXT5/BC3), ale poskytuje výrazně lepší kvalitu než formáty textur D3D10. Oba nové formáty používají více typů bloků – kompresní utilita vybere vhodný typ bloku na základě jeho obsahu.
Formáty kompresních bloků D3D9 a D3D10 jsou založeny na myšlence, že každý blok texelů 4×4 obsahuje všechny své hodnoty v jednom řádku a bity každého texelu kódují pozici v tomto řádku. Například v DXT1/BC1 čára v prostoru RGB představuje dva koncové body RGB a každý texel používá dva bity k označení, která barva je použita ze čtyř bodů podél čáry.
Nové formáty D3D11 podporují typy bloků s jednou, dvěma a dokonce třemi (v případě BC7) barevnými liniemi. Existuje kompromis mezi počtem čar a počtem bodů podél takové čáry, protože každý blok zabírá stejné množství paměti. V zásadě platí, že blok 4×4 se dvěma barevnými liniemi vyžaduje dalších 16 bitů na blok, aby bylo možné určit, který řádek každého texelu s ním byl spojen (v případě tří barevných linií by bylo potřeba ještě více bitů). Pro snížení požadavků na paměť je podporována pouze malá sada možných vzorů barevných čar. Pro každý blok vybere obslužný program pro balení nejlepší možnost z této podmnožiny.
Direct3D 11 má přísnější specifikaci textur. Výsledky dekomprese musí být přesné a filtrování subtexel/submip musí být alespoň 8 bitů přesné.
Direct3D 11 umožňuje používat textury, které mají maximální velikost v rozsahu 8K-16K texelů. Všimněte si, že textura 16K x 16K DXT1/BC1 má 128 MB – málo her bude používat tak velké textury, ale může být vhodná pro techniky, jako je megatextura . Obecně může nyní mít zdroj v D3D11 velikost až 2 GB.
Hardware může volitelně podporovat reálná čísla s pohyblivou řádovou čárkou s dvojitou přesností.
Gamefest 2008 také představoval snímek s mnoha dalšími novými funkcemi, jejichž podrobnosti nebyly vysvětleny:
SlimDX a SharpDX podporují DirectX 11. XNA - ne