Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Använd följande syntaxregler för att deklarera HLSL-variabler.
[Storage_Class] [Type_Modifier] Type Name[Index] [: Semantic] [: Packoffset] [: Register]; [Anteckningar] [= Initial_Value]
Parametrar
-
Storage_Class
-
Valfria lagringsklassmodifierare som ger kompilatorn tips om variabelomfång och livslängd. modifierarna kan anges i valfri ordning.
Värde Beskrivning extern Markera en global variabel som en extern indata till skuggningen. detta är standardmarkeringen för alla globala variabler. Det går inte att kombinera med statiska. ingeninterpolering Interpolera inte utdata från en hörnskuggning innan du skickar dem till en pixelskuggare. exakt Det exakta nyckelordet när det tillämpas på en variabel begränsar alla beräkningar som används för att generera värdet som tilldelats variabeln på följande sätt: - Separata åtgärder hålls separata. Om en mul- och tilläggsåtgärd till exempel kan ha smälts samman till en galen åtgärd, exakt tvingar åtgärderna att förbli separata. I stället måste du uttryckligen använda den galna inbyggda funktionen.
- Ordningen på åtgärder behålls. Om instruktionernas ordning kan ha blandats för att förbättra prestandan ser exakta till att kompilatorn bevarar ordningen som skriven.
- IEEE-osäkra åtgärder är begränsade. Om kompilatorn kan ha använt snabba matematiska åtgärder som inte tar hänsyn till värden för NaN (inte ett tal) och INF (oändligt), exakta tvingar IEEE-krav för NaN- och INF-värden att respekteras. Utan exaktaär dessa optimeringar och matematiska åtgärder inte IEEE-säkra.
- Att kvalificera en variabel exakt gör inte åtgärder som använder variabeln exakt. Eftersom exakta endast sprids till åtgärder som bidrar till de värden som tilldelas till den exakta-kvalificerade variabeln, kan det vara svårt att korrekt göra önskade beräkningar exakta, så vi rekommenderar att du markerar skuggningsutdata exakt direkt där du deklarerar dem, oavsett om det är på ett strukturfält, eller på en utdataparameter eller returtypen för postfunktionen. Möjligheten att styra optimeringar på det här sättet bibehåller resultatvariabeln för den ändrade utdatavariabeln genom att inaktivera optimeringar som kan påverka slutresultatet på grund av skillnader i ackumulerade precisionsskillnader. Det är användbart när du vill att skuggningar för tessellation ska underhålla vattentäta patchsömmar eller matcha djupvärden över flera pass.
Exempelkod:
HLSLmatrix g_mWorldViewProjection;
void main(in float3 InPos : Position, ut exakt float4 OutPos : SV_Position)
{
åtgärden är exakt eftersom den bidrar till den exakta parametern OutPos
OutPos = mul( float4( InPos, 1.0 ), g_mWorldViewProjection );
}
delade Markera en variabel för delning mellan effekter. Detta är ett tips till kompilatorn. grupperade Markera en variabel för trådgruppsdelade minne för beräkningsskuggare. I D3D10 är den maximala totala storleken för alla variabler med den grupperade lagringsklassen 16kb, i D3D11 är den maximala storleken 32 kB. Se exempel. statisk Markera en lokal variabel så att den initieras en gång och bevaras mellan funktionsanrop. Om deklarationen inte innehåller någon initiering anges värdet till noll. En global variabel markerad statisk är inte synlig för ett program. enhetlig Markera en variabel vars data är konstanta under körningen av en skuggning (till exempel en materialfärg i en hörnskuggning); globala variabler anses som standard enhetliga. instabila Markera en variabel som ändras ofta. Detta är ett tips till kompilatorn. Den här lagringsklassmodifieraren gäller endast för en lokal variabel.
Obs! HLSL-kompilatorn ignorerar för närvarande den här lagringsklassmodifieraren. -
Type_Modifier
-
Valfri modifierare av variabeltyp.
Värde Beskrivning Markera en variabel som inte kan ändras av en skuggning. Därför måste den initieras i variabeldeklarationen. Globala variabler anses nackdelar som standard (undertryck det här beteendet genom att ange flaggan /Gec till kompilatorn). row_major Markera en variabel som lagrar fyra komponenter i en enda rad så att de kan lagras i ett enda konstant register. column_major Markera en variabel som lagrar 4 komponenter i en enda kolumn för att optimera matrismatematik. Not
Om du inte anger ett typmodifierarvärde använder kompilatorn column_major som standardvärde.
-
typ
-
Alla HLSL-typer som anges i datatyper (DirectX HLSL).
-
Namn[Index]
-
ASCII-sträng som unikt identifierar en skuggningsvariabel. Om du vill definiera en valfri matris använder du index för matrisstorleken, vilket är ett positivt heltal = 1.
-
semantisk
-
Valfri information om parameteranvändning som används av kompilatorn för att länka skuggningsindata och utdata. Det finns flera fördefinierade semantik för hörn och pixelskuggar. Kompilatorn ignorerar semantik om de inte deklareras för en global variabel eller en parameter som skickas till en skuggning.
-
Packoffset
-
Valfritt nyckelord för att manuellt packa skuggningskonstanter. Se packoffset (DirectX HLSL).
-
Registrera
-
Valfritt nyckelord för att manuellt tilldela en skuggningsvariabel till ett visst register. Se register (DirectX HLSL).
-
anteckningar
-
Valfria metadata, i form av en sträng, kopplade till en global variabel. En anteckning används av effektramverket och ignoreras av HLSL. Mer detaljerad syntax finns i anteckningssyntax.
-
Initial_Value
-
Valfria initiala värden; antalet värden ska matcha antalet komponenter i typ. Varje global variabel som är markerad extern måste initieras med ett literalvärde. varje variabel som är markerad statisk måste initieras med en konstant.
Globala variabler som inte är markerade statiska eller externa kompileras inte till skuggningen. Kompilatorn anger inte automatiskt standardvärden för globala variabler och kan inte använda dem i optimeringar. Om du vill initiera den här typen av global variabel använder du reflektion för att hämta dess värde och kopierar sedan värdet till en konstant buffert. Du kan till exempel använda metoden ID3D11ShaderReflection::GetVariableByName för att hämta variabeln, använda metoden ID3D11ShaderReflectionVariable::GetDesc-metoden för att hämta beskrivningen av skuggningsvariabeln och hämta det ursprungliga värdet från DefaultValue medlem i D3D11_SHADER_VARIABLE_DESC struktur. Om du vill kopiera värdet till konstantbufferten måste du se till att bufferten har skapats med cpu-skrivåtkomst (D3D11_CPU_ACCESS_WRITE). Mer information om hur du skapar en konstant buffert finns i How to: Create a Constant Buffer.
Du kan också använda ramverket för effekter för att automatiskt bearbeta reflekterande och ange det ursprungliga värdet. Du kan till exempel använda metoden ID3DX11EffectPass::Apply.
Viktig
Stöd för den här funktionen har tagits bort i Direct3D 12, inklusive möjligheten att återspegla standardinitierare.
Exempel
Här är flera exempel på skuggningsvariabeldeklarationer.
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};
Gruppdelad
HLSL gör det möjligt för trådar i en beräkningsskuggare att utbyta värden via delat minne. HLSL tillhandahåller barriärpri primitiver som GroupMemoryBarrierWithGroupSyncoch så vidare för att säkerställa rätt ordning på läsningar och skrivningar till delat minne i skuggningen och för att undvika dataraser.
Not
Maskinvara kör trådar i grupper (warps eller vågfronter) och barriärsynkronisering kan ibland utelämnas för att öka prestanda när endast synkronisering av trådar som tillhör samma grupp är korrekt. Men vi avråder starkt från detta utelämnande av följande skäl:
- Den här utelämnandet resulterar i icke-portabel kod, vilket kanske inte fungerar på viss maskinvara och inte fungerar på rastrering av programvara som vanligtvis kör trådar i mindre grupper.
- De prestandaförbättringar som du kan uppnå med den här utelämnandet är mindre jämfört med att använda all-thread-barriären.
I Direct3D 10 sker ingen synkronisering av trådar när du skriver till grupperdelade, så det innebär att varje tråd är begränsad till en enda plats i en matris för skrivning. Använd SV_GroupIndex-systemvärdet för att indexera i den här matrisen när du skriver för att säkerställa att inga två trådar kan kollidera. När det gäller läsning har alla trådar åtkomst till hela matrisen för läsning.
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();
...
}
Packning
Paketunderkomponenter för vektorer och skalär vars storlek är tillräckligt stor för att förhindra att registergränserna korsas. Alla dessa är till exempel giltiga:
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}
Det går inte att blanda förpackningstyper.
Precis som nyckelordet registrera kan en packoffset vara målspecifik. Underkomponent-packning är endast tillgängligt med nyckelordet packoffset, inte nyckelordet register. I en cbuffer-deklaration ignoreras nyckelordet register för Direct3D 10-mål eftersom det antas vara för plattformsoberoende kompatibilitet.
Packade element kan överlappa varandra och kompilatorn ger inga fel eller varningar. I det här exemplet överlappar Element2 och Element3 Element1.x och Element1.y.
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c0);
float1 Element3 : packoffset(c0.y);
}
Ett exempel som använder packoffset är: HLSLWithoutFX10 Sample.