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: |
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.
- mapování na sémantiku Direct3D 9
- Direct3D 9 VPOS a Direct3D 10 SV_Position
- roviny uživatelských klipů v HLSL
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.