Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato část popisuje nastavení oblasti zobrazení, výřezového obdélníku, rastrovacího stavu a vícenásobného vzorkování.
Nastavte oblast zobrazení
Oblast zobrazení mapuje pozice vrcholů (v prostoru výstřižku) na vykreslení cílových pozic. Tento krok škáluje 3D pozice do 2D prostoru. Cíl vykreslení je orientovaný na osy Y směřující dolů; to vyžaduje, aby se souřadnice Y během změny velikosti oblasti zobrazení převrátily. Rozsahy x a y (rozsah hodnot x a y) se navíc škálují tak, aby odpovídaly velikosti oblasti zobrazení podle následujících vzorců:
X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth)
Tutoriál 1 vytvoří viewport 640 × 480 pomocí D3D11_VIEWPORT a voláním ID3D11DeviceContext::RSSetViewports.
D3D11_VIEWPORT vp[1];
vp[0].Width = 640.0f;
vp[0].Height = 480.0f;
vp[0].MinDepth = 0;
vp[0].MaxDepth = 1;
vp[0].TopLeftX = 0;
vp[0].TopLeftY = 0;
g_pd3dContext->RSSetViewports( 1, vp );
Popis oblasti zobrazení určuje velikost oblasti zobrazení, do které se má mapovat hloubka (pomocí MinDepth a MaxDepth) a umístění levého horního okraje oblasti zobrazení. MinDepth musí být menší nebo roven MaxDepth; rozsah pro MinDepth a MaxDepth je mezi 0,0 a 1,0 včetně. Je běžné, že se oblast zobrazení mapuje na cíl vykreslení, ale není to nutné; kromě toho nemusí mít oblast zobrazení stejnou velikost ani pozici jako cíl vykreslení.
Můžete vytvořit pole zobrazení, ale pouze jedno lze použít na primitivní výstup z geometrického shaderu. V jednu chvíli lze aktivní nastavit pouze jeden pohled. Potrubí používá výchozí výřez (a obdélník nůžek, který je popsán v další části) při rasterizaci. Výchozí hodnota je vždy první oblast zobrazení (nebo nůžkový obdélník) v poli. Chcete-li provést primitivní výběr oblasti zobrazení v geometry shader, zadejte ViewportArrayIndex sémantic u příslušné výstupní komponenty GS v deklaraci podpisu výstupu GS.
Maximální počet výřezů (a ořezových obdélníků), které lze svázat s rastrovací fází najednou, je 16 (specifikováno D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).
Nastavení obdélníku nůžek
Nůžkový obdélník vám poskytne další příležitost snížit počet pixelů, které budou odeslány do výstupní fáze fúze. Pixely mimo nůžkový obdélník se zahodí. Velikost nůžkového obdélníku je určena celými čísly. V hodnotové sémantice systémumůže být během rastrování k trojúhelníku aplikován pouze jeden obdélník nůžek, založený na ViewportArrayIndex.
Chcete-li povolit ořezový obdélník, použijte člen ScissorEnable (v rámci D3D11_RASTERIZER_DESC1). Výchozí nůžkový obdélník je prázdný obdélník; to znamená, že všechny hodnoty rektů jsou 0. Jinými slovy, pokud nenastavíte nůžkový obdélník a nůžky jsou povoleny, nebudete odesílat žádné pixely do fáze slučování výstupu. Nejběžnějším nastavením je inicializace střižného obdélníku na velikost zobrazovací oblasti.
Chcete-li nastavit pole nůžkových obdélníků na zařízení, zavolejte ID3D11DeviceContext::RSSetScissorRects s D3D11_RECT.
D3D11_RECT rects[1];
rects[0].left = 0;
rects[0].right = 640;
rects[0].top = 0;
rects[0].bottom = 480;
g_pd3dContext->RSSetScissorRects( 1, rects );
Tato metoda má dva parametry: (1) počet obdélníků v matici a (2) pole obdélníků.
Potrubí během rastrování používá výchozí index ořezávacího obdélníku (výchozí hodnota je obdélník s nulovou velikostí a vypnutým ořezáváním). Chcete-li toto přepsat, specifikujte sémantiku SV_ViewportArrayIndex pro výstupní komponentu GS v deklaraci výstupního podpisu GS. To způsobí, že fáze GS označí tento výstupní prvek GS jako systémem generovaný prvek s touto sémantikou. Rastrová fáze rozpozná tuto sémantiku a použije parametr, s nímž je svázán, jako index nůžkového obdélníku pro přístup k poli nůžkových obdélníků. Nezapomeňte fázi rasterizace informovat, aby používala ořezový obdélník, který definujete povolením hodnoty ScissorEnable v popisu rastrovače před vytvořením rastrového objektu.
Nastavit stav rasterizátoru
Počínaje Rozhraním Direct3D 10 je stav rasterizátoru zapouzdřen v objektu rastrového stavu. Můžete vytvořit až 4096 rastrových stavových objektů, které lze nastavit na zařízení předáním popisovače objektu stavu.
Pomocí ID3D11Device1::CreateRasterizerState1 vytvořte objekt stavu rasterizátoru z popisu rasterizátoru (viz D3D11_RASTERIZER_DESC1).
ID3D11RasterizerState1 * g_pRasterState;
D3D11_RASTERIZER_DESC1 rasterizerState;
rasterizerState.FillMode = D3D11_FILL_SOLID;
rasterizerState.CullMode = D3D11_CULL_FRONT;
rasterizerState.FrontCounterClockwise = true;
rasterizerState.DepthBias = false;
rasterizerState.DepthBiasClamp = 0;
rasterizerState.SlopeScaledDepthBias = 0;
rasterizerState.DepthClipEnable = true;
rasterizerState.ScissorEnable = true;
rasterizerState.MultisampleEnable = false;
rasterizerState.AntialiasedLineEnable = false;
rasterizerState.ForcedSampleCount = 0;
g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );
Tato ukázková sada stavů dosahuje možná nejzákladnějšího nastavení rasterizátoru:
- Režim plné výplně
- Vyřaďte nebo odstraňte zadní strany; předpokládejte pořadí vinutí proti směru hodinových ručiček pro primitiva.
- Vypněte zkreslení hloubky, ale povolte ukládání hloubky do vyrovnávací paměti a povolte nůžkový obdélník.
- Vypnutí vícevzorkování a anti-aliasingu řádků
Kromě toho základní rasterizační operace vždy zahrnují následující: výřez (do zobrazení frustum), perspektivní dělení a měřítko oblasti zobrazení. Po úspěšném vytvoření objektu stavu rasterizátoru ho nastavte na zařízení takto:
g_pd3dContext->RSSetState(g_pRasterState);
Vícevzorkování
Vícevzorkování některých nebo všech částí obrazu ve vyšším rozlišení (následované převzorkováním na původní rozlišení) se používá ke snížení nejviditelnější formy krokování způsobené kreslením hran polygonů. I když vícevzorkování vyžaduje podrozměrné vzorky, moderní GPU implementují vícevzorkování tak, aby pixelový shader běžel jednou na pixel. Tím se dosahuje přijatelný kompromis mezi výkonem (zejména v aplikaci závislé na GPU) a vyhlazováním okrajů konečného obrazu.
Pokud chcete použít vícevzorkování, nastavte pole povolení v popisu rasterizace, vytvořte vícevzorkový cíl vykreslení a buď načtěte cíl vykreslení pomocí shaderu a přeložte vzorky na jednu pixelovou barvu, nebo zavolejte ID3D11DeviceContext::ResolveSubresource k vyřešení ukázek pomocí grafické karty. Nejběžnějším scénářem je nakreslit jeden nebo více vícevzorkovaných cílů vykreslení.
Vícevzorkování je nezávislé na tom, jestli se používá ukázková maska, alfa-pokrytí je povolené, nebo operace vzorníku (které se vždy provádějí pro každý vzorek zvlášť).
Hloubkové testování ovlivňuje vícevzorkování:
- Pokud je povoleno vícevzorkování, je hloubka interpolována pro každý vzorek a test hloubky/vzorníku se provádí pro každý vzorek; výstupní barva z pixelového shaderu je duplikována pro všechny vzorky, které prošly. Pokud pixel shader vypíše hloubku, hodnota hloubky se duplikuje pro všechny vzorky (i když tento scénář ztratí výhodu vícevzorkování).
- Pokud je vícevzorkování zakázané, testování hloubky nebo vzorníku se stále provádí pro jednotlivé vzorky, ale hloubka není interpolovaná pro jednotlivé vzorky.
Pro kombinování vícevzorkového a nesamplového vykreslování v rámci jednoho cíle vykreslení neexistují žádná omezení. Pokud povolíte vícevzorkování a kreslíte do cíle vykreslení bez vícevzorkování, vytvoří se stejný výsledek, jako kdyby vícevzorkování nebylo povoleno; vzorkování se provádí s jedním vzorkem na pixel.
Související témata