Sdílet prostřednictvím


Konfigurace funkcí prolnutí

Operace prolnutí se provádějí na každém výstupu pixelového shaderu (hodnota RGBA), než je výstupní hodnota zapsána do cílového vykreslení. Pokud je povoleno vícevzorkování, prolnutí se provádí na každý vzorek; jinak se prolnutí provádí na jednotlivých pixelech.

Vytvořte stav míchání

Stav směsi je kolekce stavů sloužících k řízení mixování. Tyto stavy (definované v D3D11_BLEND_DESC1) slouží k vytvoření objektu stavu blend voláním ID3D11Device1::CreateBlendState1.

Tady je například velmi jednoduchý příklad vytvoření stavu blend-state, který zakáže alfa blending a nepoužívá žádné maskování pixelů jednotlivých součástí.

ID3D11BlendState1* g_pBlendStateNoBlend = NULL;

D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);

Tento příklad je podobný HLSLWithoutFX10 Sample.

Vytvoření vazby stavu blendu

Po vytvoření objektu blend-state vytvořte vazbu objektu blend-state do výstupní fáze fúze voláním ID3D11DeviceContext::OMSetBlendState.

float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask   = 0xffffffff;

pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);

Toto rozhraní API má tři parametry: objekt blend-state, faktor blendu se čtyřmi součástmi a ukázkovou masku. Můžete předat NULL pro objekt stavu blendu určit výchozí stav blendu nebo předat objekt stavu blendu. Pokud jste vytvořili objekt stavu blendu s D3D11_BLEND_BLEND_FACTOR nebo D3D11_BLEND_INV_BLEND_FACTOR, můžete předat faktor blendu pro modulaci hodnot pixelového shaderu, cíle vykreslení nebo obojího. Pokud jste nevytvořili objekt stavu blendu s D3D11_BLEND_BLEND_FACTOR nebo D3D11_BLEND_INV_BLEND_FACTOR, můžete stále předat nenulový faktor blendu, ale fáze míchání ho nepoužije; modul runtime ukládá faktor blendu a později můžete zavolat ID3D11DeviceContext::OMGetBlendState pro načtení faktoru blendu. Pokud předáte NULL, modul runtime použije nebo uloží míru míchání, která se rovná {1, 1, 1, 1}. Ukázková maska je uživatelem definovaná maska, která určuje, jak vzorkovat existující vykreslovací cíl před jeho aktualizací. Výchozí maska vzorkování je 0xffffffff, která určuje vzorkování bodů.

Ve většině schémat ukládání do vyrovnávací paměti je pixel nejblíže fotoaparátu ten, který se nakreslí. Při nastavenístavu hloubkového vzorníku může být DepthFunc libovolným členem D3D11_DEPTH_STENCIL_DESC typu D3D11_COMPARISON_FUNC. Normálně byste chtěli, aby DepthFunc byl D3D11_COMPARISON_LESS, takže pixely nejbližší ke kameře přepíší pixely za nimi. V závislosti na potřebách vaší aplikace se ale k hloubkové zkoušce může použít jakákoli jiná funkce porovnání.

Pokročilá témata blendingu

Alfa-To-Coverage

Alfa na pokrytí je vícevzorkovací technika, která je nejužitečnější pro situace, jako je husté listí, kde existuje několik překrývajících se mnohoúhelníků, které používají alfa průhlednost k definování okrajů na povrchu.

Pomocí člena AlphaToCoverageEnable v D3D11_BLEND_DESC1 nebo D3D11_BLEND_DESC můžete přepnout, zda běhové prostředí převede komponentu .a (alfa) výstupního registru SV_Target0 z pixelového shaderu na n-krokovou pokrývací masku (s n-vzorkovým RenderTarget). Modul runtime provádí operaci A této masky s typickým pokrytím vzorku pro pixel v primitivním (kromě ukázkové masky), aby bylo možné určit, které vzorky se mají aktualizovat ve všech aktivních RenderTargets.

Pokud pixelový shader vydá SV_Coverage, modul runtime zakáže alfa-krytí.

Poznámka

Ve vícevzorkování modul runtime sdílí pouze jedno pokrytí pro všechny RenderTargets. Skutečnost, že modul runtime čte a převede hodnotu .a z výstupu SV_Target0 na pokrytí, když AlphaToCoverageEnable je PRAVDA, nezmění hodnotu .a, která přejde do blenderu na RenderTarget 0 (pokud se tam nastaví RenderTarget). Obecně platí, že pokud povolíte alfa-to-coverage, nemáte vliv na to, jak všechny výstupy barev z pixelových shaderů pracují s RenderTargetprostřednictvím fáze fúzace výstupu s tím rozdílem, že modul runtime provádí A operace masky pokrytí s maskou pokrytí alfa-to-coverage. Alfa-to-coverage funguje nezávisle na tom, zda může modul runtime míchat RenderTarget nebo zda používáte míchání na RenderTarget.

 

Grafický hardware přesně nespecifikuje, jak přesně převádí pixel shader SV_Target0.a (alfa) na masku pokrytí, s tím rozdílem, že alfa z 0 (nebo méně) musí mapovat na žádné pokrytí a alfa z 1 (nebo vyšší) musí mapovat na úplné pokrytí (před tím, než modul runtime provede operaci AND se skutečným primitivním pokrytím). Jak alfa přechází od 0 do 1, výsledné pokrytí by se mělo obecně zvyšovat monotonicky. Hardware však může provádět diterování oblastí, aby poskytoval lepší kvantování alfa hodnot za cenu prostorového rozlišení a šumu. Alfa hodnota NaN (not-a-number, ne číslo) vede k tomu, že maska pokrytí má hodnotu nula (žádné pokrytí).

Alfa-to-pokrytí se také tradičně používá pro metodu postupné průhlednosti nebo pro definování podrobných siluet jinak neprůhledných spritů.

Míchání výstupů pixelového shaderu

Tato funkce umožňuje spojení výstupů pixelového shaderu používat současně jako vstupní zdroje pro operaci míchání s jediným renderovacím cílem ve slotu 0.

Tento příklad vezme dva výsledky a kombinuje je v jednom postupu, přičemž jeden sloučí do cíle násobením a druhý přičtením.

SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;

Tento příklad nakonfiguruje výstup shaderu prvního pixelu jako zdrojovou barvu a druhý výstup jako faktor mixu jednotlivých komponent.

SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;

Tento příklad ukazuje, jak musí faktory míchání odpovídat přemapováním shaderu.

SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
                          // RenderTarget slot 0 to .ra

Společně faktory směsi a kód shaderu naznačují, že pixel shader je nutný k výstupu alespoň o0.r a o1.a. Další výstupní komponenty mohou být výstupem shaderu, ale budou ignorovány, méně komponent by vytvořilo nedefinované výsledky.

Output-Merger fáze

fáze kanálu (Direct3D 10)