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.
K deklaraci proměnných HLSL použijte následující pravidla syntaxe.
[Storage_Class] [Type_Modifier] Název typu[Index] [: sémantická] [: Packoffset] [:]; [poznámky] [= Initial_Value]
Parametry
-
Storage_Class
-
Volitelné modifikátory třídy úložiště, které kompilátoru poskytují rady o rozsahu a životnosti proměnných; modifikátory lze zadat v libovolném pořadí.
Hodnota Popis extern Označit globální proměnnou jako externí vstup shaderu; toto je výchozí označení pro všechny globální proměnné. Nelze kombinovat se statickými . bezinterpolace Před předáním do shaderu pixelů ne interpolujte výstupy shaderu vrcholů. přesné Přesné klíčové slovo při použití na proměnnou omezí všechny výpočty použité k vytvoření hodnoty přiřazené této proměnné následujícími způsoby: - Samostatné operace jsou oddělené. Například když byla operace mula a přidání naplněna do šílené operace, přesné vynutí operace zůstat oddělené. Místo toho musíte explicitně použít šílenou vnitřní funkci.
- Pořadí operací se udržuje. Pokud bylo pořadí instrukcí pravděpodobně prohazováno za účelem zlepšení výkonu, přesné zajistí, že kompilátor zachová pořadí podle zápisu.
- Nebezpečné operace IEEE jsou omezené. Pokud kompilátor mohl používat rychlé matematické operace, které nezohlední hodnoty NaN (ne číslo) a INF (nekonečné), přesné vynutí dodržování požadavků IEEE IEEE týkajících se hodnot NaN a INF. Bez přesnýchnejsou tyto optimalizace a matematické operace bezpečné pro IEEE.
- Kvalifikace proměnné přesnou neprovádí operace, které používají proměnnou přesné. Vzhledem k tomu, že přesná šíří pouze operace, které přispívají k hodnotám přiřazeným přesnékvalifikované proměnné, může být správné provádění požadovaných výpočtů přesných, takže doporučujeme označit výstupy shaderu přesné přímo tam, kde je deklarujete, ať už je to v poli struktury, nebo u výstupního parametru nebo návratového typu vstupní funkce. Schopnost řídit optimalizace tímto způsobem udržuje invarianci výsledků pro upravenou výstupní proměnnou zakázáním optimalizací, které by mohly ovlivnit konečné výsledky kvůli rozdílům v kumulovaných rozdílech přesnosti. To je užitečné, když chcete, aby shadery pro tessellation zachovaly švy vodotěsných patchů nebo odpovídaly hodnotám hloubky více průchodů.
vzorový kód:
HLSLmatrix g_mWorldViewProjection;
void main(in float3 InPos: Position, out precise float4 OutPos : SV_Position)
{
operace je přesná, protože přispívá k přesnému parametru OutPos.
OutPos = mul( float4( InPos; 1,0 ), g_mWorldViewProjection );
}
sdílené Označení proměnné pro sdílení mezi efekty; to je nápověda kompilátoru. seskupené Označí proměnnou pro sdílenou paměť ve skupině vláken pro výpočetní shadery. V D3D10 je maximální celková velikost všech proměnných s třídou úložiště se sdílenou skupinou 16 kB, v D3D11 je maximální velikost 32 kB. Podívejte se na příklady. statické Označte místní proměnnou tak, aby byla inicializována jednou a trvala mezi voláními funkce. Pokud deklarace neobsahuje inicializátor, hodnota je nastavena na nulu. Globální proměnná označená statickou není pro aplikaci viditelná. uniformní Označte proměnnou, jejíž data jsou v průběhu provádění shaderu konstantní (například barva materiálu ve shaderu vrcholu); globální proměnné se ve výchozím nastavení považují za jednotné. těkavých Označte proměnnou, která se často mění; to je nápověda kompilátoru. Tento modifikátor třídy úložiště se vztahuje pouze na místní proměnnou.
Poznámka: kompilátor HLSL v současné době ignoruje tento modifikátor třídy úložiště. -
Type_Modifier
-
Volitelný modifikátor typu proměnné.
Hodnota Popis const Označte proměnnou, kterou nelze změnit shaderem, proto je nutné ji inicializovat v deklaraci proměnné. Globální proměnné jsou ve výchozím nastavení považovány za const (potlačit toto chování zadáním příznaku /Gec kompilátoru). row_major Označte proměnnou, která ukládá čtyři komponenty do jednoho řádku, aby je bylo možné uložit do jediného konstantního registru. column_major Označte proměnnou, která ukládá 4 komponenty do jednoho sloupce pro optimalizaci maticové matematiky. Poznámka
Pokud nezadáte hodnotu modifikátoru typu, kompilátor jako výchozí hodnotu použije column_major.
-
typ
-
Libovolný typ HLSL uvedený v datových typech (DirectX HLSL).
-
Název[Index]
-
Řetězec ASCII, který jednoznačně identifikuje proměnnou shaderu. Chcete-li definovat volitelnou matici, použijte index pro velikost pole, což je kladné celé číslo = 1.
-
sémantické
-
Volitelné informace o použití parametrů, které kompilátor používá k propojení vstupů a výstupů shaderu. Existuje několik předdefinovaných sémantiky pro shadery vrcholů a pixelů. Kompilátor ignoruje sémantiku, pokud nejsou deklarovány v globální proměnné nebo parametr předaný do shaderu.
-
Packoffset
-
Volitelné klíčové slovo pro ruční balení shader konstant. Viz packoffset (DirectX HLSL).
-
Zaregistrovat
-
Volitelné klíčové slovo pro ruční přiřazení proměnné shaderu k určitému registru. Viz registrace (DirectX HLSL).
-
poznámek
-
Volitelná metadata ve formě řetězce připojeného k globální proměnné. Poznámka je používána architekturou efektu a ignorována HLSL; chcete-li zobrazit podrobnější syntaxi, viz syntaxe poznámek.
-
Initial_Value
-
Volitelné počáteční hodnoty; počet hodnot by měl odpovídat počtu součástí v Typ. Každá globální proměnná označená extern musí být inicializována hodnotou literálu; každá proměnná označená statickými musí být inicializována konstantou.
Globální proměnné, které nejsou označené statickými nebo extern nejsou kompilovány do shaderu. Kompilátor nenastavuje automaticky výchozí hodnoty globálních proměnných a nemůže je použít v optimalizacích. Chcete-li inicializovat tento typ globální proměnné, použijte reflexi k získání jeho hodnoty a pak zkopírujte hodnotu do konstantní vyrovnávací paměti. Můžete například použít metodu ID3D11ShaderReflection::GetVariableByName získat proměnnou pomocí metody ID3D11ShaderReflectionVariable::GetDesc popis shader-variable a získat počáteční hodnotu z DefaultValue člen struktury D3D11_SHADER_VARIABLE_DESC. Chcete-li zkopírovat hodnotu do konstantní vyrovnávací paměti, musíte zajistit, aby vyrovnávací paměť byla vytvořena s přístupem pro zápis procesoru (D3D11_CPU_ACCESS_WRITE). Další informace o tom, jak vytvořit konstantní vyrovnávací paměť, naleznete v tématu Postupy: Vytvoření konstantní vyrovnávací paměti.
Architekturu efektů můžete použít také k automatickému zpracování odrazu a nastavení počáteční hodnoty. Můžete například použít metodu ID3DX11EffectPass::Apply.
Důležitý
Podpora této funkce byla odebrána v Direct3D 12, včetně možnosti odrážet výchozí inicializátory.
Příklady
Tady je několik příkladů deklarací shaderu proměnných.
float fVar;
float4 color;
int iVar[3];
uniform float4 position : SV_POSITION;
//Default initializers; supported up to Direct3D 11.
float fVar = 3.1f;
int iVar[3] = {1,2,3};
const float4 lightDirection = {0,0,1};
Sdílená skupina
HLSL umožňuje vláknům výpočetního shaderu vyměňovat hodnoty prostřednictvím sdílené paměti. HLSL poskytuje bariérové primitivy, jako je GroupMemoryBarrierWithGroupSyncatd., aby se zajistilo správné pořadí čtení a zápisů do sdílené paměti v shaderu a zabránění rasám dat.
Poznámka
Hardware spouští vlákna ve skupinách (warps nebo vlnové fronty) a synchronizaci bariér je někdy možné vynechat, aby se zvýšil výkon, pokud je správná pouze synchronizace vláken, která patří do stejné skupiny. Toto vynechání však důrazně nedoporučujeme z těchto důvodů:
- Výsledkem tohoto vynechání je nepřenosných kódů, které nemusí fungovat na určitém hardwaru a nefungují na softwarových rasterizátorech, které obvykle spouštějí vlákna v menších skupinách.
- Vylepšení výkonu, které můžete dosáhnout s tímto vynecháním, budou menší než při použití bariéry typu all-thread.
V Direct3D 10 neexistuje žádná synchronizace vláken při zápisu do seskupené, takže to znamená, že každé vlákno je omezeno na jedno umístění v poli pro zápis. Při zápisu použijte systémovou hodnotu SV_GroupIndex k indexování do tohoto pole, aby nedošlo ke kolidování dvou vláken. Z hlediska čtení mají všechna vlákna přístup k celému poli pro čtení.
struct GSData
{
float4 Color;
float Factor;
}
groupshared GSData data[5*5*1];
[numthreads(5,5,1)]
void main( uint index : SV_GroupIndex )
{
data[index].Color = (float4)0;
data[index].Factor = 2.0f;
GroupMemoryBarrierWithGroupSync();
...
}
Balení
Zabalit podkomponenty vektorů a skalárů, jejichž velikost je dostatečně velká, aby se zabránilo překročení hranice registru. Toto jsou například všechny platné:
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}
Nemůžu kombinovat typy balení.
Stejně jako klíčové slovo pro registraci může být balíčekoffset určený pro konkrétní cíl. Dílčí balení je k dispozici pouze s klíčovým slovem packoffset, nikoli klíčovým slovem registru. Uvnitř deklarace cbuffer se klíčové slovo registru ignoruje pro cíle Direct3D 10, protože se předpokládá, že jde o kompatibilitu mezi platformami.
Zabalené prvky se mohou překrývat a kompilátor nezobrazí žádnou chybu nebo upozornění. V tomto příkladu se Element2 a Element3 překrývají s Element1.x a Element1.y.
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c0);
float1 Element3 : packoffset(c0.y);
}
Ukázka, která používá packoffset je: HLSLWithoutFX10 Sample.