Common-Shader Core
I Shader Model 4 implementerar alla skuggningssteg samma basfunktioner med hjälp av en gemensam skuggningskärna. Dessutom erbjuder var och en av de tre skuggningsstegen (hörn, geometri och pixel) funktioner som är unika för varje steg, till exempel möjligheten att generera nya primitiver från geometriskuggningssteget eller att ta bort en specifik pixel i pixelskuggningssteget. Följande diagram visar hur data flödar genom en skuggningsfas och relationen mellan den gemensamma skuggningskärnan och skuggningsminnesresurser.
- Indata: En hörnskuggning tar emot sina indata från indatamonterarens fas; geometri- och pixelskuggare får sina indata från föregående skuggningssteg. Ytterligare indata inkluderar systemvärdessemantik, som kan användas av den första enheten i pipelinen som de är tillämpliga på.
- Utdata: Skuggningar genererar utdataresultat som skickas till efterföljande steg i pipelinen. För en geometriskuggning kan mängden datautdata från ett enda anrop variera. Vissa utdata tolkas av common-shader core (till exempel hörnposition och render-target-array index), andra är utformade för att tolkas av ett program.
- Shader Code: Skuggningar kan läsa från minnet, utföra vektor flyttals- och heltalsaritmetiska åtgärder eller flödeskontrollåtgärder. Det finns ingen gräns för antalet instruktioner som kan implementeras i en skuggning.
- Samplers: Samplers definierar hur du samplar och filtrerar texturer. Så många som 16 provtagare kan bindas till en skuggning samtidigt.
- Texturer: Texturer kan filtreras med hjälp av samplers eller läsas per texel direkt med belastning inbyggd funktion.
- buffertar: Buffertar filtreras aldrig, men kan läsas från minnet per element direkt med inläsning inbyggd funktion. Så många som 128 struktur- och buffertresurser (kombinerade) kan bindas till en skuggning samtidigt.
- Konstantbuffertar: Konstantbuffertar är optimerade för skuggningsvariabler. Så många som 16 konstanta buffertar kan bindas till en skuggningsfas samtidigt. De är utformade för mer frekventa uppdateringar från processorn. Därför har de ytterligare storleks-, layout- och åtkomstbegränsningar.
Skillnader mellan Direct3D 9 och Direct3D 10:
- I Direct3D 9 hade varje skuggningsenhet en enda, liten konstant registerfil för att lagra alla konstanta skuggvariabler. Att ta emot alla skuggor med detta begränsade konstanta utrymme krävde frekvent återanvändning av konstanter av processorn.
- I Direct3D 10 lagras konstanter i oföränderliga buffertar i minnet och hanteras som alla andra resurser. Det finns ingen gräns för antalet konstanta buffertar som ett program kan skapa. Genom att ordna konstanter i buffertar efter uppdaterings- och användningsfrekvens kan mängden bandbredd som krävs för att uppdatera konstanter för att rymma alla skuggningar minskas avsevärt.
Heltal och Bitwise-stöd
Den vanliga skuggningskärnan innehåller en fullständig uppsättning IEEE-kompatibla 32-bitars heltal och bitvis-åtgärder. Dessa åtgärder möjliggör en ny klass av algoritmer i exempel på grafikmaskinvara, inklusive komprimerings- och förpackningstekniker, FFT och bitfield-programflödeskontroll.
int och uint datatyper i Direct3D 10 HLSL mappas till 32-bitars heltal i maskinvara.
Skillnader mellan Direct3D 9 och Direct3D 10: I Direct3D 9 tolkades indata som markerats som heltal i HLSL som flyttals. I Direct3D 10 tolkas strömindata som markerats som heltal som ett 32-bitars heltal. Dessutom är booleska värden nu alla bitar inställda eller alla bitar tas bort. Data som konverteras till bool- tolkas som sanna om värdet inte är lika med 0,0f (både positiv och negativ noll tillåts vara false) och annars falskt. |
Bitvis operatorer
Den vanliga skuggningskärnan stöder följande bitvis-operatorer:
Operatör | Funktion |
---|---|
~ | Logiskt inte |
<< | Vänster skift |
>> | Höger skift |
& | Logiska och |
| | Logisk eller |
^ | Logisk Xor |
<<= | Lika med vänster skift |
>>= | Höger skift är lika med |
&= | Och lika med |
|= | Eller lika med |
^= | Xor Lika med |
Bitvis-operatorer definieras endast för att fungera på int och uint datatyper. Om du försöker använda bitvis operatorer på flyttal eller struct datatyper resulterar det i ett fel. Bitvis-operatorer har samma prioritet som C när det gäller andra operatorer.
Binärt kast
Gjutning mellan ett heltal och en flyttalstyp konverterar det numeriska värdet enligt C-trunkeringsregler. Att omvandla ett värde från en flyttal, till en int, och tillbaka till en flyttal är en förlustkonvertering beroende på måldatatypens precision. Här är några av konverteringsfunktionerna: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).
Binära kast kan också utföras med hjälp av HLSL-inbyggda funktioner. Dessa gör att kompilatorn omtolkar bitrepresentationen av ett tal till måldatatypen.