Sdílet prostřednictvím


Sémantika

Sémantický je řetězec připojený ke vstupu shaderu nebo výstupu, který předává informace o zamýšleném použití parametru. Sémantika se vyžaduje u všech proměnných předávaných mezi fázemi shaderu. Syntaxe pro přidání sémantické proměnné shaderu se zobrazí zde (syntaxe proměnné (DirectX HLSL)).

Obecně platí, že data předávaná mezi fázemi kanálu jsou zcela obecná a systém není jednoznačně interpretován; libovolná sémantika jsou povolena, které nemají zvláštní význam. Parametry (v Direct3D 10 a novějších), které obsahují tyto speciální sémantika, se označují jako System-Value sémantika.

Sémantika podporovaná v Direct3D 9 a Direct3D 10 a novějších verzích

V Direct3D 9 i Direct3D 10 a novějších verzích se podporují následující typy sémantiky.

Sémantika shaderu vrcholů

Tyto sémantika mají význam při připojení k parametru vertex-shader. Tyto sémantika jsou podporovány v Direct3D 9 i Direct3D 10 a novějších verzích.

Vstup Popis Typ
BINORMAL[n] Binormální float4
BLENDINDICES[n] Indexy blendu uint
BLENDWEIGHT[n] Hmotnosti směsi plout
COLOR[n] Difuzní a specifikární barva float4
NORMAL[n] Normální vektor float4
POSITION[n] Pozice vrcholu v prostoru objektu float4
POSITIONT Transformovaná pozice vrcholu. float4
PSIZE[n] Velikost bodu plout
TANGENT[n] Tangenta float4
TEXCOORD[n] Souřadnice textury float4
Výstup Popis Typ
COLOR[n] Difuzní nebo specifikární barva float4
MLHA Mlha vrcholu plout
POSITION[n] Pozice vrcholu v homogenním prostoru Výpočetní pozice v prostoru obrazovky vydělením (x,y,z) o w. Každý shader vrcholů musí zapsat parametr s touto sémantickou. POZNÁMKA: Tato sémantika je k dispozici v Direct3D 9. Pro Direct3D 10 a novější použijte místo toho SV_Position. float4
PSIZE Velikost bodu plout
TESSFACTOR[n] Faktor Tessellation plout

n je volitelné celé číslo mezi 0 a počtem podporovaných prostředků. Například POSITION0, TEXCOORD1 atd.

Sémantika shaderu pixelů

Tyto sémantika mají význam při připojení ke vstupnímu parametru pixel-shader. Tyto sémantika jsou podporovány v Direct3D 9 i Direct3D 10 a novějších verzích.

Vstup Popis Typ
COLOR[n] Difuzní nebo specifikární barva. float4
TEXCOORD[n] Souřadnice textury float4
VFACE Skalár s plovoucí desetinou čárkou, který označuje primitivu směřující zpět. Záporná hodnota se vrací zpět, zatímco kladná hodnota čelí fotoaparátu.

Poznámka:
Tento sémantický model je k dispozici v Modelu shaderu Direct3D 9 3.0. Pro Direct3D 10 a novější použijte místo toho SV_IsFrontFace.


plout
VPOS Umístění pixelu (x,y) v prostoru obrazovky. Pokud chcete převést shader Direct3D 9 (který používá tento sémantický) na shader Direct3D 10 a novější, podívejte se na Direct3D 9 VPOS a Direct3D 10 SV_Position) float2
Výstup Popis Typ
COLOR[n] Barva výstupu float4
HLOUBKA[n] Hloubka výstupu plout

n je volitelné celé číslo mezi 0 a počtem podporovaných prostředků. Například PSIZE0, COLOR1 atd.

Sémantika COLOR je platná pouze v režimu kompatibility shaderu (to znamená, že při vytváření shaderu pomocí D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).

Sémantika podporovaná pouze pro Direct3D 10 a novější.

Pro Direct3D 10 byly nově zavedeny následující typy sémantiky a nejsou k dispozici pro Direct3D 9.

sémantika System-Value

Sémantika systémových hodnot je pro Direct3D 10 nová. Všechny systémové hodnoty začínají předponou SV_, běžným příkladem je SV_POSITION, který je interpretován rasterizační fází. Systémové hodnoty jsou platné v jiných částech kanálu. Například SV_Position lze zadat jako vstup do shaderu vrcholu a výstupu. Shadery pixelů můžou zapisovat pouze do parametrů s SV_Depth a SV_Target sémantikou systémových hodnot.

