Common-Shader Core
In Shader Model 4 tutte le fasi shader implementano la stessa funzionalità di base usando un core common-shader. Inoltre, ognuna delle tre fasi shader (vertice, geometria e pixel) offre funzionalità univoche per ogni fase, ad esempio la possibilità di generare nuove primitive dalla fase geometry shader o di eliminare un pixel specifico nella fase pixel shader. Il diagramma seguente illustra come i dati passano attraverso una fase shader e la relazione del core common-shader con le risorse di memoria shader.
- Dati di input: un vertex shader riceve gli input dalla fase dell'assembler di input; geometry e pixel shader ricevono gli input dalla fase precedente dello shader. Gli input aggiuntivi includono semantica del valore di sistema, che sono consumabili dalla prima unità nella pipeline a cui sono applicabili.
- Dati di output: gli shader generano risultati di output da passare alla fase successiva nella pipeline. Per uno shader geometry, la quantità di dati di output da una singola chiamata può variare. Alcuni output vengono interpretati dal core common-shader (ad esempio la posizione del vertice e l'indice di matrice di destinazione di rendering), altri sono progettati per essere interpretati da un'applicazione.
- Codice shader: gli shader possono leggere dalla memoria, eseguire operazioni aritmetice aritmetiche vettoriali e operazioni di controllo del flusso. Non esiste alcun limite al numero di istruzioni che possono essere implementate in uno shader.
- Esempi: gli esempi definiscono come eseguire l'esempio e filtrare le trame. Più di 16 campioni possono essere associati contemporaneamente a uno shader.
- Trame: le trame possono essere filtrate usando esempi o lette direttamente con la funzione intrinseca del carico .
- Buffer: i buffer non vengono mai filtrati, ma possono essere letti dalla memoria in base a ogni elemento direttamente con la funzione intrinseca del carico. Fino a 128 trame e risorse buffer (combinate) possono essere associate contemporaneamente a uno shader.
- Buffer costanti: i buffer costanti sono ottimizzati per le variabili costanti shader. Fino a 16 buffer costanti può essere associato contemporaneamente a una fase shader. Sono progettati per un aggiornamento più frequente dalla CPU; pertanto, hanno dimensioni, layout e restrizioni di accesso aggiuntive.
Differenze tra Direct3D 9 e Direct3D 10:
- In Direct3D 9 ogni unità shader aveva un singolo file di registrazione costante di piccole dimensioni per archiviare tutte le variabili di shader costanti. Accodamento di tutti gli shader con questo spazio costante limitato richiedeva il riciclo frequente di costanti dalla CPU.
- In Direct3D 10 le costanti vengono archiviate in buffer non modificabili in memoria e vengono gestite come qualsiasi altra risorsa. Non esiste alcun limite al numero di buffer costanti che un'applicazione può creare. Organizzando costanti in buffer per frequenza di aggiornamento e utilizzo, la quantità di larghezza di banda necessaria per aggiornare le costanti per contenere tutti gli shader può essere notevolmente ridotta.
Supporto intero e bit per bit
Il core common shader offre un set completo di operazioni integer a 32 bit conformi a IEEE e bit per bit. Queste operazioni consentono una nuova classe di algoritmi negli esempi hardware grafici includono tecniche di compressione e compressione, FFT e controllo del flusso di programma bitfield.
I tipi di dati int e uint in Direct3D 10 HLSL vengono mappati a interi a 32 bit nell'hardware.
Differenze tra Direct3D 9 e Direct3D 10: Negli input di flusso Direct3D 9 contrassegnati come integer in HLSL sono stati interpretati come virgola mobile. In Direct3D 10, gli input di flusso contrassegnati come integer vengono interpretati come intero a 32 bit. Inoltre, i valori booleani sono ora tutti i bit impostati o tutti i bit unset. I dati convertiti in bool verranno interpretati come true se il valore non è uguale a 0,0f (sia positivo che zero negativo) e false in caso contrario. |
Operatori bit per bit
Il core common shader supporta gli operatori bit per bit seguenti:
Operatore | Funzione |
---|---|
~ | NOT logico |
<< | Maiusc a sinistra |
>> | Maiuscole a destra |
& | And logico |
| | Esegue un'operazione di Or logico. |
^ | Xor logico |
<<= | Maiusc a sinistra Uguale |
>>= | Maiusc destro uguale |
&= | E uguale |
|= | O uguale |
^= | Xor Uguale |
Gli operatori bit per bit sono definiti per funzionare solo sui tipi di dati int e uint . Il tentativo di usare operatori bit per bit nei tipi di dati float o struct genererà un errore. Gli operatori bit per bit seguono la stessa precedenza di C rispetto ad altri operatori.
Cast binari
Il cast tra un intero e un tipo a virgola mobile convertirà il valore numerico seguente alle regole di troncamento C. Eseguire il cast di un valore da un oggetto float a un int e tornare a un float è una conversione di perdita dipendente dalla precisione del tipo di dati di destinazione. Ecco alcune delle funzioni di conversione: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).
I cast binari possono essere eseguiti anche usando funzioni intrinseche HLSL. In questo modo il compilatore reinterpreta la rappresentazione bit di un numero nel tipo di dati di destinazione.