Pravidla rasterizace
Pravidla rasterizace definují, jak se vektorová data mapují na rastrová data. Rastrová data se přichytí k celočíselnému umístění, která se pak ořezají (aby se nakreslil minimální počet pixelů) a atributy podle pixelů se před předáním do shaderu pixelů interpolují (z atributů vrcholů).
Existuje několik typů pravidel, která závisí na typu primitivního mapování, a také na tom, jestli data používají vícevzorkování k omezení aliasů. Následující ilustrace ukazují, jak se řeší rohové případy.
- pravidla rasterizace trojúhelníku (bez vícevzorkování)
- pravidla rasterizace řádků (aliasovaná, bez vícevzorkování)
- pravidla rasterizace čar (antialiased, bez vícevzorkování)
- pravidla rasterizace bodu (bez vícevzorkování)
-
pravidla rasterizace s více razítky
- podpora hardwaru
- centroid vzorkování atributů při
- odvozené výpočty při vícevzorkování
- související témata
Pravidla rastrového trojúhelníku (bez vícevzorkování)
Nakreslený obrazový střed, který spadá do trojúhelníku; Pixel se předpokládá, že je uvnitř, pokud předá levé horní pravidlo. Levé horní pravidlo je, že střed pixelů je definován tak, aby leží uvnitř trojúhelníku, pokud leží na horním okraji nebo na levém okraji trojúhelníku.
Kde:
- Horní hrana je hrana, která je přesně vodorovná a je nad ostatními hrany.
- Levý okraj je hrana, která není přesně vodorovná a je na levé straně trojúhelníku. Trojúhelník může mít jeden nebo dva levé okraje.
Levé horní pravidlo zajišťuje, aby sousední trojúhelníky byly nakresleny jednou.
Tento obrázek ukazuje příklady pixelů, které jsou nakreslené, protože buď leží uvnitř trojúhelníku, nebo následují levé horní pravidlo.
trojúhelníku v levém horním rohu
Světle a tmavě šedý kryt pixelů je zobrazuje jako skupiny pixelů, které označují, který trojúhelník jsou uvnitř.
Pravidla rasterizace řádků (aliasovaná, bez vícevzorkování)
Pravidla rastrování čar používají testovací oblast kosočtverce k určení, zda čára pokrývá pixel. U čar x-major (čáry s -1 <= sklon <= +1) zahrnuje testovací oblast kosočtverce (zobrazená plná) levý dolní okraj, pravý dolní okraj a dolní roh; kosočtverec vyloučí (zobrazený tečkovaný) levý horní okraj, pravý horní okraj, horní kabel, levý roh a pravý roh. Hlavní čára y je jakákoli čára, která není čárou x-major; testovací kosočtverec je stejný, jak je popsáno pro čáru x-major s výjimkou pravého rohu.
Vzhledem k oblasti kosočtverce pokrývá čáru pixel, pokud čára opustí testovací oblast kosočtverce pixelu při pohybu podél čáry od začátku směrem ke konci. Pruh čáry se chová stejně, jako se nakreslí jako posloupnost čar.
Následující obrázek ukazuje několik příkladů.
Pravidla rasterizace řádků (antialiased, bez vícevzorkování)
Antialiased čára je rasterizovaná, jako by to byl obdélník (s šířkou = 1). Obdélník protíná s cílem vykreslení, který vytváří hodnoty pokrytí podle pixelů, které jsou vynásobeny na pixel shader výstupní alfa komponenty. Při kreslení čar na vícevzorkovém cíli vykreslení neexistuje žádný antialiasing.
Je považováno za to, že neexistuje jediný "nejlepší" způsob, jak provádět vykreslování čar antialiased. Direct3D 10 přijímá jako vodítko metodu zobrazenou na následujícím obrázku. Tato metoda byla odvozena empiricky a vykazuje řadu vizuálních vlastností, které se považují za žádoucí. Hardware nemusí přesně odpovídat tomuto algoritmu; testy proti tomuto odkazu mají "přiměřené" tolerance, které jsou řízeny některými níže uvedenými zásadami, což umožňuje různé implementace hardwaru a velikosti jádra filtru. Žádná z této flexibility není povolena při implementaci hardwaru, ale prostřednictvím Direct3D 10 je možné komunikovat s aplikacemi, mimo pouhé kreslení čar a sledování/měření jejich vzhledu.
Tento algoritmus generuje relativně hladké čáry s rovnoměrnou intenzitou s minimálními oříznutými hranami nebo spletením. Moire patterning for close lines is minimald. Existuje dobré pokrytí pro spojení mezi segmenty čar umístěnými na konci. Jádro filtru je rozumným kompromisem mezi rozmazaným okrajem a změnami intenzity způsobené opravami gama. Hodnota pokrytí se vynásobí na pixel shader o0.a (srcAlpha) podle následujícího vzorce ve fázi fúze výstupu: srcColor * srcAlpha + destColor * (1-srcAlpha).
Pravidla rasterizace bodů (bez vícevzorkování)
Bod se interpretuje, jako by se skládají ze dvou trojúhelníků ve vzoru Z, které používají pravidla rastrování trojúhelníku. Souřadnice identifikuje střed jednoho pixelového širokého čtverce. Pro body neexistuje žádné odpočítání.
Následující obrázek ukazuje několik příkladů.
bodové rasterizace
Pravidla rasterizace multisample anti-aliasing
Multisample antialiasing (MSAA) snižuje aliasy geometrie pomocí pixelů pokrytí a hloubkové testy vzorníku na několika místech dílčích vzorků. Za účelem zlepšení výkonu se výpočty na pixely provádějí jednou pro každý pokrytý pixel sdílením výstupů shaderu mezi pokrytými dílčími pixely. Antialiasing s více razítky nezmenšuje aliasy povrchu. Ukázková umístění a funkce obnovení jsou závislé na implementaci hardwaru.
Následující obrázek ukazuje několik příkladů.
Počet ukázkových umístění závisí na režimu s víceamply. Atributy vrcholů jsou interpolované v pixelových středech, protože se vyvolá shader pixelů (to se stává extrapolací, pokud není střed pokryt). Atributy lze v pixelovém shaderu označit jako centroid vzorkované, což způsobí interpolaci atributu v průsečíku oblasti pixelu a primitivního pixelu. Shader pixelů se spouští pro každou oblast 2x2 pixelů, aby podporoval odvozené výpočty (které používají rozdíly x a y). To znamená, že vyvolání shaderu nastane více, než je zobrazeno k vyplnění minimálního quanta 2x2 (který je nezávislý na vícevzorkování). Výsledek shaderu se zapíše pro každý zahrnutý vzorek, který projde testem hloubky vzorku.
Pravidla rasterizace pro primitiva jsou obecně nezměněna vícevzorkovými antialiasingy, s výjimkou:
U trojúhelníku se test pokrytí provádí pro každé místo vzorku (ne pro střed pixelů). Pokud je pokryto více než jedno ukázkové umístění, spustí se shader pixelů jednou s atributy interpolovanými ve středu pixelu. Výsledek se uloží (replikuje) pro každé pokryté umístění vzorku v pixelu, které projde testem hloubky nebo vzorníku.
Čára se považuje za obdélník tvořený dvěma trojúhelníky s šířkou čáry 1,4.
Pro bod se provede test pokrytí pro každé místo vzorku (ne pro střed pixelu).
Mnoho formátů podporuje vícevzorkování (viz Hardwarová podpora pro formáty Direct3D 10), některé formáty je možné přeložit (ResolveSubresource; což převzorkuje vícevzorkovaný formát na velikost vzorku 1). Vícevzorkové formáty lze použít v cílech vykreslování, které je možné číst zpět do shaderů pomocí načtení, protože pro jednotlivé vzorky, ke kterým přistupuje shader, není vyžadován žádný překlad. Formáty hloubky nejsou podporovány pro vícevzorkový prostředek, proto jsou formáty hloubky omezeny pouze na cíle vykreslení.
Formáty bez typů (R8G8B8A8_TYPELESS například) podporují vícevzorkování, které umožňují zobrazení prostředků interpretovat data různými způsoby. Můžete například vytvořit vícevzorkový prostředek pomocí R8G8B8A8_TYPELESS, vykreslit ho pomocí prostředku zobrazení cíle vykreslení s formátem R8G8B8A8_UINT a pak přeložit obsah na jiný prostředek s R8G8B8A8_UNORM datovým formátem.
Podpora hardwaru
Rozhraní API hlásí podporu hardwaru pro vícevzorkování prostřednictvím počtu úrovní kvality. Například úroveň kvality 0 znamená, že hardware nepodporuje vícevzorkování (na konkrétní úrovni formátu a kvality). Hodnota 3 pro úrovně kvality znamená, že hardware podporuje tři různá rozložení vzorků a/nebo řeší algoritmy. Můžete také předpokládat následující:
- Jakýkoli formát, který podporuje vícevzorkování, podporuje stejný počet úrovní kvality pro každý formát v dané rodině.
- Každý formát, který podporuje vícevzorkování, a má také _UNORM, _SRGB, _SNORM nebo _FLOAT formáty, podporuje překlad.
Centroid vzorkování atributů při antialiasingu multisample
Ve výchozím nastavení jsou atributy vrcholů interpolovány do středu pixelů během antialiasingu s víceamplemi; pokud není střed pixelů pokrytý, atributy se extrapolují na střed pixelu. Pokud vstup shaderu pixelů, který obsahuje sémantický centroid (za předpokladu, že pixel není plně pokrytý), bude vzorek vzorek někde uvnitř pokryté oblasti pixelu, případně na jednom z pokrytých míst vzorku. Před výpočetem centroidu se použije vzorková maska (určená stavem rasterizátoru). Proto se vzorek, který je maskovaný, nepoužije jako centroidové umístění.
Referenční rasterizátor zvolí ukázkové umístění pro vzorkování centroidů podobné tomuto:
- Ukázková maska umožňuje všechny vzorky. Střed pixelů použijte, pokud je pixel pokrytý nebo pokud nejsou pokryty žádné vzorky. V opačném případě je vybrán první pokrytý vzorek, počínaje středem pixelu a pohybem směrem ven.
- Maska ukázky vypne všechny vzorky, ale jednu (běžný scénář). Aplikace může implementovat supervzorkování multipassu tak, že cyklicky prochází hodnoty jednobitové masky vzorku a znovu vykresluje scénu pro každou ukázku pomocí vzorkování centroidu. To by vyžadovalo, aby aplikace upravila deriváty tak, aby pro vyšší hustotu vzorkování textury vybrali správně podrobnější mips textury.
Odvozené výpočty při vícevzorkování
Shadery pixelů se vždy spouští pomocí minimální oblasti 2x2 pixelů pro podporu odvozených výpočtů, které se vypočítají tak, že se mezi daty ze sousedních pixelů přepočítávají rozdíly (což předpokládá, že data v jednotlivých pixelech byla vzorkována vodorovně nebo svisle). To nemá vliv na vícevzorkování.
Pokud jsou deriváty požadovány u atributu, který byl vzorek centroid, výpočet hardwaru není upraven, což může způsobit nepřesné deriváty. Shader bude očekávat vektor jednotky v prostoru cíle vykreslení, ale může získat vektor bez jednotek s ohledem na nějaký jiný vektorový prostor. Proto je odpovědností aplikace, aby při vyžádání derivátů z atributů, které jsou vzorek centroidu, projevila opatrnost. Ve skutečnosti se doporučuje nekombinovat deriváty a centroidové vzorkování. Centroidové vzorkování může být užitečné v situacích, kdy je důležité, aby interpolované atributy primitiv nebyly extrapolovány, ale to se týká kompromisů, jako jsou atributy, které se zdá, že přeskočí primitivní hrana přes pixel (místo neustálé změny) nebo deriváty, které nelze použít operace vzorkování textury, které odvozují LOD.
Související témata