Jiné systémové hodnoty (SV_VertexID, SV_InstanceID, SV_IsFrontFace) lze zadat pouze do prvního aktivního shaderu v kanálu, který může interpretovat konkrétní hodnotu; potom musí funkce shaderu předat hodnoty do následných fází.

SV_PrimitiveID je výjimkou tohoto pravidla pouze vstup do prvního aktivního shaderu v kanálu, který může interpretovat konkrétní hodnotu; hardware může poskytnout stejnou hodnotu ID jako vstup do fáze trupu shaderu, fáze shaderu domény a po této fázi, která je první povolenou fází: fáze geometry-shader nebo fáze shaderu pixelů.

Pokud je povolena tessellation, je k dispozici fáze trupu shaderu a fáze shaderu domény. U dané opravy platí stejné PrimitiveID pro vyvolání trupu trupu a všech vyvolání shaderu domény s tessellated. Stejné PrimitiveID se také rozšíří do další aktivní fáze; fáze geometry-shader nebo fáze shaderu pixelů, pokud je povolená.

Pokud geometrický shader vstupy SV_PrimitiveID a protože může výstupem nuly nebo jednoho nebo více primitiv na volání, shader musí programovat vlastní výběr SV_PrimitiveID hodnoty pro každý výstup primitiv, pokud následný pixel shader vstupy SV_PrimtiveID.

Jako další příklad nelze SV_PrimitiveID interpretovat ve fázi vrcholu shaderu, protože vrchol může být členem více primitiv.

Tyto sémantika byla přidána do Direct3D 10; nejsou dostupné v Direct3D 9.

Sémantika systémové hodnoty pro fázi rasterizátoru.

System-Value sémantika Popis Typ
SV_ClipDistance[n] Vystřižte data vzdálenosti. SV_ClipDistance hodnoty se u každého předpokládají, že se jedná o vzdálenost s plovoucí 32 signatou vzdáleností k rovině. Primitivní nastavení vyvolává rastrování pouze na pixelech, pro které jsou interpolované vzdálenosti roviny >= 0. Více rovin klipů lze implementovat současně deklarací více komponent jednoho nebo více prvků vrcholů jako SV_ClipDistance. Kombinované hodnoty vzdálenosti klipů a cull jsou maximálně komponenty D3D#_CLIP_OR_CULL_DISTANCE_COUNT ve většině registrů D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. K dispozici pro všechny shadery ke čtení nebo zápisu do, s výjimkou shaderu vrcholů, který může zapsat hodnotu, ale ne jako vstup.
Atribut klipplanů funguje jako SV_ClipDistance, ale funguje na všech hardwarových úrovni funkcí 9_x a vyšší. Další informace najdete v tématu roviny uživatelských klipů na hardwarovémúrovně 9.
plout
SV_CullDistance[n] Data o vzdálenosti cull. Pokud jsou součástí elementů vrcholů tento popisek, předpokládá se, že se jedná o plovoucí 32 podepsanou vzdálenost k rovině. Primitiva budou zcela zahozena, pokud jsou vzdálenosti roviny pro všechny vrcholy v primitivu < 0. Více rovin cull lze použít současně deklarací více komponent jednoho nebo více prvků vrcholů jako SV_CullDistance. Kombinované hodnoty vzdálenosti klipů a cull jsou maximálně komponenty D3D#_CLIP_OR_CULL_DISTANCE_COUNT ve většině registrů D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. K dispozici pro všechny shadery ke čtení nebo zápisu do, s výjimkou shaderu vrcholů, který může zapsat hodnotu, ale ne jako vstup.
plout
SV_Coverage Maska, která se dá zadat na vstupu, výstupu nebo obou pixelových shaderu.
Pro SV_Coverage v pixelovém shaderu je výstup podporován na ps_4_1 nebo vyšší.
Pro SV_Coverage na shaderu pixelů vyžaduje vstup ps_5_0 nebo vyšší.
uint
SV_Depth Data hloubkové vyrovnávací paměti. Dají se napsat pomocí shaderu pixelů. plout
SV_DepthGreaterEqual V pixel shaderu umožňuje výstup hloubky, pokud je větší nebo rovna hodnotě určené rastrovačem. Umožňuje upravit hloubku bez zakázání počátečního Z. plout
SV_DepthLessEqual V pixel shaderu umožňuje výstup hloubky, pokud je menší nebo roven hodnotě určené rastrovým rastrovačem. Umožňuje upravit hloubku bez zakázání počátečního Z. plout
SV_DispatchThreadID Definuje globální posun vlákna v rámci volání Dispatch na dimenzi skupiny. K dispozici jako vstup pro výpočetní shader. (jen pro čtení) uint3
SV_DomainLocation Definuje umístění na trupu aktuálního bodu domény, který se vyhodnocuje. K dispozici jako vstup pro shader domény. (jen pro čtení) float2|3
SV_GroupID Definuje posun skupiny v rámci volání Dispatch na dimenzi volání dispečera. K dispozici jako vstup pro výpočetní shader. (jen pro čtení) uint3
SV_GroupIndex Poskytuje zploštěný index pro dané vlákno v dané skupině. K dispozici jako vstup pro výpočetní shader. (jen pro čtení) uint
SV_GroupThreadID Definuje posun vlákna ve skupině na dimenzi skupiny. K dispozici jako vstup pro výpočetní shader. (jen pro čtení) uint3
SV_GSInstanceID Definuje instanci shaderu geometrie. K dispozici jako vstup pro shader geometrie. Instance je potřebná, protože shader geometrie lze vyvolat až 32krát na stejné primitivní geometrii. uint
SV_InnerCoverage Představuje podceňované informace o konzervativní rasterizaci (tj. zda je zaručeno pixel-to-be-plně pokryto). Shader pixelů může číst nebo zapisovat.
SV_InsideTessFactor Definuje množství tessellation v rámci povrchu opravy. K dispozici ve shaderu trupu pro psaní a k dispozici ve shaderu domény pro čtení. float|float[2]
SV_InstanceID Identifikátor instance automaticky vygenerovaný modulem runtime (viz Použití hodnot System-Generated (Direct3D 10)). K dispozici pro všechny shadery.
SV_IsFrontFace Určuje, jestli je trojúhelník přední. U řádků a bodů má IsFrontFace hodnotu true. Výjimkou jsou čáry vykreslené z trojúhelníků (režim drátového modelu), které nastaví IsFrontFace stejným způsobem jako rastrování trojúhelníku v plném režimu. Může být zapsán do shaderu geometrie a přečteno shaderem pixelů. Bool
SV_OutputControlPointID Definuje index ID řídicího bodu, na který se pracuje vyvoláním hlavního vstupního bodu shaderu trupu. Může číst pouze shader trupu. uint
SV_Position Pokud je SV_Position deklarován pro vstup do shaderu, může mít zadaný jeden ze dvou režimů interpolace: linearNoPerspective nebo linearNoPerspectiveCentroid, kde druhý způsobuje zadání hodnot xyzw centroid-snaped xyzw při multisample antialiasing. Při použití v shaderu SV_Position popisuje umístění pixelu. K dispozici ve všech shaderech pro získání středu pixelů s posunem 0,5. float4
SV_PrimitiveID Primitivní identifikátor automaticky vygenerovaný modulem runtime (viz Použití hodnot System-Generated (Direct3D 10)). Dají se zapisovat do geometrických nebo pixelových shaderů a číst podle geometrie, pixelu, trupu nebo shaderů domény. uint
SV_RenderTargetArrayIndex Index pole cíle vykreslení Používá se u výstupu shaderu geometrie a označuje řez cílového pole vykreslení, na který bude primitiv vykresleno shaderem pixelů. SV_RenderTargetArrayIndex je platný pouze v případě, že cílem vykreslení je prostředek pole. Tato sémantická se vztahuje pouze na primitivy; pokud má primitiv více než jeden vrchol, použije se hodnota z počátečního vrcholu. Tato hodnota také označuje, který maticový řez zobrazení hloubky nebo vzorníku se používá pro účely čtení a zápisu.
Lze psát ze shaderu geometrie a číst pomocí shaderu pixelů.
Je-li D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer je true, pak SV_RenderTargetArrayIndex se použije na jakýkoli shader, který rasterizátor dodává.
uint
SV_SampleIndex Ukázková data indexu četnosti K dispozici jen pro čtení nebo zápis pomocí shaderu pixelů. uint
SV_StencilRef Představuje aktuální referenční hodnotu vzorníku shaderu pixelů. Dají se zapsat jenom shaderem pixelů. uint
SV_Target[n], kde 0 <= n <= 7 Výstupní hodnota, která bude uložena v cíli vykreslení. Index označuje, do kterého z 8 možných vázaných vykreslovacích cílů se mají zapisovat. Hodnota je k dispozici pro všechny shadery. float[2|3|4]
SV_TessFactor Definuje množství tessellation na každém okraji opravy. K dispozici pro psaní v trupu shader a čtení v doméně shader. float[2|3|4]
SV_VertexID Identifikátor vrcholu automaticky vygenerovaný modulem runtime (viz Použití hodnot System-Generated (Direct3D 10)). K dispozici jako vstup pouze pro shader vrcholů. uint
SV_ViewportArrayIndex Index pole oblasti zobrazení Použitý u výstupu shaderu geometrie a označuje, který výřez zobrazení se má použít pro primitivní aktuálně napsaný. Shader pixelů může číst. Primitiva bude transformována a oříznuta proti výřezu určeného indexem před jeho předáním rasterizátoru. Tato sémantická se vztahuje pouze na primitivy; pokud má primitiv více než jeden vrchol, použije se hodnota z počátečního vrcholu.
Pokud D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer je true, pak SV_ViewportArrayIndex se použije na jakýkoli shader, který rasterizátor dodává.
uint
SV_ShadingRate Definuje, prostřednictvím rychlosti stínování hodnot, počet pixelů zapsaných jedním pixelem shader pro proměnná rychlost stínování vrstvy 2 nebo vyšší zařízení. Lze číst z shaderu pixelů. Lze napsat z vrcholu nebo shaderu geometrie. uint

Omezení při psaní SV_Depth:

  • Při vícevzorkování (MultisampleEnable je TRUE v D3D10_RASTERIZER_DESC) a zápis hloubkové hodnoty (pomocí pixel shader), jedna hodnota se také používá v hloubkového testu; takže možnost vykreslovat primitivní hrany při vyšším rozlišení se ztratí při vícevzorkování.
  • Při použití řízení dynamického toku není možné určit v době kompilace, zda shader, který zapisuje SV_Depth v některých cestách, bude zaručeno zápis SV_Depth při každém spuštění. Selhání zápisu SV_Depth při deklarovaných výsledcích nedefinovaného chování (které může nebo nemusí zahrnovat zahození pixelu).
  • Všechny hodnoty float32 včetně +/-INF a NaN je možné zapsat do SV_Depth.
  • Zápis SV_Depth je stále platný při provádění duálního prolnutí barev zdroje.

Migrace z Direct3D 9 na Direct3D 10 a novější

Při migraci kódu z Direct3D 9 na Direct3D 10 a novější byste měli zvážit následující problémy:

Mapování na sémantiku Direct3D 9

Několik z direct3D 10 a novějších sémantiky mapuje přímo na sémantiku Direct3D 9.

Sémantika Direct3D 10 Sémantická sémantika Direct3D 9
SV_Depth HLOUBKA
SV_Position POSTAVENÍ
SV_Target BARVA

[!] Poznámka pro vývojáře Direct3D 9: U cílů Direct3D 9 musí sémantika shaderu mapovat na platnou sémantiku Direct3D 9. Pro zpětnou kompatibilitu fxC považuje POSITION0 (a jeho názvy variant) za SV_Position. FXC považuje funkci COLOR za SV_TARGET. DXC a novější kompilátory považují FUNKCI POSITION[n] a COLOR za sémantiku definovanou uživatelem.

Direct3D 9 VPOS a Direct3D 10 SV_Position

Sémantická SV_Position D3D10 poskytuje podobné funkce jako sémantický model shaderu Direct3D 9 3 VPOS. Například v Direct3D 9 se pro shader pixelů používá následující syntaxe pomocí souřadnic místa na obrazovce:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

Pro podporu shaderu 3 byla přidána služba VPOS, aby bylo možné určit souřadnice prostoru obrazovky, protože sémantika POSITION byla určena pro souřadnice prostoru objektů.

V režimu Direct3D 10 a novějším určuje sémantický SV_Position (při použití v kontextu shaderu pixelů) souřadnice prostoru obrazovky (posun o 0,5). Proto by shader Direct3D 9 byl přibližně ekvivalentní (bez účtování posunu 0,5) k následujícímu:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Při migraci z Direct3D 9 na Direct3D 10 a novější budete muset při překladu shaderů vědět.

Roviny uživatelských klipů v HLSL

Počínaje Windows 8 můžete použít atribut kliprovek funkce v deklaraci funkce HLSL místo SV_ClipDistance, aby shader fungoval na úrovni funkcí 9_x i na úrovni funkce 10 a vyšší. Další informace najdete v tématu roviny uživatelských klipů na hardwarovémúrovně 9.